Помогите пожалуйста
Внешняя обработка выполняется программно. Но необходимо не открыть форму, а выполнить процедуру в модуле объекта внешней обработки
Есть код который запускает на выполнение открытие формы
&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)
Возврат ВнешниеОбработки.Подключить(АдресХранилища);
КонецФункции
&НаСервере
Функция ПодключитьВнешнийОтчет(АдресХранилища)
Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
КонецФункции
&НаКлиенте
Процедура дзФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; ВыбСтрока=Элемент.ТекущиеДанные;
Если НЕ ВыбСтрока.ЭтоГруппа Тогда
АдресХранилища = "";
Если ВыбСтрока.Расширение = ".epf" Тогда
Рез=ПоместитьФайл(АдресХранилища,ВыбСтрока.ПолноеИмя, ,Ложь);
ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма");
ИначеЕсли ВыбраннаяСтрока.Расширение = ".erf" Тогда
Рез=ПоместитьФайл(АдресХранилища,ВыбСтрока.ПолноеИмя, ,Ложь);
ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
ОткрытьФорму("ВнешнийОтчет."+ИмяОбработки+".Форма");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
А как вместо ОткрытьФорму обратиться к реквизитам и выполнить процедуру
Если НЕ ВнешнийОтчетОбработка.Метаданные().Реквизиты.Найти("ДополнительныеПараметры") = Неопределено Тогда
ВнешнийОтчетОбработка.ДополнительныеПараметры = ДополнительныеПараметры;
КонецЕсли;
ТабличныйДокументРезультат = ВнешнийОтчетОбработка.Инициализировать();
Внешняя обработка выполняется программно. Но необходимо не открыть форму, а выполнить процедуру в модуле объекта внешней обработки
Есть код который запускает на выполнение открытие формы
&НаСервере
Функция ПодключитьВнешнююОбработку(АдресХранилища)
Возврат ВнешниеОбработки.Подключить(АдресХранилища);
КонецФункции
&НаСервере
Функция ПодключитьВнешнийОтчет(АдресХранилища)
Возврат ВнешниеОтчеты.Подключить(АдресХранилища);
КонецФункции
&НаКлиенте
Процедура дзФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; ВыбСтрока=Элемент.ТекущиеДанные;
Если НЕ ВыбСтрока.ЭтоГруппа Тогда
АдресХранилища = "";
Если ВыбСтрока.Расширение = ".epf" Тогда
Рез=ПоместитьФайл(АдресХранилища,ВыбСтрока.ПолноеИмя, ,Ложь);
ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
ОткрытьФорму("ВнешняяОбработка."+ИмяОбработки+".Форма");
ИначеЕсли ВыбраннаяСтрока.Расширение = ".erf" Тогда
Рез=ПоместитьФайл(АдресХранилища,ВыбСтрока.ПолноеИмя, ,Ложь);
ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
ОткрытьФорму("ВнешнийОтчет."+ИмяОбработки+".Форма");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
А как вместо ОткрытьФорму обратиться к реквизитам и выполнить процедуру
Если НЕ ВнешнийОтчетОбработка.Метаданные().Реквизиты.Найти("ДополнительныеПараметры") = Неопределено Тогда
ВнешнийОтчетОбработка.ДополнительныеПараметры = ДополнительныеПараметры;
КонецЕсли;
ТабличныйДокументРезультат = ВнешнийОтчетОбработка.Инициализировать();
По теме из базы знаний
- Пример формирования внешнего отчета программно и в фоновом режиме
- Выполнение внешней обработки по расписанию для управляемого и обычного приложения
- Универсальная отладка внешней обработки заполнения (типовые механизмы, без внешних файлов, расширений или вызова внешних файлов)
- Улучшайзер - как одна внешняя обработка может улучшать другие внешние обработки
- Работа с внешними обработками на управляемых формах
Найденные решения
Работает с такой реализацией
СтрокаСпискаОтчетов содержит полный путь к файлу внешнего отчета и расширение
СтрокаСпискаОтчетов содержит полный путь к файлу внешнего отчета и расширение
&НаКлиенте
.......
АдресХранилища = "";
Если СтрокаСпискаОтчетов.Расширение = ".epf" Тогда
Рез=ПоместитьФайл(АдресХранилища,СтрокаСпискаОтчетов.ПолноеИмяФайлаВнешнейОбработки, ,Ложь);
ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
ИначеЕсли СтрокаСпискаОтчетов.Расширение = ".erf" Тогда
Рез=ПоместитьФайл(АдресХранилища,СтрокаСпискаОтчетов.ПолноеИмяФайлаВнешнейОбработки, ,Ложь);
ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
КонецЕсли;
ТабДок = ВнешняяОбработкаНаСервере(СтрокаСпискаОтчетов.Расширение,ИмяОбработки) ;
.........
&НаСервере
Функция ВнешняяОбработкаНаСервере(СтрокаСпискаОтчетовРасширение,ИмяОбработки)
ИмяТипа = "ОписаниеЗащитыОтОпасныхДействий";
ОписаниеЗащиты = Новый(ИмяТипа);
ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
Если СтрокаСпискаОтчетовРасширение = ".epf" Тогда
ВнешнийОтчетОбработка = ВнешниеОбработки.Создать(ИмяОбработки, Ложь, ОписаниеЗащиты);
Иначе
ВнешнийОтчетОбработка = ВнешниеОтчеты.Создать(ИмяОбработки, Ложь, ОписаниеЗащиты);
КонецЕсли;
ТабличныйДокументРезультат = ВнешнийОтчетОбработка.Инициализировать();
.........
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) вызови моддуль менеджера внешних обработок. И посмотри что там по имени обработки есть.
Если обработка будет, то и далее экспортный метод можно использовать. Иначе переписывать.
А вообще зачем такое извращение делать? Напишите внешнюю обработку, которая сама этот код выполнит!
Если обработка будет, то и далее экспортный метод можно использовать. Иначе переписывать.
А вообще зачем такое извращение делать? Напишите внешнюю обработку, которая сама этот код выполнит!
(6) Если из внешки вы пытаетесь вызвать другую внешку, то вполне себе будет мешать. Настраивайте профили безопасности или уберите галку у пользователя "Защита от опасных действий".
Либо через БСП
Либо
Либо через БСП
Синтаксис
Функция ТипКомандыСценарийВБезопасномРежиме() Экспорт
Возвращаемое значение
// ТаблицаЗначений - Подробнее см. ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.НовыйСценарий().
//
Функция СформироватьСценарий(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Сценарий = ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.НовыйСценарий();
// Формирование сценария.
Возврат Сценарий;
КонецФункции
Строка - имя типа команд по сценарному выполнению в безопасном режиме.
Пример вызова
Результат = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыСценарийВБезопасномРежиме()
ПоказатьФункция ТипКомандыСценарийВБезопасномРежиме() Экспорт
Возвращаемое значение
// ТаблицаЗначений - Подробнее см. ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.НовыйСценарий().
//
Функция СформироватьСценарий(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Сценарий = ДополнительныеОтчетыИОбработкиВБезопасномРежимеИнтерфейс.НовыйСценарий();
// Формирование сценария.
Возврат Сценарий;
КонецФункции
Строка - имя типа команд по сценарному выполнению в безопасном режиме.
Пример вызова
Результат = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыСценарийВБезопасномРежиме()
Либо
Синтаксис:
УстановитьБезопасныйРежим(<БезопасныйРежим>)
Параметры:
<БезопасныйРежим> (обязательный)
Тип: Булево, Строка.
Определяет, будет ли включен безопасный режим:
Строка - имя профиля безопасности. Включить режим и назначить профиль безопасности. Может быть использовано имя только того профиля, у которого свойство SafeModeProfile установлено в значение Истина. Если безопасный режим уже включен, то повторный вызов метода с именем другого профиля не изменит текущий профиль безопасности;
Истина - включить режим без указания конкретного профиля безопасности;
Ложь - выключить режим.
Строка - имя профиля безопасности. Включить режим и назначить профиль безопасности. Может быть использовано имя только того профиля, у которого свойство SafeModeProfile установлено в значение Истина. Если безопасный режим уже включен, то повторный вызов метода с именем другого профиля не изменит текущий профиль безопасности;
Истина - включить режим без указания конкретного профиля безопасности;
Ложь - выключить режим.
УстановитьБезопасныйРежим(<БезопасныйРежим>)
Параметры:
<БезопасныйРежим> (обязательный)
Тип: Булево, Строка.
Определяет, будет ли включен безопасный режим:
Строка - имя профиля безопасности. Включить режим и назначить профиль безопасности. Может быть использовано имя только того профиля, у которого свойство SafeModeProfile установлено в значение Истина. Если безопасный режим уже включен, то повторный вызов метода с именем другого профиля не изменит текущий профиль безопасности;
Истина - включить режим без указания конкретного профиля безопасности;
Ложь - выключить режим.
Строка - имя профиля безопасности. Включить режим и назначить профиль безопасности. Может быть использовано имя только того профиля, у которого свойство SafeModeProfile установлено в значение Истина. Если безопасный режим уже включен, то повторный вызов метода с именем другого профиля не изменит текущий профиль безопасности;
Истина - включить режим без указания конкретного профиля безопасности;
Ложь - выключить режим.
(7)
Функция СведенияОВнешнейОбработке() Экспорт
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Наименование", "ПакетнаяВыгрузкаОтчетов");
РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
РегистрационныеДанные.Вставить("Вид", "ДополнительныйОтчет"); //ИЛИ ДополнительнаяОбработка
РегистрационныеДанные.Вставить("Версия", "1.0");
РегистрационныеДанные.Вставить("Информация", "ПакетнаяВыгрузкаОтчетов");
тзКоманд = Новый ТаблицаЗначений;
тзКоманд.Колонки.Добавить("Идентификатор");
тзКоманд.Колонки.Добавить("Представление");
тзКоманд.Колонки.Добавить("Модификатор");
тзКоманд.Колонки.Добавить("ПоказыватьОповещение");
тзКоманд.Колонки.Добавить("Использование");
строкаКоманды = тзКоманд.Добавить();
строкаКоманды.Идентификатор = "1";
строкаКоманды.Представление = "ПакетнаяВыгрузкаОтчетов";
строкаКоманды.ПоказыватьОповещение = Истина;
строкаКоманды.Использование = "ОткрытиеФормы";
РегистрационныеДанные.Вставить("Команды", тзКоманд);
Возврат РегистрационныеДанные;
КонецФункции
Функция СведенияОВнешнейОбработке() Экспорт
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Наименование", "ПакетнаяВыгрузкаОтчетов");
РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
РегистрационныеДанные.Вставить("Вид", "ДополнительныйОтчет"); //ИЛИ ДополнительнаяОбработка
РегистрационныеДанные.Вставить("Версия", "1.0");
РегистрационныеДанные.Вставить("Информация", "ПакетнаяВыгрузкаОтчетов");
тзКоманд = Новый ТаблицаЗначений;
тзКоманд.Колонки.Добавить("Идентификатор");
тзКоманд.Колонки.Добавить("Представление");
тзКоманд.Колонки.Добавить("Модификатор");
тзКоманд.Колонки.Добавить("ПоказыватьОповещение");
тзКоманд.Колонки.Добавить("Использование");
строкаКоманды = тзКоманд.Добавить();
строкаКоманды.Идентификатор = "1";
строкаКоманды.Представление = "ПакетнаяВыгрузкаОтчетов";
строкаКоманды.ПоказыватьОповещение = Истина;
строкаКоманды.Использование = "ОткрытиеФормы";
РегистрационныеДанные.Вставить("Команды", тзКоманд);
Возврат РегистрационныеДанные;
КонецФункции
(8) Вот у вас только ОткрытиеФормы
Добавьте еще команду ВызовСерверногоМетода и используйте ее для скрытого запуска
Вот пример
Добавьте еще команду ВызовСерверногоМетода и используйте ее для скрытого запуска
Вот пример
ДобавитьКоманду(ТаблицаКоманд,"Универсальная обработка документов (с авторегистрацией)","Открыть Обработку","ОткрытиеФормы",Истина,"Выполнить");
ДобавитьКоманду(ТаблицаКоманд,"КоммандаВыполнитьОбработку","КоммандаВыполнитьОбработку", "ВызовСерверногоМетода", Ложь,"Выполнить");
(10)
Вы сами проанализируйте всю полученную информацию...
Ну я же не сказал вам вставлять доп строки в первую обработку....
Добавьте туда , где не надо форму открывать , а вызываете серверные методы
т запуск из нее другой внешней обработки для подготовки табличного документа вызывает зат
Вы сами проанализируйте всю полученную информацию...
Ну я же не сказал вам вставлять доп строки в первую обработку....
Добавьте туда , где не надо форму открывать , а вызываете серверные методы
Обр = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Имя твоей обработки");
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = Обр.ХранилищеОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
ОписаниеЗащитыОтОпасныхДействий = Новый ОписаниеЗащитыОтОпасныхДействий;
ОписаниеЗащитыОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
Об = ВнешниеОбработки.Создать(ИмяФайла, Ложь, Новый ОписаниеЗащитыОтОпасныхДействий);
Об.ВыполнитьКоманду(ПараметрыОбработки); //экспортная процедура в модуле твоей обработки
Показать
Работает с такой реализацией
СтрокаСпискаОтчетов содержит полный путь к файлу внешнего отчета и расширение
СтрокаСпискаОтчетов содержит полный путь к файлу внешнего отчета и расширение
&НаКлиенте
.......
АдресХранилища = "";
Если СтрокаСпискаОтчетов.Расширение = ".epf" Тогда
Рез=ПоместитьФайл(АдресХранилища,СтрокаСпискаОтчетов.ПолноеИмяФайлаВнешнейОбработки, ,Ложь);
ИмяОбработки = ПодключитьВнешнююОбработку(АдресХранилища);
ИначеЕсли СтрокаСпискаОтчетов.Расширение = ".erf" Тогда
Рез=ПоместитьФайл(АдресХранилища,СтрокаСпискаОтчетов.ПолноеИмяФайлаВнешнейОбработки, ,Ложь);
ИмяОбработки = ПодключитьВнешнийОтчет(АдресХранилища);
КонецЕсли;
ТабДок = ВнешняяОбработкаНаСервере(СтрокаСпискаОтчетов.Расширение,ИмяОбработки) ;
.........
&НаСервере
Функция ВнешняяОбработкаНаСервере(СтрокаСпискаОтчетовРасширение,ИмяОбработки)
ИмяТипа = "ОписаниеЗащитыОтОпасныхДействий";
ОписаниеЗащиты = Новый(ИмяТипа);
ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
Если СтрокаСпискаОтчетовРасширение = ".epf" Тогда
ВнешнийОтчетОбработка = ВнешниеОбработки.Создать(ИмяОбработки, Ложь, ОписаниеЗащиты);
Иначе
ВнешнийОтчетОбработка = ВнешниеОтчеты.Создать(ИмяОбработки, Ложь, ОписаниеЗащиты);
КонецЕсли;
ТабличныйДокументРезультат = ВнешнийОтчетОбработка.Инициализировать();
.........
Показать
(15) С БСП еще проще:
ИмяМенеджераПечати = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Имя вашей обработки");
ОбработкаПечати = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ИмяМенеджераПечати);
ОбработкаПечати.МетодИзМодуляОбъектаСЭкспортом();
Пример, процедура в документе при открытии, которая вызывает процедуру модуля для продажи, это внешняя обработка.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПутьКВнешнейОбработке = Каталог1С+"ОбработкаМодуляПродажаТовара.epf";
Адрес = ""; Имя = "ПродажаТовара";
ВнешнийФайл = Новый Файл(ПутьКВнешнейОбработке);
Если НЕ ВнешнийФайл.Существует() Тогда
// ......что-то сообщаем
Иначе
ПоместитьФайл(Адрес,ПутьКВнешнейОбработке,,ЛОЖЬ);
ВнешняяОбработкаФормы = ПодключитьВнешнююОбработку(Адрес,Имя);
Форма = ВнешниеОбработки.Создать(ВнешняяОбработкаФормы);
Форма.ПодключитьДрайверММ(); //подключаю драйвер например, вызов процедуры ВО
КонецЕсли;
КонецПроцедуры
Показать
&НаСервере
Функция ПодключитьВнешнююОбработку(Адрес,Имя);
Возврат ВнешниеОбработки.Подключить(Адрес,Имя,ЛОЖЬ);
КонецФункции
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот