АЦРК: дополнительные отчеты и обработки
для конфигураций, основанных на БСП.
Часть 1. Заполнение объектов.
1. Теория
БСП — библиотека стандартных подсистем, на которой основаны типовые конфигурации 1С на управляемых формах.
В состав БСП входит и подсистема «Дополнительные отчеты и обработки»», которая определяет правила создания и подключения к конфигурациям дополнительных ВНЕШНИХ отчетов и обработок различного назначения.
С обычными дополнительными отчетами и обработками более-менее все ясно, Они работают так же, как и при их вызове через главное меню «Файл/Открыть», поэтому с их разработкой и отладкой особых проблем нет.
А вот обработки других типов (внешние печатные формы и заполнение объектов и др.) дело сложнее.
В БСП для дополнительных внешних отчетов и обработок (далее ДВОО) предусмотрен справочник "ДополнительныеОтчетыИОбработки". Кроме того, для каждой ДВОО предусмотрено три способа вызова:
- вызов серверного метода;
- вызов клиентского метода;
- открытие формы.
Вызов обработок из справочника сильно затрудняет отладку в управляемом приложении, да еще разные способы вызова.
Наверное, эти три способа сложились у разработчиков БСП исторически. Можно предположить, что сначала появился вызов серверного метода, чтобы не связываться самим и не связывать разработчиков ДВОО требованиями к формам их отчетов и обработок. Вызвал серверный метод из модуля обработки и все, никаких тебе форм: с сервера нельзя открыть никакую форму.
Потом все-таки формы понадобились, и появился вызов клиентского метода, чтобы из обработки можно было открывать другие формы.
Ну а потом видимо решили вызов упростить, и появился метод просто открытия формы обработки.
Но если над всем этим подумать, то при открытии формы сначала на сервере вызывается обработчик события "ПриСозданииНаСервере. В нем можно вызвать любую серверную процедуру, и если форма не нужна, то "Отказ=Истина;" и все. Получаем тот же вызов серверного метода.
Затем при создании формы вызывается обработчик "ПриОткрытии", уже на клиенте. В нем можно вызвать клиентский метод формы, и если сама форма не нудна, то "Отказ=Истина;" и все. Получаем вызов клиентского метода.
Ну и наконец, если мы не отказываемся создать и открыть форму, то форма и откроется. Получаем вызов ДВОО способом "Открытие формы".
То есть я хочу сказать, что все ДВОО надо делать со способом вызова "Открытие формы". Это первый вывод.
Рассуждаем дальше. Открытие формы есть открытие формы. То есть, делается это в конфигурации БСП или просто через главное меню "Файл / Открыть", управление попадает в метод формы "ПриСозданииНаСервере". То есть такую обработку очень легко отлаживать. Запускаем через "Файл / Открыть" и отлаживаем. А потом подключаем в конфигурацию и она должна работать так же.
Рассуждаем дальше. БСП при вызове разных типов обработок (печатные формы, обработки заполнения объекта и т.д.) передает им дополнительные параметры. Эти параметры можно отобразить на открываемой форме, чтобы задавать их в режиме отладки. Тем более, что не трудно определить, открывается форма через "Файл / Открыть" или штатным для БСП способом через справочник "ДополнительныеОтчетыИОбработки" и скрывать эти реквизиты при штатной работе и показывать при отладке.
2. Практика
Сделаем обработку, которая подключается ко всем возможным объектам конфигурации и заполняет поле комментарий. Сделаем для нее две разные команда: одну без открытия формы, другую с открытием формы, в которой можно будет задать произвольный комментарий.
Обработка можно будет подключить к любой конфигурации с БСП. В тех объектах, для которых предусмотрено подключение обработок заполнения, должна появится кнопка "Заполнить", заодно сразу будет видно, для каких объектов заполнение с помощь ДВОО не предусмотрено.
Файл обработки - АЦРК_ДополнительнаяВнешняяОбработкаЗаполненияОбъекта_ЗаполнениеКомментария.epf
2.1 Модуль обработки
Согласно БСП в модуле должна быть экспортная функция СведенияОВнешнейОбработке(), которая должна возвращать структуру с параметрами регистрации.
Как заполняется эта структура понятно из текста функции. Отметим следующие моменты:
- в качестве массива назначений указаны все ссылочные типы конфигурации;
- режим небезопасный, потому что меняет содержимое базы данных. Вообще можно дать такую рекомендацию: сначала ставим небезопасный режим, отлаживаем, потом ставим безопасный режим. Если будет работать, значит, оставляем безопасный режим, если нет - возвращаем небезопасный;
- обработка имеет две команды: по одной добавляется фиксированный комментарий, по другой команде открывается дополнительная форма для добавления произвольного комментария. Для формирования таблицы команд используются еще вспомогательные функция и процедура, знакомые всем, кто делал дополнительные отчеты и обработки по стандартам БСП;
- вариант использования для всех команд - "ОткрытиеФормы"
Замечение: в справочнике "ДополнительныеОтчетыИОбработки" есть еще два флажка "ИспользоватьДляФормыОбъекта" и "ИспользоватьДляФормыСписка". Почему их нет в структуре параметров регистрации - загадка. Уж разработчик внешней обработки знает, где она будет использоваться, и мог бы так же установить это в параметрах регистрации. По умолчанию они оба устанавливаются, поэтому их надо проверять и устанавливать вручную.
2.2 Форма обработки.
Раз уж мы стоим за вариант использования "ОткрытиеФормы" и ТОЛЬКО за него, то у обработки обязательно должна быть хотя бы одна форма. Рассмотрим ее.
При вызове формы БСП передает ей 4 параметра:
- "ДополнительнаяОбработкаСсылка" типа "СправочникСсылка.ДополнительныеОтчетыИОбработки";
- "ИдентификаторКоманды" типа "Строка";
- "ИмяФормы типа" типа "Строка";
- "ОбъектыНазначения" типа "Массив".
Поэтому добавляем в параметры формы соответствующие параметры. Параметр "ОбъектыНазначения" имеет тип "Произвольный", потому что типа "Массив" на клиенте нет.
Создаем реквизиты формы, соответствующие параметрам формы, и помещаем их на форму, объединив в группу "ГруппаРеквизитовДляОтладки".
В процедуре ПриСозданииНаСервере перенесем параметры формы в соответствующие реквизиты, и в дальнейшем будем работать с этими реквизитами (сами-то параметры будут уже недоступны).
Добавим реквизит формы рф_РежимОтладки типа булево. Он будет установлен в процедуре ПрисозданииНаСервере. Признак отладки - пустое значение параметра "ДополнительнаяОбработкаСсылка", потому что пи штатном запуске БСП всегда передает в этом параметре ссылка на элемент справочника "ДополнительныеОтчетыИОбработки", в котором хранится наша обработка.
Еще добавим для информации таблицу команд, которые есть в нашей обработке, и заполним ее при создании формы на сервере из команд, заданных при регистрации обработки.
А при открытии заполним этими командами список выбора для реквизита "ИдентификаторКоманды".
Сама таблица при открытии скрыта, потому что список команд можно посмотреть в списке выбора идентификатора команды, но, закомментировав соответствующую строку, таблицу команд можно увидеть.
Теперь добавляем реквизит для ввода нашего комментария и помещаем его на формы.
И еще добавляем команду формы "ДобавитьВКомментарий" и выносим ее на форму в соответствующую кнопку.
Еще добавляем в форму реквизит рф_ИмяЭтойОбработки, которую можно использовать для открытия других форм этой обработки с помощью команды:
ОткрытьФорму("ВнешняяОбработка."+рф_ИмяЭтойОбработки+".Форма.ИмяФормы",л_СтруктураПараметров,ЭтаФорма.ВладелецФормы);
Вот собственно и все.
Можно отлаживать обработку через "Файл / открыть", и потом подключить ее в Дополнительные отчеты и обработки.
Конечно, не все так просто, есть нюансы.
Один нюанс связан с отсутствием формы-владельца при отладке через Файл / Открыть. Заключаем такие строки в Попытку.
Другой нюанс заключается в том, что объекты назначения передаются в параметры как массив, но показать массив на форме нельзя, зато для отображения на форме можно использовать список значений. Значит возможно придется выполнять преобразование массива в список и обратно. Для этого есть методы рф_ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения) и рф_ОбъектыНазначения.ВыгрузитьЗначения(), которые работают на сервере.
Обратите внимание на последнюю строку в процедуре ПриОткрытии. Закомментируйте, подключите обработку в справочник Дополнительные отчеты и обработки и вызовите обработку в штатном режиме через кнопку Заполнить. Когда форма откроется, вы увидите параметры, которые ей переданы.
В следующей части будет пример внешней печатной формы.