Как создать динамический шаблон договора с контрагентом в 1С, чтобы текст менялся в зависимости от его типа?

Программист 1С v8.3 (Управляемые формы)
← К списку

Мы часто сталкиваемся с необходимостью формировать договоры, текст которых должен меняться в зависимости от различных условий, например, от типа контрагента (юридическое или физическое лицо), формы налогообложения или специфики сделки. Ручное изменение каждого договора — процесс трудоемкий и чреватый ошибками. Давайте вместе разберем, как автоматизировать этот процесс в 1С, создавая гибкие и динамичные шаблоны.

Мы рассмотрим несколько подходов, от программной реализации до использования встроенных механизмов, чтобы вы могли выбрать наиболее подходящий для вашей ситуации.

Программный подход: Управление текстом договора через код и параметры макета

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

  1. Создание и подготовка макета печатной формы:

    Для начала нам потребуется создать или открыть существующий макет печатной формы договора в конфигураторе. В этом макете мы определяем области и параметры, которые будут заполняться из кода. Важно понимать, что макеты в 1С 8.х не вычисляют выражения напрямую в своих ячейках. Они лишь выводят значения, которые мы им передадим.

    Представьте, что в макете у нас есть место для подстановки информации о контрагенте. Мы можем обозначить это место как параметр, например, [СтрокаКонтрагент]. Вы также можете определить именованные области макета, чтобы управлять выводом целых абзацев или разделов договора.

  2. Подготовка данных в модуле объекта или команды:

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

    Предположим, у нас есть объект Контрагент, который содержит информацию о типе контрагента. Мы можем использовать условные операторы для определения нужного текста:

    
    Перем СтрокаКонтрагент;
    Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮридическоеЛицо Тогда
        СтрокаКонтрагент = "юридическое лицо";
    ИначеЕсли Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизическоеЛицо Тогда
        СтрокаКонтрагент = "физическое лицо";
    Иначе
        СтрокаКонтрагент = "неизвестное лицо"; // Например, для других типов или ошибок
    КонецЕсли;
    

    В этом примере мы проверяем тип контрагента, используя стандартный перечислимый тип Перечисления.ЮрФизЛицо, и присваиваем соответствующую строку переменной СтрокаКонтрагент.

    Для более простых случаев, где нужно выбрать одно из нескольких значений, можно использовать оператор Выбор, который часто называют аналогом тернарного оператора в 1С:

    
    СтрокаКонтрагент = Выбор Когда Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮридическоеЛицо Тогда
                            "юридическое лицо"
                        Иначе
                            "физическое лицо"
                        Конец;
    
  3. Передача параметров в макет и вывод областей:

    После того как мы сформировали все необходимые строки и значения, их нужно передать в структуру данных, которая затем будет использоваться для заполнения макета. Обычно для этого используется объект Структура, а затем метод Вставить для добавления параметров.

    
    // Создаем структуру для хранения параметров
    ПараметрыМакета = Новый Структура;
    
    // Добавляем ранее сформированную строку
    ПараметрыМакета.Вставить("СтрокаКонтрагент", СтрокаКонтрагент);
    
    // Добавляем другие параметры, например, реквизиты контрагента или договора
    ПараметрыМакета.Вставить("НомерДоговора", ОбъектДоговора.Номер);
    ПараметрыМакета.Вставить("ДатаДоговора", ОбъектДоговора.Дата);
    ПараметрыМакета.Вставить("ПолноеНаименованиеКонтрагента", Контрагент.НаименованиеПолное);
    ПараметрыМакета.Вставить("ИННКонтрагента", Контрагент.ИНН);
    
    // Получаем макет
    Макет = ПолучитьМакет("МакетДоговора");
    
    // Получаем область макета, которую будем заполнять
    // Например, если у нас есть область "Шапка"
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    
    // Заполняем параметры области
    ОбластьШапка.Параметры.Заполнить(ПараметрыМакета);
    
    // Выводим область в табличный документ
    ТабличныйДокумент.Вывести(ОбластьШапка);
    
    // Если у нас есть условные области
    Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮридическоеЛицо Тогда
        ОбластьДляЮрЛиц = Макет.ПолучитьОбласть("РазделДляЮрЛиц");
        ОбластьДляЮрЛиц.Параметры.Заполнить(ПараметрыМакета);
        ТабличныйДокумент.Вывести(ОбластьДляЮрЛиц);
    Иначе
        ОбластьДляФизЛиц = Макет.ПолучитьОбласть("РазделДляФизЛиц");
        ОбластьДляФизЛиц.Параметры.Заполнить(ПараметрыМакета);
        ТабличныйДокумент.Вывести(ОбластьДляФизЛиц);
    КонецЕсли;
    

    Этот подход с использованием областей макета позволяет нам динамически выводить разные блоки текста, целые абзацы или даже разделы договора в зависимости от условий, что обеспечивает максимальную гибкость.

Встроенные "Шаблоны договоров" в современных конфигурациях

В современных версиях 1С:Бухгалтерия 8.3 (начиная с релиза 3.0.37.21) и 1С:Управление нашей фирмой (УНФ) появился значительно упрощенный функционал для создания и использования "Шаблонов договоров". Этот метод ориентирован на пользователей без глубоких навыков программирования.

  1. Доступ к функционалу:

    Обычно этот раздел находится в "Справочниках" или в блоке "CRM" конфигурации. Мы можем создать новый шаблон договора или отредактировать существующий.

  2. Создание шаблона:

    Встроенный редактор позволяет оформить текст договора один раз, используя форматирование текста (шрифты, цвета), вставлять изображения (например, логотип). Для автоматической подстановки данных используются специальные параметры, которые выделяются цветом или заключаются в фигурные скобки, например, [НашиРеквизиты], [РеквизитыКонтрагента], [НомерДоговора], [ДатаДоговора].

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

  3. Условный вывод:

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

Внешние печатные формы

Для более сложных и уникальных требований к печатным формам, включая договоры, мы можем разрабатывать внешние печатные формы. Это отдельные файлы (обычно с расширением .epf), которые подключаются к базе 1С и позволяют реализовать практически любую логику и дизайн без изменения основной конфигурации. Это особенно удобно при обновлениях, так как не требуется снимать конфигурацию с поддержки.

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

Работа с внешними документами (Microsoft Word / Open Office)

Существуют также подходы, при которых текст договора готовится во внешних текстовых редакторах (например, Microsoft Word в формате .docx или Open Office в .odt), а затем загружается в 1С. В этих документах также используются специальные метки-параметры, которые 1С заменяет на данные из своей базы.

Этот метод может быть удобен, если у вас уже есть готовые шаблоны в этих форматах, и вы хотите сохранить привычный вид и функционал редактирования.

Советы по оптимизации и альтернативные подходы

  1. Оптимизация производительности: При формировании печатных форм для нескольких объектов (например, пакетная печать) рекомендуется выполнять выборку всех необходимых данных в одном запросе. Это значительно снизит нагрузку на СУБД и повысит общую производительность системы.

  2. Использование двух шаблонов: Для простых случаев, когда отличия в тексте договора минимальны (например, только одно-два предложения), можно рассмотреть вариант создания двух отдельных шаблонов (или двух разных макетов). Это самый простой, "непрограммный" способ, когда вся проверка и выбор нужного шаблона происходят до печати вручную или через простейший условный оператор выбора макета в коде.

  3. Тернарный оператор в 1С: Хотя в 1С нет прямого аналога тернарного оператора ? : как в некоторых других языках, мы уже рассмотрели, как оператор Выбор Когда ... Тогда ... Иначе ... Конец позволяет кратко формировать значения в зависимости от условий, что является его функциональным эквивалентом для таких задач.

Выбирая подходящий метод, мы должны учитывать сложность требуемой логики, версию конфигурации 1С и уровень подготовки пользователя. Комбинируя эти подходы, мы сможем создать по-настоящему гибкие и эффективные системы формирования договорных документов в 1С.

← К списку