Как сделать несколько вариантов заменяющих макетов для одной типовой печатной формы в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В типовых конфигурациях 1С (таких как ERP, Комплексная автоматизация 2, Управление торговлей 11), разработанных на базе Библиотеки стандартных подсистем (БСП), справочник «Макеты печатных форм» позволяет пользователю отредактировать и сохранить только один альтернативный вариант макета для каждой печатной формы. Создать «Вариант А», «Вариант Б» и «Вариант В» для одной и той же кнопки печати стандартными интерактивными средствами системы невозможно.

Копирование типового кода формирования, например, счета-фактуры во внешнюю печатную форму (ВПФ) — крайне трудоемкий процесс. Из-за регулярных изменений законодательства и обновлений релизов скопированный код быстро теряет актуальность, что может привести к ошибкам в расчетах или неверному выводу реквизитов. Рассмотрим более надежные и изящные технические решения этой задачи, которые минимизируют риски при обновлениях конфигурации и будут удобны для конечных пользователей.

В этой статье мы разберем три основных сценария реализации этой задачи:

  1. Использование механизма расширений для модификации готового табличного документа (наиболее безопасный программный метод).
  2. Добавление нескольких команд печати с использованием дополнительных параметров (БСП-ориентированный метод).
  3. Использование механизма «Дополнительных реквизитов и сведений» (Low-code/No-code подход).

---

Вариант 1. Модификация готового Табличного Документа через Расширение

Для того чтобы не зависеть от обновлений макетов и логики формирования документов (например, счета-фактуры или УПД), мы можем использовать расширение конфигурации. Вместо полной замены макета мы перехватим уже готовый, сформированный системой ТабличныйДокумент перед выводом его на печать или экран, найдем в нем нужные области и точечно заменим текст.

Разберем этот процесс по шагам:

  1. Создаем новое расширение конфигурации.
  2. В модуле менеджера соответствующего документа или в общем модуле печати находим процедуру, отвечающую за генерацию печатной формы (например, ПечатьСчетаФактуры).
  3. Перехватываем данную процедуру с помощью аннотации &После или &Вместо.
  4. В коде расширения анализируем структуру полученного табличного документа и вносим необходимые текстовые изменения в нужные ячейки.

Посмотрим на пример кода в расширении для модуля менеджера документа:


&После("Печать")
Процедура Расш1_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
    
    // Находим в коллекции нужную печатную форму
    СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти("СчетФактура", "ИмяВКоллекции");
    Если СтрокаПечатнойФормы <> Неопределено Тогда
        
        ТабДок = СтрокаПечатнойФормы.ТабличныйДокумент;
        
        // Перебираем области табличного документа для поиска нужных текстовых маркеров
        Для Каждого Область Из ТабДок.Области Цикл
            // Если находим ячейку с определенным текстом-шаблоном, заменяем его
            Если Найти(Область.Текст, "[МояВставка]") > 0 Тогда
                // Здесь мы можем реализовать логику выбора текста в зависимости от условий
                ТекстЗамены = ПолучитьНужныйТекстДляВставки(ПараметрыПечати);
                Область.Текст = СтрЗаменить(Область.Текст, "[МояВставка]", ТекстЗамены);
            КонецЕсли;
        КонецЦикла;
        
    КонецЕсли;

КонецПроцедуры

Преимущество метода: Если фирма «1С» обновит форму счета-фактуры (добавит новые колонки, изменит формулировки строк), ваш код не сломается, поскольку он не содержит скопированных макетов, а работает с уже сформированным итоговым объектом ТабличныйДокумент.

---

Вариант 2. Использование дополнительных параметров в командах печати БСП

Часто возникает вопрос: как передать на сервер информацию о том, какой именно вариант текста хочет видеть пользователь, ведь печать формируется на сервере, где интерактивный диалог (открытие окон вопросов) невозможен?

Для решения этой проблемы Библиотека стандартных подсистем предоставляет механизм Дополнительных параметров команды печати. Мы можем зарегистрировать в меню «Печать» несколько отдельных кнопок (например: «Счет-фактура (Вариант А)», «Счет-фактура (Вариант Б)»), каждая из которых будет автоматически передавать на сервер свой уникальный признак.

Проанализируем ситуацию на примере добавления команд печати в модуле менеджера через расширение:


&После("ДобавитьКомандыПечати")
Процедура Расш1_ДобавитьКомандыПечати(КомандыПечати)
    
    // Регистрируем Вариант А
    КомандаА = КомандыПечати.Добавить();
    КомандаА.Представление = НСтр("ru = 'Счет-фактура (с текстом о доставке)'");
    КомандаА.Идентификатор = "СчетФактура_ВариантДоставка";
    КомандаА.ДополнительныеПараметры = Новый Структура("ВариантМакета", "Доставка");
    
    // Регистрируем Вариант Б
    КомандаБ = КомандыПечати.Добавить();
    КомандаБ.Представление = НСтр("ru = 'Счет-фактура (с реквизитами банка)'");
    КомандаБ.Идентификатор = "СчетФактура_ВариантБанк";
    КомандаБ.ДополнительныеПараметры = Новый Структура("ВариантМакета", "Банк");
    
КонецПроцедуры

При нажатии пользователем любой из этих кнопок управление передается на сервер в процедуру печати. Структура ДополнительныеПараметры передается в процедуру формирования печатной формы автоматически:


&Вместо("СформироватьПечатнуюФормуСчетФактура")
Функция Расш1_СформироватьПечатнуюФормуСчетФактура(СсылкаНаДокумент, ПараметрыПечати)
    
    Вариант = "";
    Если ПараметрыПечати.Свойство("ВариантМакета") Тогда
        Вариант = ПараметрыПечати.ВариантМакета;
    КонецЕсли;
    
    // Вызываем стандартное формирование
    ТабДокумент = ПродолжитьВызов(СсылкаНаДокумент, ПараметрыПечати);
    
    // Применяем логику в зависимости от переданного параметра
    Если Вариант = "Доставка" Тогда
        // Дописываем в подвал информацию о доставке
        ДописатьТекстОДоставке(ТабДокумент);
    ИначеЕсли Вариант = "Банк" Тогда
        // Дописываем информацию о банке
        ДописатьТекстОБанке(ТабДокумент);
    КонецЕсли;
    
    Возврат ТабДокумент;
    
КонецФункции

Преимущество метода: Полное отсутствие навязчивых диалоговых окон для пользователя. Выбор конкретного варианта макета происходит в один клик непосредственно из стандартного меню «Печать».

---

Вариант 3. Использование «Дополнительных реквизитов» (Почти без программирования)

Выясним причину, по которой пользователям нужны разные макеты. Очень часто разные текстовые вставки зависят от условий конкретной сделки (например, разные условия доставки для разных договоров или специфика конкретной организации). В таком случае плодить множество кнопок печати не имеет смысла.

Мы можем использовать типовой механизм Дополнительных реквизитов и сведений 1С:

  1. В режиме «1С:Предприятие» в разделе «Администрирование» -> «Общие настройки» -> «Дополнительные реквизиты и сведения» добавим для нашего документа новый реквизит (например, «Текстовая вставка для СФ» с типом Строка или ссылкой на справочник дополнительных значений).
  2. Пользователь при заполнении документа выбирает нужное текстовое значение прямо на форме документа в блоке дополнительных реквизитов.
  3. В режиме «Макеты печатных форм» открываем для редактирования макет нужной печатной формы.
  4. Выбираем ячейку, где должна выводиться вставка. Меняем тип ячейки со «Текст» на «Шаблон» и прописываем имя нашего дополнительного реквизита в квадратных скобках (например, [ДополнительныйРеквизит.ТекстоваяВставкаДляСФ]).

При выводе на печать БСП автоматически обратится к дополнительным свойствам объекта, получит записанное пользователем значение и выведет его в печатную форму без написания кода в конфигураторе.

---

Резюме

Выбор конкретного решения зависит от сложности ваших требований:

← На главную