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