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