Разработка и доработка функционала в 1С:ERP часто требует создания собственных печатных форм документов, не изменяя при этом типовую конфигурацию. Это критически важно для сохранения системы на поддержке и упрощения будущих обновлений. Внешние печатные формы (ВПФ) — это мощный инструмент, позволяющий реализовать такие задачи. Однако одной из первых сложностей, с которой мы можем столкнуться при создании ВПФ, является поиск того места, где типовая конфигурация собирает данные для стандартной печатной формы, чтобы мы могли использовать этот же механизм для своей внешней формы.
В этом руководстве мы подробно рассмотрим, как найти запрос данных для печатной формы документа "Заказ клиента" в 1С:ERP, а затем разберем процесс создания и подключения внешней печатной формы, опираясь на найденные механизмы.
Внешняя печатная форма представляет собой отдельный файл с расширением ".epf", который содержит программный код на языке 1С и макеты для печати. Она позволяет нам создавать уникальные формы документов, отчетов или обработок без внесения изменений в основной код типовой конфигурации. Это значительно упрощает процесс обновления системы, так как изменения, внесенные во внешние печатные формы, не затрагиваются при обновлении конфигурации, а значит, нам не придется каждый раз адаптировать типовые объекты.
Для документа "Заказ клиента" в 1С:ERP, создание ВПФ позволяет адаптировать внешний вид заказа, добавлять специфическую информацию (например, изображения номенклатуры, дополнительные поля), изменять структуру таблицы товаров или услуг, или даже формировать совершенно новые виды документов на основе данных заказа.
Наша основная задача — найти процедуру, которая отвечает за сбор всех необходимых данных из базы данных для формирования печатной формы "Заказ клиента". Этот процесс не всегда очевиден, но мы разберем его по шагам.
Обычно регистрация команд печати для документов происходит в модуле менеджера соответствующего объекта. Для "Заказа клиента" мы должны начать поиск в Модуле менеджера документа ЗаказКлиента.
Документы -> ЗаказКлиента.Модуль менеджера.ДобавитьКомандыПечати. Эта процедура отвечает за добавление команд печати в список доступных для данного документа.Внутри процедуры ДобавитьКомандыПечати мы обнаружим, как система регистрирует команды печати. Особое внимание следует обратить на строки, где определяется менеджер печати.
Пример кода, который мы можем найти:
// ...
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Идентификатор = "ЗаказКлиента";
КомандаПечати.Представление = НСтр("ru = 'Заказ клиента'");
КомандаПечати.МенеджерПечати = "Обработка.ПечатьЗаказовНаТоварыУслуги"; // Это то, что нам нужно!
КомандаПечати.Использование = "ВызовСерверногоМетода";
КомандаПечати.Порядок = 10;
// ...
Строка КомандаПечати.МенеджерПечати = "Обработка.ПечатьЗаказовНаТоварыУслуги"; указывает на то, какая обработка отвечает за формирование печатной формы "Заказ клиента". В данном случае это будет внешняя обработка или объект конфигурации Обработка.ПечатьЗаказовНаТоварыУслуги.
Теперь, зная имя обработки, которая управляет печатью, мы переходим к ней.
Обработки -> ПечатьЗаказовНаТоварыУслуги.СформироватьПечатнуюФормуЗаказаКлиента.Эта процедура будет содержать логику формирования печатной формы: она получает данные, передает их в макет и возвращает сформированный табличный документ.
Внутри процедуры, найденной на предыдущем шаге (например, СформироватьПечатнуюФормуЗаказаКлиента), мы обнаружим вызов другой процедуры, которая занимается непосредственным получением данных из базы. В нашем случае, наиболее вероятно, это будет вызов процедуры из Модуля менеджера документа ЗаказКлиента.
Искомый запрос, который собирает данные для печатной формы "Заказ клиента", находится в процедуре ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги, расположенной в Модуле менеджера документа ЗаказКлиента.
Таким образом, полный путь к процедуре, содержащей данные для печати, выглядит так: Документ.ЗаказКлиента.МодульМенеджера.ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги.
Именно эта процедура является ключевой, поскольку она выполняет запросы к базе данных, собирает информацию о заказе, его позициях, контрагентах, ценах и прочих реквизитах, которые затем используются для заполнения печатного макета.
Теперь, когда мы знаем, откуда получать данные, приступим к созданию самой внешней печатной формы.
Файл -> Новый.Внешняя обработка и нажмите ОК..epf в удобное для вас место.Макет определяет внешний вид нашей печатной формы. Мы можем создать его непосредственно в конфигураторе.
Макеты и выберите Добавить макет табличного документа.МакетЗаказКлиента.[НомерДокумента], [ДатаДокумента], [НаименованиеНоменклатуры]). Эти параметры будут заполняться из данных, полученных программно.В Модуле объекта нашей внешней обработки мы должны реализовать две ключевые экспортные процедуры/функции для ее корректной работы.
1. Функция СведенияОВнешнейОбработке():
Эта функция возвращает структуру с метаданными о нашей обработке, позволяя системе 1С:Предприятие правильно ее подключить и зарегистрировать. Она должна быть экспортной.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Наименование", НСтр("ru = 'Мой Заказ клиента (Внешняя)"));
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма для документа Заказ клиента");
// Создаем таблицу команд
ТаблицаКоманд = Новый ТаблицаЗначений;
ТаблицаКоманд.Колонки.Добавить("Идентификатор");
ТаблицаКоманд.Колонки.Добавить("Представление");
ТаблицаКоманд.Колонки.Добавить("Модификатор");
ТаблицаКоманд.Колонки.Добавить("Проверка");
ТаблицаКоманд.Колонки.Добавить("ПоказыватьВФорме");
ТаблицаКоманд.Колонки.Добавить("РежимИспользования");
// Добавляем команду печати для Заказа клиента
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Идентификатор = "ПечатьМойЗаказКлиента"; // Уникальный идентификатор команды
НоваяКоманда.Представление = НСтр("ru = 'Мой Заказ клиента'"); // Текст, который увидит пользователь
НоваяКоманда.Модификатор = "ЗаказКлиента"; // Объект, к которому привязывается печатная форма
НоваяКоманда.ПоказыватьВФорме = Истина; // Показывать в форме документа
НоваяКоманда.РежимИспользования = "ВызовСерверногоМетода"; // Способ вызова команды
// В некоторых случаях может потребоваться проверка, например, на заполненность полей
// НоваяКоманда.Проверка = "ПроверкаПечати"; // Имя экспортной процедуры в модуле объекта
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
2. Процедура Печать():
Эта процедура является основной логикой формирования печатной формы. Она принимает на вход массив ссылок на печатаемые объекты, а также дополнительные параметры. Внутри этой процедуры мы будем вызывать найденную ранее процедуру сбора данных.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если МассивОбъектов.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// Получаем ссылку на первый объект (если печатаем несколько, можно перебрать в цикле)
СсылкаНаОбъект = МассивОбъектов[0];
// Получаем макет
Макет = ПолучитьМакет("МакетЗаказКлиента"); // Имя нашего макета
// Создаем табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаказКлиента_" + СсылкаНаОбъект.УникальныйИдентификатор();
// Заполняем табличный документ данными.
// Здесь мы вызываем ту самую процедуру, которую нашли!
ДанныеДляПечати = Документы.ЗаказКлиента.ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги(СсылкаНаОбъект);
// Если типовая процедура возвращает структуру,
// то нам нужно разобрать ее и заполнить наш макет.
// Пример примитивного заполнения (нужно адаптировать под структуру ДанныеДляПечати)
Если ДанныеДляПечати <> Неопределено Тогда
ОбластьШапка = Макет.ПолучитьОбласть("Шапка"); // Предполагаем, что есть область Шапка
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаТовара"); // Предполагаем, что есть область СтрокаТовара
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал"); // Предполагаем, что есть область Подвал
// Заполняем шапку
ОбластьШапка.Параметры.НомерДокумента = ДанныеДляПечати.Номер;
ОбластьШапка.Параметры.ДатаДокумента = ДанныеДляПечати.Дата;
ОбластьШапка.Параметры.Контрагент = ДанныеДляПечати.Контрагент.Наименование;
// ... другие параметры шапки
ТабличныйДокумент.Вывести(ОбластьШапка);
// Заполняем табличную часть
Если ДанныеДляПечати.Товары.Количество() > 0 Тогда
Для Каждого СтрокаТабЧасти Из ДанныеДляПечати.Товары Цикл
ОбластьСтрока.Параметры.Номенклатура = СтрокаТабЧасти.Номенклатура;
ОбластьСтрока.Параметры.Количество = СтрокаТабЧасти.Количество;
ОбластьСтрока.Параметры.Цена = СтрокаТабЧасти.Цена;
ОбластьСтрока.Параметры.Сумма = СтрокаТабЧасти.Сумма;
// ... другие параметры строки
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
КонецЕсли;
// Заполняем подвал
ОбластьПодвал.Параметры.ВсегоСумма = ДанныеДляПечати.СуммаДокумента;
// ... другие параметры подвала
ТабличныйДокумент.Вывести(ОбластьПодвал);
КонецЕсли;
// Добавляем табличный документ в коллекцию печатных форм
КоллекцияПечатныхФорм.Добавить(ТабличныйДокумент, "МойЗаказКлиента", "Мой Заказ клиента");
КонецПроцедуры
В этой процедуре мы получаем ссылку на документ, получаем макет, вызываем типовую процедуру ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги для сбора данных, а затем используем эти данные для заполнения нашего макета и формирования табличного документа.
После того как мы создали и сохранили нашу внешнюю печатную форму (файл .epf), ее необходимо подключить в режиме "1С:Предприятие".
НСИ и администрирование.Печатные формы, отчеты и обработки убедитесь, что установлен флажок Дополнительные отчеты и обработки.Дополнительные отчеты и обработки.Добавить из файла.....epf.Размещение, указывающее на объекты, из которых будет вызываться печатная форма (в нашем случае это должен быть документ Заказ клиента).Заказ клиента и нажатии на кнопку Печать, в списке доступных печатных форм появится наша новая форма с названием "Мой Заказ клиента".ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги.Файл -> Открыть в Конфигураторе, а затем установить точки останова в ее модулях. Запустите 1С:Предприятие в режиме отладки и вызовите печать из документа "Заказ клиента". Отладчик остановится на установленных точках.ПолучитьДанныеДляПечатнойФормыЗаказаНаТоварыУслуги может не возвращать их напрямую. В таком случае, после получения основных данных, нам потребуется дополнительно получить данные изображений, используя механизмы работы с хранилищем файлов или прикрепленными файлами.Следуя этим шагам, мы сможем эффективно находить источники данных для типовых печатных форм и создавать свои собственные внешние печатные формы для документа "Заказ клиента" в 1С:ERP, расширяя функционал системы без изменения ее ядра.