1с как получить имя внешней обработки
Для программного открытия внешней обработки в 1С нужно знать адрес ее файла. Зная его, можно либо открыть форму обработки, либо получить объект обработки для проведения с ним дальнейших действий (например, для вызова экспортных функций из модуля объекта).
Открытие формы внешней обработки
Для программного открытия формы внешней обработки в 1С используется функция ПолучитьФорму() объекта ВнешниеОбработки. Функция имеет несколько параметров. Рассмотрим простое открытие основной формы обработки:
//В переменной АдресФайла находится полный путь к файлу внешней обработки
Форма = ВнешниеОбработки . ПолучитьФорму ( АдресФайла ) ;
Форма . Открыть ( ) ;
Для открытия неосновной формы внешней обработки необходимо указать ее имя.
//В переменной АдресФайла находится полный путь к файлу внешней обработки
Форма = ВнешниеОбработки . ПолучитьФорму ( АдресФайла , "НеосновнаяФорма" ) ;
Форма . Открыть ( ) ;
Открытие внешней обработки как объекта
Для того чтобы получить внешнюю обработку как объект используется функция Создать() объекта ВнешниеОбработки.
//В переменной АдресФайла находится полный путь к файлу внешней обработки
ОбъектОбработки = ВнешниеОбработки . Создать ( АдресФайла ) ;
По умолчанию все обработки открываются в безопасном режиме. Чтобы его отключить, используются следующие параметры:
//В переменной АдресФайла находится полный путь к файлу внешней обработки
ОбъектОбработки = ВнешниеОбработки . Создать ( АдресФайла , Ложь ) ;
Внешняя обработка или печатная форма сохранена в информационной базе
Во многих конфигурациях существует возможность сохранять внешние печатные формы и обработки непосредственно в информационной базе. Для этого используется справочник ВнешниеОбработки. Сама внешняя обработка хранится в виде двоичных данных либо в реквизите ХранилищеВнешнейОбработки, либо в табличной части Принадлежность в реквизите ХранилищеВнешнейОбработки.
Для открытия внешней обработки нужно:
- Получить ее из хранилища.
- Сохранить файл с обработкой на диск.
- Открыть форму или получить объект обработки.
- Если мы имеем дело с внешней печатной формой, то можно заполнить стандартный реквизит СсылкаНаОбъект и вызвать экспортную функцию Печать.
//В переменной СпрСсылка находится ссылка на элемент справочника ВнешниеОбработки
ДвДанные = СпрСсылка . ХранилищеВнешнейОбработки . Получить ( ) ;
АдресФайла = ПолучитьИмяВременногоФайла ( ) ;
ДвДанные . Записать ( АдресФайла ) ;
ОбъектОбработки = ВнешниеОбработки . Создать ( АдресФайла , Ложь ) ;
//Для внешней печатной формы. СсылкаНаОбъект содержит ссылку на элемент, которому принадлежит печатная форма
ОбъектОбработки . СсылкаНаОбъект = СсылкаНаОбъект ;
ТабДок = ОбъектОбработки . Печать ( ) ;
Добавить комментарий Отменить ответ
Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
В файловом режиме 1С работает, а в серверном не работает, клиент толстый. Пишет:
Ошибка при вызове метода контекста (ПолучитьФорму): Неизвестное имя формы. Имя: "ВнешняяОбработка.МаяОбработка.Форма.УправляемаяФорма".
Как сделать чтобы в серверном работала?
(20) Как сделать чтобы было клиент? Как я понял в файловом варианте само делается, потому что там нет сервера.
в файловом варианте есть сервер. но поскольку он крутится на твоей локальной машине, то и позволяет открыть окно настроек.
К (0). Из внешнего модуля так вызывается:
может мы чего не поняли в твоей задуме?
короче. твоя печатная форма должна быть создана по технологии внешних обработок 8.2
только тогда ты сможешь открыть ее форму.
делается это так:
Вот этого нужно тебе?
(41) Не понял как это может помочь открыть форму внешней обработки. Это для типовой УТ? Похоже не то что нужно
(47) что конкретно тебе непонятно? ты делаешь дополнительную печатную форму для какого то документа. правильно?
(44) Пишет: Ошибка при вызове метода контекста (ПолучитьФорму): Неизвестное имя формы. Имя: "ВнешняяОбработка.МаяОбработка.Форма.УправляемаяФорма"
(48) Да, но в той статье написано как сделать дополнительную печатную форму, это я сделал, работает.
Теперь мне надо открыть ее форму.
ищи в своей обработке "ДобавитьКоманду(ТаблицаКоманд,"
и пиши туда вместо ИМЯ_ТВОЕЙ_ФОРМЫ имя формы как она у тебя обзывается в обработке
(56) ровно то, что я написал. ему надо сделать внешнюю печатную форму для УТ11, которая прилепляется к нужным документам штатными средствами без изменения конфы и позволяет перед печатью открывать окно с некоторыми настройками.
но судя по тому, что ТС молчит, то предположу что он не осилил как же это сделать. видимо придется ему предложить купить эту форму ))))
(51) Этот код не работает. ДобавитьКоманду - такая процедура не определена.
(57) Вообще-то не для УТ11. Интересует как открыть форму в принципе, "с нуля"
(52) Код не работает.
Ошибка при вызове метода контекста (ПолучитьФорму): Неизвестное имя формы. Имя: "ВнешняяОбработка.МаяОбработка.Форма.УправляемаяФорма"
Почему-то в пятницу не работало. 1с перезапустил, заработало.
Вот так тоже рабюотает:
Вот так тоже теперь работает:
Что за фигня! В пятницу не работало, а сейчас работает без всяких дополнений! Всего-то платформу перезапустил
: Процедура или функция с указанным именем не определена (ПодключитьВнешнююОбработку)
(70)а давай я тебе по руке погадаю? Тыж меня в телепаты записал.
(71) твой код. Пишется ошибка.
Закомментированная строка не работает. Переделал как во второй строке, ошибку не выдает:
(67)Если предполагать, что ты используешь код из (67), дополнив его куском кода из (72), то у меня разрыв шаблона - метод Подключить имеет доступность "Сервер, внешнее соединение", хотя у тебя выставлено &НаКлиенте.
Ты занимаешься мозгоимением??
Третий косяк: Если взять другую обработку и задать ей имя "МаяОбработка", и открыть ее форму из той процедуры, то всё равно откроется форма старой обработки. Тоесть она как-то зарегистрировалась под этим именем, и не пойму когда и как она это сделала
(79)ты каким-то чудом вызываешь метод "Печать" из одной внешней обработки, а потом хочешь открыть другую внешнюю обработку "tmp.epf"??
А как ты вызываешь "Печать"?
(80) Из общего модуля вызываю:
хз, чего там у тебя как работает, но (74) не должен работать: &НаКлиенте и ВнешниеОбработки.Подключить не должны вместе дружить.
Еще раз: в (44) код достаточен для твоей задачи. "ОткрытьОбработку(Команда)" - это вызов по команде/кнопке на форме.
Открыл форму, сделал настройки, там же нажал кнопку/команду печать.
(84) Чтобы нажать кнопку на форме, нужно сперва открыть эту форму, а она не открывается. А вообще вызов внешней обработки и ее метода "Печать" нельзя менять. И почему работает ВнешниеОбработки.Подключить я не знаю. Могу выложить обработку чтобы посмотрели
(84) Вот выложил: http://ifolder.ru/29092486
Кнопка на обработке открывает такую же обработку и вызывает "Печать()". И твой код не работает.
(86)
ВнешниеОбработки не доступно в тонком клиенте
ПодключитьВнешнююОбработку это метод объекта. чтобы его вызвать, нужно сначала получить объект с помощью РеквизитФормыВЗначение. но сделать это можно только на сервере
а вообще зачем всё это нужно?
(88) У меня в ТОЛСТОМ клиенте
Этот метод вызывается в модуле объекта, тоесть получать объект не нужно, он уже есть.
Нужно просто разобраться. Почему оно не работает!
И как могут работать два метода ПоместитьФайл и ВнешниеОбработки.Подключить в одной процедуре. У них же разная доступность на клиенте и на сервере!
(90) ты для какой конфы это безобразие ваяешь?
для УТ11 я тебе дал все карты в руки. у меня все работает, подключается, открывает форму настроек и печатает.
(91) если указать имя обработки "МаяОбработка", то работает. А если поменять имя и указать там новое имя, то не работает.
Выяснил что нужно хотябы раз открыть форму обработки через меню файл, и выполнить команду:
Тогда в следующий раз форма открывается из модуля объекта нормально. Но как сделать чтобы не нужно было открывать ее в первый раз вручную?
Программное открытие внешней обработки осуществляется с помощью объекта глобального контекста ВнешниеОбработки, который имеет тип ВнешниеОбработкиМенеджер. Для каждого режима работы платформы 1С (режим обычного приложения и режим управляемого приложения) используются различные методы объекта для работы с внешними обработками.
Запуск внешней обработки в режиме обычного приложения
В обычном приложении необходимо использовать метод Создать() объекта ВнешниеОбработки, в который передается полное имя файла внешней обработки. Метод возвращает объект типа ВнешняяОбработка, этот объект и есть открываемая внешняя обработка. Если требуется открыть форму внешней обработки, то у полученного объекта вызываем метод ПолучитьФорму(), который вернет основную форму, а затем вызываем метод Открыть() для её открытия.
ПолноеИмяФайла = ""; // Полное имя файла внешней обработки.
Обработка = ВнешниеОбработки.Создать(ПолноеИмяФайла);
Обработка.ПолучитьФорму().Открыть();
Во внешних обработках основной формой всегда должна быть обычная, а управляемая дополнительной, иначе не будет работать метод ПолучитьФорму() в режиме обычном приложения.
Запуск внешней обработки в режиме управляемого приложения
В режиме управляемых форм появляется разделение алгоритма по контексту выполнения. На клиенте получаем двоичные данные по полному имени файла внешней обработки. Передаем полученные двоичные данные на сервер и помещаем их во временное хранилище. Далее необходимо вызвать метод Подключить() объекта ВнешниеОбработки, в который передается адрес на временное хранилище. Метод возвращает имя подключенной внешней обработки. Возвращаем имя внешней обработки на клиент, формируем строковый путь к форме обработки и с помощью метода ОткрытьФорму() открываем форму внешней обработки.
&НаКлиенте
ПолноеИмяФайла = ""; // Полное имя файла внешней обработки.
ДанныеФайла = Новый ДвоичныеДанные(ПолноеИмяФайла);
ИмяВнешнейОбработки = ПолучитьИмяВнешнейОбработки(ДанныеФайла);
ОткрытьФорму("ВнешняяОбработка." + ИмяВнешнейОбработки + ".Форма");
Безопасный режим для внешних обработок
- привилегированный режим отменяется, если он был установлен;
- попытки перехода в привилегированный режим игнорируются;
- запрещены операции с COM-объектами;
- запрещена загрузка и подключение внешних компонентов;
- запрещен доступ к файловой системе (кроме временных файлов);
- запрещен доступ к Интернету.
Программное открытие внешних отчетов, аналогично внешним обработкам, только следует использовать объект глобального контекста ВнешниеОтчеты, который имеет тип ВнешниеОтчетыМенеджер.
Многие сталкиваются с проблемой при использовании внешних отчетов и обработок в управляемом приложении: если необходимо открыть вторую форму обработки, то данные, введенные на первой форме не доступны. То есть, вторая форма открывается, как бы, отдельно от первой, как новый экземпляр обработки.
В этой статье мы рассмотрим способ, с помощью которого можно открыть вторую (а также третью, четвертую и т.д.) форму внешней обработки, не потеряв при этом данные, введенные на первой форме. Опустим моменты, связанные с созданием кнопок и процедур открытия форм и перейдем сразу к процедуре переноса данных из первой управляемой формы во вторую. Кстати, об открытии форм в управляемом приложении можно почитать тут.
Итак, первое, что нужно сделать — это поместить все данные внешней обработки, введенные на первой форме, в некоторое хранилище. Для этого используем функцию ПоместитьВоВременноеХранилище(). В нее нужно передать все данные внешней обработки. В целом код выглядит так:
&НаКлиенте
Процедура ОткрытьВторуюФорму ( )
//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
СтруктураПараметров = Новый Структура ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
СтруктураПараметров . Вставить ( Реквизит . Имя , Объект [ Реквизит . Имя ] ) ;
КонецЦикла ;
//Можно добавить и табличные части, и реквизиты первой формы.
СтруктураПараметров . Вставить ( "РеквизитФормы1" , РеквизитФормы 1 ) ;
СтруктураПараметров . Вставить ( "ТабличнаяЧасть1" , Объект [ "ТабличнаяЧасть1" ] . Выгрузить ( ) ) ;
//Теперь помещаем эти данные в хранилище и получаем адрес этого хранилища
АдресПередаваемыхПараметров = ПоместитьВоВременноеХранилище ( СтруктураПараметров , Новый УникальныйИдентификатор ) ;
//Создаем структуру с параметрами, которые передадим во вторую форму
_Параметры = новый Структура ( "Адрес" , АдресПередаваемыхПараметров ) ;
//Создаем оповещение, которое сработает при закрытии второй формы,
//т.к. измененные в ней данные нужно передать обратно в первую.
ОписаниеОповещения = Новый ОписаниеОповещения ( "ОбработатьЗакрытиеВторойФормы" , ЭтаФорма ) ;
//Ну и, наконец, открываем вторую форму
ОткрытьФорму ( "ВнешняяОбработка.ВыпускПроданнойПродукции.Форма.ФормаПараметровЗаполненияУПР" , _Параметры , ЭтаФорма . ОписаниеОповещения ) ;
Теперь нужно во второй управляемой форме принять и обработать данные. Это делается через обработчик события ПриСозданииНаСервере().
&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
//Получаем сохраненные в хранилище данные
СтруктураПараметров = ПолучитьИзВременногоХранилища ( Параметры . Адрес ) ;
//Загружаем табличную часть
Объект [ "ТабличнаяЧасть1" ] . Загрузить ( СтруктураПараметров [ "ТабличнаяЧасть1" ] ) ;
//Загружаем реквизиты внешней обработки
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
Объект [ Реквизит . Имя ] = СтруктураПараметров [ Реквизит . Имя ] ;
КонецЦикла ;
При закрытии второй формы нужно сделать то же самое: собрать все данные в хранилище, передать в процедуру оповещения в первой форме и обработать там.
&НаКлиенте
Процедура ЗакрытьФорму ( )
//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
СтруктураПараметров = Новый Структура ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
СтруктураПараметров . Вставить ( Реквизит . Имя , Объект [ Реквизит . Имя ] ) ;
КонецЦикла ;
//Можно добавить и табличные части, и реквизиты первой формы.
СтруктураПараметров . Вставить ( "РеквизитФормы1" , РеквизитФормы 1 ) ;
СтруктураПараметров . Вставить ( "ТабличнаяЧасть1" , Объект [ "ТабличнаяЧасть1" ] . Выгрузить ( ) ) ;
//Теперь помещаем эти данные в хранилище и получаем адрес этого хранилища
АдресПередаваемыхПараметров = ПоместитьВоВременноеХранилище ( СтруктураПараметров , Новый УникальныйИдентификатор ) ;
//Создаем структуру с параметрами, которые передадим во вторую форму
_Параметры = новый Структура ( "Адрес" , АдресПередаваемыхПараметров ) ;
//Закрываем форму, передав параметры.
Закрыть ( _Параметры ) ;
А в первой форме создаем процедуру, для которой делали описание оповещения. В ней обрабатываем принятые данные.
&НаСервере
Процедура ОбработатьЗакрытиеВторойФормы ( РезультатЗакрытия , Параметры ) Экспорт
Если РезультатЗакрытия = Неопределено Тогда
Возврат ;
КонецЕсли ;
//Получаем данные из хранилища
СтруктураПараметров = ПолучитьИзВременногоХранилища ( РезультатЗакрытия . Адрес ) ;
//Загружаем данные
Объект [ "ТабличнаяЧасть1" ] . Загрузить ( СтруктураПараметров [ "ТабличнаяЧасть1" ] ) ;
_Объект = РеквизитФормыВЗначение ( "Объект" ) ;
Для каждого Реквизит из _Объект . Метаданные ( ) . Реквизиты Цикл
Объект [ Реквизит . Имя ] = СтруктураПараметров [ Реквизит . Имя ] ;
КонецЦикла ;
Как открыть вторую форму внешней обработки в управляемом приложении 1С : 1 комментарий
«&НаКлиенте
Процедура ОткрытьВторуюФорму ()
//Обойдем в цикле все реквизиты внешней обработки и запишем их в структуру
_Объект = РеквизитФормыВЗначение(«Объект»);»
РеквизитФормыВЗначение на клиенте.
Добавить комментарий Отменить ответ
Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
Чтобы подключить внешний отчет или обработку в справочник Дополнительные отчеты и обработки необходимо описать экспортную функцию СведенияОВнешнейОбработке() в модуле. Вот шаблон такой функции:
Описание полей возвращаемой структуры можно посмотреть в комментарии к функции ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(). Там можно получить актуальную информацию для вашей версии БСП.
Опишу основные поля структуры сведений о внешней обработке. При этом буду по минимуму повторять информацию в упомянутом комментарии, а постараюсь дополнить ее.
Поле «Вид»
Минимальным условием для регистрации внешнего отчета или обработки является заполненность поля «Вид». То есть, если вы создадите внешнюю обработку и пропишете в ней следующий код, то этого будет достаточно, чтобы добавить ее в справочник Дополнительные отчеты и обработки
Минимальное описание параметров регистрации
Возможные значения этого поля «Вид»
Поле «Вид» может принимать одно из значений, возвращаемых функциями ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки(). Например, для вида «ПечатнаяФорма» есть функция ВидОбработкиПечатнаяФорма().
рекомендуется заполнять поле «Вид» таким способом
Поле «Назначение»
Содержит массив объектов конфигурации в формате «.», для которых будет назначен внешний отчет/обработка.
для конкретных видов
для всех документов
Этот параметр игнорируется, если поле «Вид» имеет значение «ДополнительнаяОбработка» или «ДополнительныйОтчет».
Поле «Наименование»
Это значение подставляется в наименование элемента справочника Дополнительные отчеты и обработки при создании.
Если не заполнено, то используется синоним внешней обработки/отчета.
Используется только для администрирования, а при добавлении в пункт меню, например, Печать будет подставляться наименование команды из таблицы команд, а не значение этого поля.
Поле «Команды»
Таблица значений, которая загружается в одноименную табличную часть элемента справочника Дополнительные отчеты и обработки при регистрации внешней обработки.
Эту табличную часть можно заполнить и вручную.
Каждой строке соответствует один пункт в соответствующих меню, описанных в таблице выше.
Чтобы команда внешней обработки появилась в нужном меню, обязательно нужно добавить хотя бы одну строку в эту таблицу.
Таблица «Команды», колонка «Использование»
В колонке «Использование» указывается тип вызываемой команды. По сочетанию Вид-Тип команды система определяет какая предопределенная процедура будет вызвана из внешней обработки/отчета, и где она будет объявлена — на клиенте или на сервере.
Наиболее часто используются процедуры Печать() и ВыполнитьКоманду(), а также открытие формы без обращения к методу.
Это поле может принимать одно из значений, возвращаемых функциями ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКоманды(), например, ТипКомандыВызовСерверногоМетода(). В каждой из этих функций есть подробный комментарий.
Кроме того различается состав и количество параметров, передаваемых во внешнюю обработку/отчет. Кратко опишу возможные варианты использования в таблице
Тип команды | Значение поля «Вид» | Вызываемая экспортная процедура |
---|---|---|
ВызовСерверногоМетода | ПечатнаяФорма | Печать( МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) |
ДополнительнаяОбработка ДополнительныйОтчет Отчет | ВыполнитьКоманду( ИдентификаторКоманды, ПараметрыВыполнения) | |
СозданиеСвязанныхОбъектов | ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) | |
ЗаполнениеОбъекта | ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) | |
ВызовКлиентскогоМетода | ПечатнаяФорма | &НаКлиенте Печать( ИдентификаторКоманды, ОбъектыНазначенияМассив) |
ДополнительнаяОбработка ДополнительныйОтчет | &НаКлиенте ВыполнитьКоманду( ИдентификаторКоманды) | |
СозданиеСвязанныхОбъектов | &НаКлиенте ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) | |
ЗаполнениеОбъекта Отчет | &НаКлиенте ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначенияМассив) | |
Для всех видов | в форму передается параметр ДополнительнаяОбработкаСсылка | |
ОткрытиеФормы | СозданиеСвязанныхОбъектов ЗаполнениеОбъекта Отчет | в форму передается дополнительный параметр ОбъектыНазначения |
Для всех видов | в форму передаются параметры ИдентификаторКоманды ДополнительнаяОбработкаСсылка ИмяФормы | |
Отчет | Отчет с макетом СКД может не иметь форму, тогда будет использована общая форма для отчетов по умолчанию | |
ЗаполнениеФормы | ЗаполнениеОбъекта | ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) |
СценарийВБезопасномРежиме | Для всех видов | см. описание в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер .ТипКомандыСценарийВБезопасномРежиме() |
ЗагрузкаДанныхИзФайла | ДополнительнаяОбработка | см. описание в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер .ТипКомандыЗагрузкаДанныхИзФайла() |
Для типа команды ВызовКлиентскогоМетода необходимо создать форму в обработке, назначить ее основной и объявить экспортную процедуру
Полезные процедуры
Рекомендую обратить внимание на следующие процедуры и функции:
Также будет полезно развернуть демо конфигурацию по БСП. В ней есть примеры внешних обработок и отчетов в справочнике внешних обработок.
Читайте также: