Как во внешней печатной форме с интерактивной формой получить ссылки на выделенные документы в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке внешних печатных форм (ВПФ) для конфигураций на базе Библиотеки Стандартных Подсистем (БСП), таких как 1С:Бухгалтерия 8, часто возникает необходимость перед формированием печатного документа запросить у пользователя дополнительные данные. Для этого во внешнюю обработку добавляют форму ввода параметров. Однако на практике разработчики часто сталкиваются с проблемой: при открытии формы из списка документов реквизиты обработки остаются пустыми, а ссылка на исходный документ не передается автоматический.

В этой статье мы подробно проанализируем причину возникновения этой проблемы и разберем два правильных способа передачи выделенных документов в интерактивную форму внешней печатной формы.

Выясним причину проблемы

По умолчанию, если команда регистрации печатной формы имеет тип использования ВызовСерверногоМетода, подсистема БСП напрямую вызывает процедуру Печать в модуле объекта и самостоятельно передает туда массив ссылок на выделенные объекты. Но если для ВПФ создана отдельная форма и логика вызова перенесена в неё, обращение к Объект.СсылкаНаОбъект внутри формы возвращает пустое значение. Это связано с тем, что форма обработки открывается в отдельном контексте, и параметры выделенных документов должны явно передаваться через механизм параметров БСП.

Способ 1. Использование типа команды «ОткрытиеФормы»

Рассмотрим первый подход, при котором подсистема БСП при вызове команды из меню «Печать» сразу открывает основную форму внешней обработки и передает в нее массив выбранных объектов.

Шаг 1. Настройка регистрации в модуле объекта

В функции СведенияОВнешнейОбработке модуля объекта внешней обработки укажем вид команды ОткрытиеФормы:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Назначение.Добавить("Документ.ТребованиеНакладная");

    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = "Печать с параметрами";
    Команда.Идентификатор = "ПечатьСФормой";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    
    Возврат ПараметрыРегистрации;

КонецФункции

Шаг 2. Обработка параметров в модуле формы

При открытии формы БСП передает массив выделенных ссылок в параметр ОбъектыНазначения. Перехватим его в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если Параметры.Свойство("ОбъектыНазначения") Тогда
        // Сохраняем массив ссылок во временный реквизит формы или массив
        МассивДокументов = Параметры.ОбъектыНазначения;
        ЗначениеВРеквизитФормы(МассивДокументов, "МассивОбъектовНазначения");
    КонецЕсли;

КонецProцедуры

После заполнения пользовательских параметров на форме по кнопке «Печать» вызывается серверная процедура формирования табличного документа, принимающая сохраненный массив документов.

Способ 2. Использование типа команды «ВызовКлиентскогоМетода»

Проанализируем второй вариант, когда БСП вызывает клиентскую процедуру в модуле формы ВПФ, что позволяет гибко настроить логику перед открытием диалога.

Шаг 1. Настройка сведений об обработке

Укажем тип команды ВызовКлиентскогоМетода:


Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Печать с дополнительным диалогом";
Команда.Идентификатор = "ПечатьКлиентскийМетод";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();

Шаг 2. Определение экспортной процедуры в модуле формы

В модуле формы ВПФ создадим экспортную процедуру Печать с двумя параметрами: ИдентификаторКоманды и ОбъектыНазначения.


&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

    // Передаем полученный массив объектов в параметры открываемой формы
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ОбъектыНазначения", ОбъектыНазначения);
    
    // Открываем форму для ввода параметров
    ОткрытьФорму("ВнешняяОбработка.ИмяОбработки.Форма.ФормаПараметров", ПараметрыОткрытия);

КонецПроцедуры

Важная особенность работы с несколькими документами

Обратите внимание, что параметр ОбъектыНазначения всегда передается в виде массива Массив, даже если в форме списка пользователь выделил всего один документ. При написании запросов и процедур формирования печати обязательно обрабатывайте переданные ссылки в цикле или передавайте массив целиком в качестве параметра условия В (&МассивДокументов) в языке запросов 1С.

← На главную