Мы часто сталкиваемся с необходимостью формировать договоры, текст которых должен меняться в зависимости от различных условий, например, от типа контрагента (юридическое или физическое лицо), формы налогообложения или специфики сделки. Ручное изменение каждого договора — процесс трудоемкий и чреватый ошибками. Давайте вместе разберем, как автоматизировать этот процесс в 1С, создавая гибкие и динамичные шаблоны.
Мы рассмотрим несколько подходов, от программной реализации до использования встроенных механизмов, чтобы вы могли выбрать наиболее подходящий для вашей ситуации.
Это классический и наиболее гибкий подход, который позволяет реализовать практически любую логику изменения текста договора. Мы будем подготавливать данные в коде 1С, а затем передавать их в макет печатной формы.
Создание и подготовка макета печатной формы:
Для начала нам потребуется создать или открыть существующий макет печатной формы договора в конфигураторе. В этом макете мы определяем области и параметры, которые будут заполняться из кода. Важно понимать, что макеты в 1С 8.х не вычисляют выражения напрямую в своих ячейках. Они лишь выводят значения, которые мы им передадим.
Представьте, что в макете у нас есть место для подстановки информации о контрагенте. Мы можем обозначить это место как параметр, например, [СтрокаКонтрагент]. Вы также можете определить именованные области макета, чтобы управлять выводом целых абзацев или разделов договора.
Подготовка данных в модуле объекта или команды:
Основная логика формирования текста происходит в программном коде. Здесь мы анализируем условия (например, тип контрагента) и на их основе формируем нужные строки или значения, которые затем будут переданы в макет. Рассмотрим подробнее, как это можно сделать.
Предположим, у нас есть объект Контрагент, который содержит информацию о типе контрагента. Мы можем использовать условные операторы для определения нужного текста:
Перем СтрокаКонтрагент;
Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮридическоеЛицо Тогда
СтрокаКонтрагент = "юридическое лицо";
ИначеЕсли Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизическоеЛицо Тогда
СтрокаКонтрагент = "физическое лицо";
Иначе
СтрокаКонтрагент = "неизвестное лицо"; // Например, для других типов или ошибок
КонецЕсли;
В этом примере мы проверяем тип контрагента, используя стандартный перечислимый тип Перечисления.ЮрФизЛицо, и присваиваем соответствующую строку переменной СтрокаКонтрагент.
Для более простых случаев, где нужно выбрать одно из нескольких значений, можно использовать оператор Выбор, который часто называют аналогом тернарного оператора в 1С:
СтрокаКонтрагент = Выбор Когда Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮридическоеЛицо Тогда
"юридическое лицо"
Иначе
"физическое лицо"
Конец;
Передача параметров в макет и вывод областей:
После того как мы сформировали все необходимые строки и значения, их нужно передать в структуру данных, которая затем будет использоваться для заполнения макета. Обычно для этого используется объект Структура, а затем метод Вставить для добавления параметров.
// Создаем структуру для хранения параметров
ПараметрыМакета = Новый Структура;
// Добавляем ранее сформированную строку
ПараметрыМакета.Вставить("СтрокаКонтрагент", СтрокаКонтрагент);
// Добавляем другие параметры, например, реквизиты контрагента или договора
ПараметрыМакета.Вставить("НомерДоговора", ОбъектДоговора.Номер);
ПараметрыМакета.Вставить("ДатаДоговора", ОбъектДоговора.Дата);
ПараметрыМакета.Вставить("ПолноеНаименованиеКонтрагента", Контрагент.НаименованиеПолное);
ПараметрыМакета.Вставить("ИННКонтрагента", Контрагент.ИНН);
// Получаем макет
Макет = ПолучитьМакет("МакетДоговора");
// Получаем область макета, которую будем заполнять
// Например, если у нас есть область "Шапка"
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
// Заполняем параметры области
ОбластьШапка.Параметры.Заполнить(ПараметрыМакета);
// Выводим область в табличный документ
ТабличныйДокумент.Вывести(ОбластьШапка);
// Если у нас есть условные области
Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮридическоеЛицо Тогда
ОбластьДляЮрЛиц = Макет.ПолучитьОбласть("РазделДляЮрЛиц");
ОбластьДляЮрЛиц.Параметры.Заполнить(ПараметрыМакета);
ТабличныйДокумент.Вывести(ОбластьДляЮрЛиц);
Иначе
ОбластьДляФизЛиц = Макет.ПолучитьОбласть("РазделДляФизЛиц");
ОбластьДляФизЛиц.Параметры.Заполнить(ПараметрыМакета);
ТабличныйДокумент.Вывести(ОбластьДляФизЛиц);
КонецЕсли;
Этот подход с использованием областей макета позволяет нам динамически выводить разные блоки текста, целые абзацы или даже разделы договора в зависимости от условий, что обеспечивает максимальную гибкость.
В современных версиях 1С:Бухгалтерия 8.3 (начиная с релиза 3.0.37.21) и 1С:Управление нашей фирмой (УНФ) появился значительно упрощенный функционал для создания и использования "Шаблонов договоров". Этот метод ориентирован на пользователей без глубоких навыков программирования.
Доступ к функционалу:
Обычно этот раздел находится в "Справочниках" или в блоке "CRM" конфигурации. Мы можем создать новый шаблон договора или отредактировать существующий.
Создание шаблона:
Встроенный редактор позволяет оформить текст договора один раз, используя форматирование текста (шрифты, цвета), вставлять изображения (например, логотип). Для автоматической подстановки данных используются специальные параметры, которые выделяются цветом или заключаются в фигурные скобки, например, [НашиРеквизиты], [РеквизитыКонтрагента], [НомерДоговора], [ДатаДоговора].
При формировании документа эти параметры автоматически заполняются данными из информационной базы.
Условный вывод:
Хотя этот функционал упрощает работу, его возможности по реализации сложной условной логики (например, вывод разных абзацев в зависимости от типа контрагента) могут быть ограничены по сравнению с программным подходом. Однако для базовой подстановки реквизитов он очень удобен.
Для более сложных и уникальных требований к печатным формам, включая договоры, мы можем разрабатывать внешние печатные формы. Это отдельные файлы (обычно с расширением .epf), которые подключаются к базе 1С и позволяют реализовать практически любую логику и дизайн без изменения основной конфигурации. Это особенно удобно при обновлениях, так как не требуется снимать конфигурацию с поддержки.
Внешние печатные формы используют тот же программный подход с макетами и параметрами, но предоставляют разработчику полную свободу действий.
Существуют также подходы, при которых текст договора готовится во внешних текстовых редакторах (например, Microsoft Word в формате .docx или Open Office в .odt), а затем загружается в 1С. В этих документах также используются специальные метки-параметры, которые 1С заменяет на данные из своей базы.
Этот метод может быть удобен, если у вас уже есть готовые шаблоны в этих форматах, и вы хотите сохранить привычный вид и функционал редактирования.
Оптимизация производительности: При формировании печатных форм для нескольких объектов (например, пакетная печать) рекомендуется выполнять выборку всех необходимых данных в одном запросе. Это значительно снизит нагрузку на СУБД и повысит общую производительность системы.
Использование двух шаблонов: Для простых случаев, когда отличия в тексте договора минимальны (например, только одно-два предложения), можно рассмотреть вариант создания двух отдельных шаблонов (или двух разных макетов). Это самый простой, "непрограммный" способ, когда вся проверка и выбор нужного шаблона происходят до печати вручную или через простейший условный оператор выбора макета в коде.
Тернарный оператор в 1С: Хотя в 1С нет прямого аналога тернарного оператора ? : как в некоторых других языках, мы уже рассмотрели, как оператор Выбор Когда ... Тогда ... Иначе ... Конец позволяет кратко формировать значения в зависимости от условий, что является его функциональным эквивалентом для таких задач.
Выбирая подходящий метод, мы должны учитывать сложность требуемой логики, версию конфигурации 1С и уровень подготовки пользователя. Комбинируя эти подходы, мы сможем создать по-настоящему гибкие и эффективные системы формирования договорных документов в 1С.
← К списку