При разработке внешних печатных форм (ВПФ) для конфигураций на базе Библиотеки Стандартных Подсистем (БСП), таких как 1С:Бухгалтерия 8, часто возникает необходимость перед формированием печатного документа запросить у пользователя дополнительные данные. Для этого во внешнюю обработку добавляют форму ввода параметров. Однако на практике разработчики часто сталкиваются с проблемой: при открытии формы из списка документов реквизиты обработки остаются пустыми, а ссылка на исходный документ не передается автоматический.
В этой статье мы подробно проанализируем причину возникновения этой проблемы и разберем два правильных способа передачи выделенных документов в интерактивную форму внешней печатной формы.
По умолчанию, если команда регистрации печатной формы имеет тип использования ВызовСерверногоМетода, подсистема БСП напрямую вызывает процедуру Печать в модуле объекта и самостоятельно передает туда массив ссылок на выделенные объекты. Но если для ВПФ создана отдельная форма и логика вызова перенесена в неё, обращение к Объект.СсылкаНаОбъект внутри формы возвращает пустое значение. Это связано с тем, что форма обработки открывается в отдельном контексте, и параметры выделенных документов должны явно передаваться через механизм параметров БСП.
Рассмотрим первый подход, при котором подсистема БСП при вызове команды из меню «Печать» сразу открывает основную форму внешней обработки и передает в нее массив выбранных объектов.
Шаг 1. Настройка регистрации в модуле объекта
В функции СведенияОВнешнейОбработке модуля объекта внешней обработки укажем вид команды ОткрытиеФормы:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.ТребованиеНакладная");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Печать с параметрами";
Команда.Идентификатор = "ПечатьСФормой";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
Шаг 2. Обработка параметров в модуле формы
При открытии формы БСП передает массив выделенных ссылок в параметр ОбъектыНазначения. Перехватим его в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ОбъектыНазначения") Тогда
// Сохраняем массив ссылок во временный реквизит формы или массив
МассивДокументов = Параметры.ОбъектыНазначения;
ЗначениеВРеквизитФормы(МассивДокументов, "МассивОбъектовНазначения");
КонецЕсли;
КонецProцедуры
После заполнения пользовательских параметров на форме по кнопке «Печать» вызывается серверная процедура формирования табличного документа, принимающая сохраненный массив документов.
Проанализируем второй вариант, когда БСП вызывает клиентскую процедуру в модуле формы ВПФ, что позволяет гибко настроить логику перед открытием диалога.
Шаг 1. Настройка сведений об обработке
Укажем тип команды ВызовКлиентскогоМетода:
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Печать с дополнительным диалогом";
Команда.Идентификатор = "ПечатьКлиентскийМетод";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
Шаг 2. Определение экспортной процедуры в модуле формы
В модуле формы ВПФ создадим экспортную процедуру Печать с двумя параметрами: ИдентификаторКоманды и ОбъектыНазначения.
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
// Передаем полученный массив объектов в параметры открываемой формы
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ОбъектыНазначения", ОбъектыНазначения);
// Открываем форму для ввода параметров
ОткрытьФорму("ВнешняяОбработка.ИмяОбработки.Форма.ФормаПараметров", ПараметрыОткрытия);
КонецПроцедуры
Обратите внимание, что параметр ОбъектыНазначения всегда передается в виде массива Массив, даже если в форме списка пользователь выделил всего один документ. При написании запросов и процедур формирования печати обязательно обрабатывайте переданные ссылки в цикле или передавайте массив целиком в качестве параметра условия В (&МассивДокументов) в языке запросов 1С.