1с получить синоним обработки
Довольно часто встречаются задачи, когда нужно организовать программное заполнение формы какого-то объекта. Скажем, у нас есть форма документа, на форме есть реквизиты, и нам нужно сделать команду, которая заполнит эти реквизиты. Данные для заполнения предполагается получать запросом.
Если конфигурация типовая, то, наверное, самый простой способ решения такой задачи – создать внешнюю обработку вида "Заполнение объекта".
Заполнение формы объекта с помощью внешней обработки
Строка с соответствующим параметром в модуле обработки:
Подключив обработку и указав, для какого документа она назначена, мы получим в форме документа команду. Тип команды задаётся при создании внешней обработки, и от него зависит, где и как будет выполняться обработчик команды. Для наших целей может подойти один из следующих типов команд:
- ВызовСерверногоМетода – обработчик команды располагается в модуле обработки;
- ВызовКлиентскогоМетода – обработчик команды располагается в модуле формы обработки;
- ЗаполнениеФормы – обработчик команды располагается в модуле обработки и позволяет работать с данными формы. Также позволяет вызвать серверную процедуру из модуля формы объекта. При этом можно заполнить форму не записывая объект.
Возможность заполнить форму не записывая объект – это то, что нужно. Ведь пользователь скорее всего ожидает, что по нажатию кнопки форма заполнится, а записываться будет позднее, после проверки результата заполнения. Поэтому выбираем тип команды – ЗаполнениеФормы.
В конечном итоге код в модуле обработки будет выглядеть примерно так:
В общем счёте задача решена. Однако, у такого способа есть небольшой недостаток – команда на форме размещается в определённом месте, а не там, где мы хотим её разместить. К примеру, на форме уже есть группа команд, включающая в себя команды заполнения, и мы хотели бы видеть новую команду в этой группе, но при подключении обработки команда на форме будет расположена отдельно от группы.
В связи с этим можно реализовать другой способ: добавить команду непосредственно в форму объекта – либо в основной конфигурации, либо в расширении – а обработчик команды организовать в модуле формы.
Заполнение формы объекта посредством обработчика команды в модуле формы
Итак, размещаем команду на форме объекта в том месте, которое нам нравится. В модуле формы добавляем клиентскую процедуру обработчика команды, из которой будем вызывать серверную процедуру. Серверную процедуру тоже создадим, она нам понадобится потому, что по условию задачи данные для заполнения получаются запросом.
Над серверной процедурой нужно подумать. В ней у нас будет объект формы с типом "ДанныеФормыСтуктура". Что-либо менять или заполнять в этом объекте не получится, возникнет ошибка "Объект недоступен для изменения".
Можно получить объект документа Объект . Ссылка . ПолучитьОбъект () , и заполнить его данными. Но тогда, чтобы увидеть данные в открытой форме, объект придётся записать, а это не очень хорошо.
Будет лучше, если данные добавятся без записи, и мы можем это сделать с помощью метода РеквизитФормыВЗначение . Этот метод преобразует реквизит формы в объект прикладного типа, и вот этот объект прикладного типа мы можем заполнить, а затем, уже заполненный, преобразовать обратно с помощью метода ЗначениеВРеквизитФормы . Выглядеть это будет примерно так:
Чтобы подключить внешний отчет или обработку в справочник Дополнительные отчеты и обработки необходимо описать экспортную функцию СведенияОВнешнейОбработке() в модуле. Вот шаблон такой функции:
Описание полей возвращаемой структуры можно посмотреть в комментарии к функции ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(). Там можно получить актуальную информацию для вашей версии БСП.
Опишу основные поля структуры сведений о внешней обработке. При этом буду по минимуму повторять информацию в упомянутом комментарии, а постараюсь дополнить ее.
Поле «Вид»
Минимальным условием для регистрации внешнего отчета или обработки является заполненность поля «Вид». То есть, если вы создадите внешнюю обработку и пропишете в ней следующий код, то этого будет достаточно, чтобы добавить ее в справочник Дополнительные отчеты и обработки
Минимальное описание параметров регистрации
Возможные значения этого поля «Вид»
Поле «Вид» может принимать одно из значений, возвращаемых функциями ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки(). Например, для вида «ПечатнаяФорма» есть функция ВидОбработкиПечатнаяФорма().
рекомендуется заполнять поле «Вид» таким способом
Поле «Назначение»
Содержит массив объектов конфигурации в формате «.», для которых будет назначен внешний отчет/обработка.
для конкретных видов
для всех документов
Этот параметр игнорируется, если поле «Вид» имеет значение «ДополнительнаяОбработка» или «ДополнительныйОтчет».
Поле «Наименование»
Это значение подставляется в наименование элемента справочника Дополнительные отчеты и обработки при создании.
Если не заполнено, то используется синоним внешней обработки/отчета.
Используется только для администрирования, а при добавлении в пункт меню, например, Печать будет подставляться наименование команды из таблицы команд, а не значение этого поля.
Поле «Команды»
Таблица значений, которая загружается в одноименную табличную часть элемента справочника Дополнительные отчеты и обработки при регистрации внешней обработки.
Эту табличную часть можно заполнить и вручную.
Каждой строке соответствует один пункт в соответствующих меню, описанных в таблице выше.
Чтобы команда внешней обработки появилась в нужном меню, обязательно нужно добавить хотя бы одну строку в эту таблицу.
Таблица «Команды», колонка «Использование»
В колонке «Использование» указывается тип вызываемой команды. По сочетанию Вид-Тип команды система определяет какая предопределенная процедура будет вызвана из внешней обработки/отчета, и где она будет объявлена — на клиенте или на сервере.
Наиболее часто используются процедуры Печать() и ВыполнитьКоманду(), а также открытие формы без обращения к методу.
Это поле может принимать одно из значений, возвращаемых функциями ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКоманды(), например, ТипКомандыВызовСерверногоМетода(). В каждой из этих функций есть подробный комментарий.
Кроме того различается состав и количество параметров, передаваемых во внешнюю обработку/отчет. Кратко опишу возможные варианты использования в таблице
Тип команды | Значение поля «Вид» | Вызываемая экспортная процедура |
---|---|---|
ВызовСерверногоМетода | ПечатнаяФорма | Печать( МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) |
ДополнительнаяОбработка ДополнительныйОтчет Отчет | ВыполнитьКоманду( ИдентификаторКоманды, ПараметрыВыполнения) | |
СозданиеСвязанныхОбъектов | ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполнения) | |
ЗаполнениеОбъекта | ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) | |
ВызовКлиентскогоМетода | ПечатнаяФорма | &НаКлиенте Печать( ИдентификаторКоманды, ОбъектыНазначенияМассив) |
ДополнительнаяОбработка ДополнительныйОтчет | &НаКлиенте ВыполнитьКоманду( ИдентификаторКоманды) | |
СозданиеСвязанныхОбъектов | &НаКлиенте ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) | |
ЗаполнениеОбъекта Отчет | &НаКлиенте ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначенияМассив) | |
Для всех видов | в форму передается параметр ДополнительнаяОбработкаСсылка | |
ОткрытиеФормы | СозданиеСвязанныхОбъектов ЗаполнениеОбъекта Отчет | в форму передается дополнительный параметр ОбъектыНазначения |
Для всех видов | в форму передаются параметры ИдентификаторКоманды ДополнительнаяОбработкаСсылка ИмяФормы | |
Отчет | Отчет с макетом СКД может не иметь форму, тогда будет использована общая форма для отчетов по умолчанию | |
ЗаполнениеФормы | ЗаполнениеОбъекта | ВыполнитьКоманду( ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполнения) |
СценарийВБезопасномРежиме | Для всех видов | см. описание в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер .ТипКомандыСценарийВБезопасномРежиме() |
ЗагрузкаДанныхИзФайла | ДополнительнаяОбработка | см. описание в комментарии к функции ДополнительныеОтчетыИОбработкиКлиентСервер .ТипКомандыЗагрузкаДанныхИзФайла() |
Для типа команды ВызовКлиентскогоМетода необходимо создать форму в обработке, назначить ее основной и объявить экспортную процедуру
Полезные процедуры
Рекомендую обратить внимание на следующие процедуры и функции:
Также будет полезно развернуть демо конфигурацию по БСП. В ней есть примеры внешних обработок и отчетов в справочнике внешних обработок.
Продолжаем разбирать технологию разработки внешних отчетов и обработок. Данная технология очень широко используется, много статей и примеров, но, лично мне, не хватает простого и удобного классификатора с примерами, чтобы быстро сверстать собственную обработку или отчет.
Я вот, например, постоянно ищу и копирую подходящие собственные обработки, чтобы создать новую. Иной раз долго копаюсь, чтобы найти нужный шаблон. И вот чтобы поменьше искать — выкладываю — для себя, в том числе.
Кому интересно немного теории и ознакомиться с моим стандартом — переходите по ссылке, остальных томить не буду, переходим к делу и собственно шаблонам:
Вид обработки и Тип команды
Поведение внешних отчетов и обработок, главным образом, определяется Видом обработки и Типом команды (описание).
Виды обработок
Главным параметром, определяющим вид обработки является «Вид». Их немного, остановимся кратко на каждом:
Дополнительная обработка
Обработка произвольного вида. Привязывается к выбранному разделу главного меню и вызывается из меню «Сервис» => «Дополнительные обработки». Классический пример — обработка с открытием формы.
Заполнение объекта
Дополнительная обработка специального вида «Заполнение объекта». Предназначена для обработки данных документа или другого объекта (но далеко не всех!). При регистрации обработки на форме появляется невидимая до сих пор кнопка «Заполнение»
Подробно разобраны для типов команды «ТипКомандыОткрытиеФормы» и «ТипКомандыВызовКлиентскогоМетода»:
Пример самой функции (ТипКомандыОткрытиеФормы):
Печатная форма
Самый частый для разработки вид внешних обработок. Предназначена для формирования печатных форм одного или нескольких объектов (документов, справочников). При регистрации печатной формы документа появляется пункт в меню «Печать» форм списков и формы документа.
Создание связанных объектов
Пока нет примера
Пока нет примера
Дополнительный отчет
Предназначен для добавления произвольного отчета. Можно назначить в один или несколько подсистем (Продажи, Закупки и т.д.). Шаблон ниже:
Отчет
Для дополнительных контекстных отчетов. Встраиваются в списки справочников и документов для вызова по кнопке «Отчеты».
Необходимо обратить внимание на передачу параметров и автоформирование отчета:
- «ОпределитьНастройкиФормы» в СведенияОВнешнейОбработке — обязательно установить флаг Истина
- Доп процедура ОпределитьНастройкиФормы
- Доп процедура ПриСозданииНаСервере
Немного теории и описание моего стандарта функции СведенияОВнешнейОбработке
«Программа позволяет подключать и использовать дополнительные (внешние) отчеты и обработки в режиме 1С:Предприятия. Они расширяют возможности программы и могут использоваться для упрощения работы и оперативной доработки под особенности учета в организации. В отличие от стандартных средств доработки конфигурации, дополнительные отчеты и обработки подключаются без изменения конфигурации поставщика и не замедляют обновление программы (также остается возможность обновлять программу в автоматическом режиме). » — Подробнее на сайте 1С…
Внешний отчет / обработка должен содержать в модуле обработки экспортную функцию СведенияОВнешнейОбработке без параметров. Функция должна возвращать Структуру с определенным обязательным набором параметров. Разберем функцию по строкам
- Для инициализации параметров структуры, которую будем заполнять и затем возвращать я использую стандартную функцию ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(«ВерсияБСП»)
- ВерсиюБСП я тоже предпочитаю получать ту, которая используется в конфигурации.
ВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки()
Стоит заметить, что есть теоретическая вероятность, что в результате изменений версий БСП после обновления конфигурации и изменения версии библиотеки ваш код перестанет работать и, с этой точки зрения, безопаснее использовать ту версию, которую вы использовали на момент отладки. - ПараметрыРегистрации.Вид, с видом все понятно, см. выше
- ПараметрыРегистрации.БезопасныйРежим — всегда выставляю = Истина. Однако, надо быть готовым к тому, чтобы прописать нужные разрешения
- ПараметрыРегистрации.Наименование — ставлю = Метаданные().Синоним, т.к. при правильно названной обработке — код получается универсальным (см скрин выше)
- ПараметрыРегистрации.Версия = Метаданные().Комментарий, мне лично версии удобнее поддерживать в метаданных обработки, чем в коде. Опять-таки, код универсален
- ПараметрыРегистрации. Назначение. Это должен быть массив с перечислением идентификаторов метаданных. Актуально для объектов, к которым привязывается обработка (к примеру, к печатным формам). По примеру должно быть все ясно.
- Добавление разрешений — это опять-таки см п4 и разрешения
- Нужно создать одну или несколько Команд. Поэтому пишем НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(), где ПараметрыРегистрации.Команды — это Таблица значений с колонками:
- ЗаменяемыеКоманды
- Идентификатор
- Использование
- Модификатор
- ПоказыватьОповещение
- Представление
- Скрыть
- НоваяКоманда.Представление = Метаданные().Синоним — чтобы не придумывать другое имя команды и для универсальности кода. В некоторых случаях бывает целесообразно заменить на другое (например, если команд — несколько)
- НоваяКоманда.Идентификатор = Метаданные().Имя — аналогично с п10, чтобы не придумывать другой идентификатор команды и для универсальности кода. В некоторых случаях бывает целесообразно заменить на другое (например, если команд — несколько)
- НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода()
или другая из 7 вариантов, описанных ниже
Типы команд
ПараметрыРегистрации.Команды — это Таблица значений с колонками:
- Идентификатор
- Представление
- Использование
- Модификатор
- ПоказыватьОповещение
- ЗаменяемыеКоманды
- Скрыть
Самое важное значение — «Использование» — может принимать несколько значений для исполнения разных назначений:
- ТипКомандыВызовСерверногоМетода
- ТипКомандыВызовКлиентскогоМетода
- ТипКомандыЗагрузкаДанныхИзФайла.
- ТипКомандыЗаполнениеФормы
- ТипКомандыОткрытиеФормы
- ТипКомандыСценарийВБезопасномРежиме
С типами команд надо бы тему раскрыть, но как-нибудь в другой раз…
На этом пока все, тема не закрыта, эту статью, вероятно, буду подправлять, т.к. будет как справочник
Многие программисты 1С пренебрегают безопасным режимом в своих дополнительных отчетах и обработках ставят «небезопасный режим». Да, так проще, не надо разбираться с ошибками при подключении, но такие обработки не могут исполняться в некоторых режимах, и вообще, не хорошо.
Почему не хорошо?
В данной статье я собрал (и буду дополнять, при случае) список подключаемых разрешений, которые позволяют подключать внешние обработки и отчеты в безопасном режиме. ПараметрыРегистрации.Разрешения.Добавить(…)
Немного документации
Там, собственно, главное. Но примеров нет.
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты
- РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаПрограммы
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаФайловойСистемы
- РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПриложенияОперационнойСистемы
Итак, еще немного — и к делу
Напомню, что в модуле внешней обработки/отчета должна располагаться экспортная функция СведенияОВнешнейОбработке, которая должна возвращать структуру с параметрами регистрации.
Если вы используете что-то «небезопасное», а именно что-то из перечня (как очень хорошо коллега расписал) следует передать в структуру в параметр «Разрешения» соответствующий XDTO объект используя следующую конструкцию
ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
А «Разрешение» получается несколькими функциями модуля БСП
РаботаВБезопасномРежиме. Рассмотрим частные случаи:
Печать штрихкодов
Самая популярная компонента, используется для всех внешних печатных форм.
Склонения ФИО
Тоже может пригодиться, используется для договоров и проч., где нужны склонения
Создание COM-классов
Если в коде используется COM-объект, то его нужно зарегистрировать, используя функцию РазрешениеНаСозданиеCOMКласса модуля БСП РаботаВБезопасномРежиме. Приведу ее текст здесь, чтобы понять небольшую загвоздку
Текст функции модуля РаботаВБезопасномРежиме
Запуск 1С 8.3
Запуск Excel
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(«Excel.Application», «», «ИмяСервера»)
ADODB
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(«ADODB.Connection», «», «ИмяСервера»)
Прочие COM-серверы
Если у Вас сервер или приложение 32-х разрядное или другой COM-сервер, запускайте regedit и ищите свой CLSID как на скриншоте, дел на пару минут.
Разрешение на использование интернет-ресурсов
Тут все более-менее ясно. Использовал на практике.
Разрешение на использование каталога временных файлов
В принципе, тоже все ясно и необходимость использования возникает нередко, например, для открытия файла.
Например, при использовании: ВремФайл = ПолучитьИмяВременногоФайла(Расширение) или УдалитьФайлы(ВремФайл)
Разрешение на использование привилегированного режима
Как выяснилось, весьма актуальная штука. Например, для формирования печатных форм для пользователя без административных прав.
Решение 1 я подробно описал в прошлой записи. Однако, мне не давали покоя некоторые проблемы данного решения.
В частности, способ обновления данных формы объекта после выполнения обработки данных был не универсален или не элегантный. Поэтому штудирование интернета, ИТС документации БСП, в купе с отладчиком — принесло данное решение — делюсь с интернетом!
Решение. Способ 2
Собственно разбираемый далее вариант является более правильным, с точки зрения разработчиков БСП.
1. Начинаем, как положено, с модуля обработки — добавляем экспортную процедуру СведенияОВнешнейОбработке
Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки()); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта(); ПараметрыРегистрации.БезопасныйРежим = Истина; ПараметрыРегистрации.Наименование = Метаданные().Синоним; ПараметрыРегистрации.Версия = Метаданные().Комментарий; ПараметрыРегистрации.Назначение.Добавить(«Документ.ПоступлениеБезналичныхДенежныхСредств»); Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина, «Чтение и запись файла Excel во временном каталоге»); ПараметрыРегистрации.Разрешения.Добавить(Разрешение); НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = Метаданные().Синоним; НоваяКоманда.Идентификатор = Метаданные().Имя; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода(); НоваяКоманда.ПоказыватьОповещение = Ложь; Возврат ПараметрыРегистрации; КонецФункции
Тут 2 ключевых момента:
- ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
- …
- НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
Также как и Варианте 1 — появится кнопка
2. Далее, в соответствии с моделью реализации БСП при данном варианте регистрации обработки, будет реализован вызов клиентской процедуры (т.е. процедуры модуля формы &НаКлиенте) «ВыполнитьКоманду«, которая передаст нужный нам контекст (ИдентификаторКоманды, ОбъектыНазначения).
Далее, нужно понять самый важный момент. При вызове формы будет выполнена всего лишь одна процедура ВыполнитьКоманду и после этого обработка будет закрыта.
Но по условиям нашей задачи — этого не достаточно?! Мы планировали поработать с формой, после чего пользователь нажмет кнопку «Обработать».
— Что нам нужно с этим сделать?
— Открыть нашу обработку второй раз, принудительно, уже из процедуры «ВыполнитьКоманду» и передать в нее нужный нам контекст!
Мало того — и это самый главный бонус данного способа решения задачи — после закрытия мы можем отработать событие закрытия и обновить данные самого объекта(!). В нашем примере — это документ «Поступление безналичных денежных средств».
Подводя итог написанному выше:
- При выполнении клиентской процедуры «ВыполнитьКоманду» сохраняем ссылку на открытый ранее объект, которая приходит в виде первого элемента массива: ОбъектыНазначения[0]
- Открываем повторно нашу форму ОткрытьФорму(«ВнешняяОбработка.ЗагрузкаПлатежей2.Форма.пп_ФормаЗагрузки», ….
- ПриСозданииНаСервере — отрабатываем переданный нами контекст. Главное не забыть записать где-то ссылку на обрабатываемый объект
- Для отработки события закрытия нашей формы — добавляем процедуру «ВыполнитьПослеЗакрытия», которая обновит данные формы объекта («Поступление безналичных денежных средств») командой ВладелецФормы.Прочитать()
Команда ВладелецФормы.Прочитать() — которую мы можем выполнить с клиента — самый главный бонус данного способа регистрации.
Собственно сама форма и логика работы с ней — ничем не отличается от Варианта 1. В форме разрабатываем интерфейс работы с файлом и обработчик загрузки. Например, вот такой интерфейс: выбираем файл Excel, читаем его файл в Табличный документ (с COM-объектом при этом не работаем!), далее обрабатываем открытое содержимое и подготавливаем данные для переноса в соответствии с бизнес-требованиями.
После нажатия кнопки выполнить, добавляем команду
После чего форма будет закрыта, а данные документа — обновлены. Все готово!
Читайте также: