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