При разработке внешних печатных форм в среде 1С:Предприятие 8.3 на базе Библиотеки стандартных подсистем (БСП) часто возникает задача: прежде чем вывести макет на печать, необходимо показать пользователю форму для ввода дополнительных данных. Типичный пример — выбор ответственного лица, ввод номера доверенности или даты. В этом случае возникает вопрос — как получить ссылку на документ, из которого была вызвана печатная форма, чтобы использовать его данные (например, контрагента, дату или сумму) в логике формирования макета?
В этой статье мы подробно разберем, как передать массив выбранных объектов в форму обработки, как правильно их обработать и вызвать процедуру формирования табличного документа.
Для начала проанализируем структуру функции СведенияОВнешнейОбработке в модуле объекта. Именно здесь мы указываем системе, что вместо прямого вызова серверного метода нужно открыть форму обработки. Рассмотрим пример настройки таблицы команд:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ПередачаСырьяПереработчику"); // Указываем целевой документ
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Упаковочный лист с параметрами");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Важный момент: использование "ОткрытиеФормы"
ДобавитьКоманду(ТаблицаКоманд,
"Упаковочный лист",
"ПечатьЛистаСПараметрами",
"ОткрытиеФормы",
Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Ключевым здесь является параметр Использование со значением "ОткрытиеФормы". Когда пользователь нажимает кнопку в меню печати, БСП видит этот флаг и вместо вызова метода модуля запускает основную форму вашей обработки.
Когда БСП открывает форму внешней обработки, она автоматически передает в нее структуру Параметры. Одним из ключевых элементов этой структуры является ОбъектыНазначения — это массив, содержащий ссылки на объекты, для которых была вызвана команда печати.
Разберем, как правильно перехватить эти данные в модуле формы. Для этого нам понадобится стандартный обработчик ПриСозданииНаСервере. Рекомендуется создать на форме реквизит (например, с именем СсылкаНаОбъект), чтобы хранить ссылку на документ в течение всего времени работы с формой.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие параметра "ОбъектыНазначения"
Если Параметры.Свойство("ОбъектыНазначения") Тогда
МассивОбъектов = Параметры.ОбъектыНазначения;
// Если печатаем один документ, берем первый элемент массива
Если МассивОбъектов.Количество() > 0 Тогда
ОбъектПечати = МассивОбъектов[0];
// Записываем ссылку в реквизит формы для дальнейшего использования
ЭтаФорма.СсылкаНаДокумент = ОбъектПечати;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой используется массив: БСП поддерживает групповую печать. Если пользователь выделил в списке пять документов и нажал "Печать", в массив ОбъектыНазначения попадут все пять ссылок. Если ваша форма предполагает ввод уточняющих данных сразу для всех документов, вам следует сохранить весь массив.
После того как пользователь заполнил необходимые поля на форме и нажал кнопку "Печать", нам нужно сформировать печатную форму. Хорошим тоном считается хранение логики формирования макета в модуле объекта обработки. Чтобы вызвать метод модуля объекта из модуля формы, используем функцию РеквизитФормыВЗначение.
Рассмотрим пример функции печати на форме:
&НаСервере
Функция СформироватьПечатнуюФормуНаСервере()
// Получаем экземпляр обработки из реквизита "Объект"
ВнешняяОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// Подготавливаем массив объектов (даже если он один)
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(ЭтаФорма.СсылкаНаДокумент);
// Вызываем экспортную функцию из модуля объекта
// Передаем ссылку и, если нужно, данные с формы (например, реквизит "Комментарий")
ТабличныйДокумент = ВнешняяОбработкаОбъект.СформироватьПечать(МассивСсылок, ЭтаФорма.ДополнительныйКомментарий);
Возврат ТабличныйДокумент;
КонецФункции
Проанализируем ситуацию в модуле объекта. Там должна располагаться экспортная функция, которая принимает ссылки и дополнительные параметры, полученные из формы. Это позволяет разделять интерфейсную логику (форма) и логику формирования данных (модуль объекта).
Функция СформироватьПечать(МассивОбъектов, ДопТекст) Экспорт
ТабДок = Новый ТабличныйДокумент;
// Типовой обход объектов для печати
Для Каждого СсылкаИзСписка Из МассивОбъектов Цикл
// Здесь мы уже можем обращаться к данным объекта: СсылкаИзСписка.Дата, СсылкаИзСписка.Номер и т.д.
// Используем ДопТекст, переданный из формы
// Код заполнения макета...
КонецЦикла;
Возврат ТабДок;
КонецФункции
Если МассивОбъектов.Количество() > 1 Тогда Сообщить("Выберите только один объект"); КонецЕсли;.СведенияОВнешнейОбработке параметр БезопасныйРежим лучше устанавливать в Ложь, если вам требуются расширенные права.Параметры.ИдентификаторКоманды внутри ПриСозданииНаСервере, чтобы понять, какой именно макет собирается печатать пользователь.ОбъектыНазначения, БСП передает параметр ДополнительныеОтчетыИОбработкиСсылка. Это ссылка на элемент справочника, где зарегистрирована ваша обработка. Она полезна, если нужно прочитать какие-то настройки, сохраненные в карточке дополнительной обработки в самой базе данных.Таким образом, мы рассмотрели полный цикл передачи данных: от регистрации команды в системе до получения ссылок в форме и возврата сформированного документа. Использование стандартных параметров БСП делает вашу разработку универсальной и надежной.