В процессе адаптации и доработки систем класса 1С:ERP программисты часто сталкиваются с необходимостью вывода нескольких печатных форм (макетов) для одного документа. Пользователю гораздо удобнее видеть все доступные варианты печати в одном выпадающем меню стандартной кнопки «Печать», нежели иметь дело с россыпью разрозненных кнопок на форме. В этой статье мы подробно разберем, как реализовать такую задачу стандартными и наиболее корректными методами платформы 1С:Предприятие 8.3.
Исходя из архитектурных стандартов современных типовых конфигураций (к которым относится и 1С:ERP), задачу можно решить двумя основными путями:
Давайте детально проанализируем оба способа, изучим примеры программного кода и выясним особенности настройки каждого подхода.
Если вы дорабатываете документ непосредственно в конфигурации или используете механизм расширений, наиболее правильным решением будет интеграция в штатную подсистему печати БСП. Это обеспечит бесшовную работу интерфейса и позволит использовать все стандартные сервисные функции платформы.
Рассмотрим пошагово, как зарегистрировать документ и вывести несколько команд печати.
Шаг 1. Регистрация документа в подсистеме БСП
Для того чтобы система знала, что у нашего документа есть подключаемые команды печати, его необходимо зарегистрировать в общем модуле УправлениеПечатьюПереопределяемый в процедуре ПриОпределенииОбъектовСКомандамиПечати. Мы добавляем наш документ в список объектов:
Процедура ПриОпределенииОбъектовСКомандамиПечати(СписокОбъектов) Экспорт
СписокОбъектов.Добавить(Документы.ИмяВашегоДокумента);
КонецПроцедуры
Примечание: В актуальных версиях БСП 3.x может также потребоваться аналогичная регистрация в общем модуле ПодключаемыеКомандыПереопределяемый в процедуре УниверсальнаяСтруктураОписанияОбъектовПодключаемыхКоманд.
Шаг 2. Определение списка печатных форм в модуле менеджера
Перейдем в модуль менеджера нашего документа (или в аналогичный модуль расширения). Здесь нам необходимо создать экспортную процедуру ДобавитьКомандыПечати. Именно в ней мы описываем, какие именно кнопки и макеты будут доступны пользователю.
Каждая печатная форма регистрируется как отдельная команда, добавляемая в коллекцию КомандыПечати:
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
// Описание первой печатной формы
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "МакетАкта";
КомандаПечати.Представление = "Акт выполненных работ (наш макет)";
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
// Описание второй печатной формы
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "МакетНакладной";
КомандаПечати.Представление = "Накладная (внутренняя)";
КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
КонецПроцедуры
Шаг 3. Обработка формирования печатных форм
После того как команды зарегистрированы, нам необходимо описать логику их выполнения. В том же модуле менеджера создаем или редактируем экспортную процедуру Печать. В ней система передает нам коллекцию печатных форм, которые выбрал пользователь. Наша задача — проверить, какой именно идентификатор был вызван, сформировать табличный документ и вернуть его обратно в коллекцию.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Проверяем необходимость формирования первого макета
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "МакетАкта") Тогда
ТабДок = СформироватьАктВыполненныхРабот(МассивОбъектов, ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"МакетАкта",
"Акт выполненных работ (наш макет)",
ТабДок
);
КонецЕсли;
// Проверяем необходимость формирования второго макета
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "МакетНакладной") Тогда
ТабДок = СформироватьВнутреннююНакладную(МассивОбъектов, ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"МакетНакладной",
"Накладная (внутренняя)",
ТабДок
);
КонецЕсли;
КонецПроцедуры
Функции СформироватьАктВыполненныхРабот и СформироватьВнутреннююНакладную должны возвращать заполненный объект типа ТабличныйДокумент.
Шаг 4. Инициализация кнопки на управляемой форме документа
Для того чтобы стандартная кнопка «Печать» автоматически отрисовалась на управляемой форме и заполнилась нашими командами, в модуле формы документа необходимо прописать стандартный вызов обработчиков БСП в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Подключение стандартных команд печати БСП
УправлениеПечатью.ПриСозданииНаСервере(ЭтаФорма);
КонецПроцедуры
А на клиенте объявляем обработчик нажатия на динамически созданные команды печати:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуПечати(Команда, Источник) Экспорт
УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати(Команда, ЭтаФорма, Объект);
КонецПроцедуры
Если вы не хотите вносить изменения в саму конфигурацию или создавать расширения, идеальным решением станет использование механизма дополнительных отчетов и обработок. Многие разработчики ошибочно полагают, что для двух разных макетов нужно создавать две отдельные внешние обработки (файлы .epf). На самом деле стандарт БСП позволяет зарегистрировать множество команд печати внутри одного файла ВПФ.
Давайте разберем, как это реализовать.
Шаг 1. Описание регистрации нескольких команд
В модуле внешней обработки создаем обязательную экспортную функцию СведенияОВнешнейОбработке. При заполнении таблицы команд мы добавляем столько строк, сколько печатных форм нам требуется вывести:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.0.1.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Назначение.Добавить("Документ.ИмяВашегоДокумента");
ПараметрыРегистрации.Наименование = "Пакет наших печатных форм";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Добавляем команду для первого макета (Вариант 1)
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Спецификация (Вариант 1)";
НоваяКоманда.Идентификатор = "СпецификацияВариант1";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";
// Добавляем команду для второго макета (Вариант 2)
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Спецификация (Вариант 2)";
НоваяКоманда.Идентификатор = "СпецификацияВариант2";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Шаг 2. Разделение логики в процедуре Печать() внешней обработки
В модуле объекта внешней обработки должна присутствовать экспортная процедура Печать, которая вызывается платформой при нажатии пользователем на соответствующую кнопку в интерфейсе 1С:ERP. Мы анализируем переданную коллекцию макетов по их идентификаторам, заданным на шаге регистрации:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СпецификацияВариант1") Тогда
ТабДок = СформироватьСпецификациюВариант1(МассивОбъектов);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СпецификацияВариант1",
"Спецификация (Вариант 1)",
ТабДок
);
ИначеЕсли УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СпецификацияВариант2") Тогда
ТабДок = СформироватьСпецификациюВариант2(МассивОбъектов);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"СпецификацияВариант2",
"Спецификация (Вариант 2)",
ТабДок
);
КонецЕсли;
КонецПроцедуры
После подключения этой обработки в режиме «1С:Предприятие» (через меню НСИ и администрирование — Печатные формы, отчеты и обработки) у целевого документа в кнопке «Печать» автоматически появятся два новых пункта.
При использовании стандартных механизмов печати БСП нам открывается доступ к ряду удобных и профессиональных возможностей платформы:
Подводя итог, отметим, что выбор конкретного способа зависит от ваших задач по обновлению конфигурации: если вы минимизируете изменения в основной конфигурации, лучшим решением станет единая многомакетная Внешняя печатная форма. Если же документ является полностью вашей разработкой, логичнее внедрить код напрямую в модуль менеджера по стандартам БСП.