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