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