При работе с типовыми конфигурациями, такими как 1С:Управление торговлей 11.5, часто возникает задача автоматизации подготовки печатных форм договоров. Одной из самых трудоемких частей этой задачи является корректное склонение ФИО руководителей, названий контрагентов и должностей. В этой статье мы разберем, можно ли использовать платформенные механизмы склонения напрямую в редакторе шаблонов Word и как правильно организовать процесс подготовки данных.
Рассмотрим ситуацию: у нас есть шаблон договора в формате .docx, где в тексте встречаются теги вида [Номер] или [Дата]. Мы хотим добавить тег, который автоматически просклоняет имя партнера, например: [ПолучитьСклонениеСтроки(Партнер, "ПД=Дательный")]. К сожалению, парсер шаблонов Word, встроенный в 1С, работает по принципу простой подстановки значений из структуры данных. Он ищет точное совпадение имени параметра (ключа) внутри квадратных скобок и заменяет его на готовое строковое значение.
Проанализируем техническое ограничение: движок печати не является интерпретатором программного кода 1С. Он не умеет выполнять выражения внутри документа. Поэтому любая попытка прописать функцию в самом вордовском файле приведет к тому, что система просто не найдет параметр с таким длинным именем и оставит текст как есть или выведет пустоту. Таким образом, единственно верный путь — подготовить просклоненную строку заранее в коде конфигурации и передать её в шаблон как готовый параметр.
Начиная с версии платформы 8.3.13, в 1С появился встроенный лингвистический модуль. Это значительно упростило жизнь разработчикам, так как больше не нужно подключать внешние компоненты вроде NameDecl.dll или использовать платные веб-сервисы. Выясним, как работает эта функция.
Синтаксис функции выглядит следующим образом:
Результат = ПолучитьСклонениеСтроки(ИсходнаяСтрока, ПараметрыСклонения, ФорматнаяСтрока);
Разберем основные параметры, которые мы можем использовать для формирования данных договора:
"ПД=Родительный".Посмотрим на практический пример использования функции на стороне сервера:
// Получаем ФИО руководителя в дательном падеже
ФИОДательный = ПолучитьСклонениеСтроки("Петров Петр Петрович", "ПД=Дательный");
// Результат: "Петрову Петру Петровичу"
В конфигурации 1С:Управление торговлей 11.5 печать договоров обычно реализована через подсистему «Печать» БСП. Чтобы добавить новое склоняемое поле в шаблон, нам необходимо вмешаться в процесс формирования структуры данных. Рассмотрим пошагово, как это сделать с помощью расширения конфигурации, чтобы не снимать основную конфигурацию с поддержки.
Шаг 1. Поиск модуля менеджера. Нам нужно найти объект, который отвечает за печать договора. Чаще всего это справочник ДоговорыКонтрагентов. Перейдем в его модуль менеджера.
Шаг 2. Перехват процедуры формирования данных. Нам необходимо найти процедуру, которая собирает данные для шаблона Word (обычно это процедуры, связанные с обработкой печатных форм). В расширении мы создадим обработчик &После или &Вместо для метода, заполняющего структуру параметров.
Шаг 3. Добавление своих параметров. Допустим, типовой код собирает данные в структуру ДанныеПечати. Мы дополним её своими полями:
&После("СформироватьДанныеДляПечатиДоговора")
Процедура Расш1_СформироватьДанныеДляПечатиДоговора(Параметры, ДанныеПечати)
// Предположим, в ДанныеПечати уже есть ФИО руководителя
ФИОИменительный = ДанныеПечати.ФИОРуководителя;
// Выполняем склонение
ДанныеПечати.Вставить("ФИОРуководителяДательный", ПолучитьСклонениеСтроки(ФИОИменительный, "ПД=Дательный"));
ДанныеПечати.Вставить("ФИОРуководителяРодительный", ПолучитьСклонениеСтроки(ФИОИменительный, "ПД=Родительный"));
// Также можно просклонять должность
ДолжностьИм = ДанныеПечати.ДолжностьРуководителя;
ДанныеПечати.Вставить("ДолжностьРодительный", ПолучитьСклонениеСтроки(ДолжностьИм, "ПД=Родительный"));
КонецПроцедуры
После внесения этих изменений в код, в редакторе шаблона Word (в интерфейсе 1С) станут доступны новые параметры: [ФИОРуководителяДательный] и [ДолжностьРодительный]. Мы просто вставляем их в нужные места текста договора.
Важно отметить, что в УТ 11.5 активно используется БСП. В составе этой библиотеки есть общий модуль СклонениеИменСуществительных. Проанализируем, в чем его преимущество перед прямой платформенной функцией.
Модуль СклонениеИменСуществительных является более высокоуровневой оберткой. Он может автоматически определять пол, корректно обрабатывать сложные названия организаций и учитывать специфические правила русского языка, которые могут быть не до конца реализованы в базовом платформенном методе. Рассмотрим пример использования БСП:
// Пример склонения через БСП
РезультатСклонения = СклонениеИменСуществительных.ПросклонятьФразу("Генеральный директор", 2); // 2 - родительный падеж
// Результат: "Генерального директора"
Параметр падежа в БСП часто передается числом:
Часто в договорах требуется не просто просклонять ФИО, но и представить его в сокращенном виде (фамилия и инициалы). Платформенная функция ПолучитьСклонениеСтроки позволяет управлять этим через третий параметр — форматную строку. Посмотрим на примеры:
"Л=ФИО; ПД=Дательный" — вернет полное ФИО в дательном падеже."Л=ФИ; ПД=Дательный" — вернет только фамилию и имя."Л=Фам И. О.; ПД=Родительный" — сформирует фамилию полностью и инициалы в родительном падеже.Рассмотрим код, который подготавливает инициалы для договора:
ПараметрыФизЛица = "Л=Фам И. О.; ПД=Дательный";
ИнициалыДательный = ПолучитьСклонениеСтроки("Иванов Иван Иванович", , ПараметрыФизЛица);
// Результат: "Иванову И. И."
Выясним основные выводы нашего исследования. Прямое использование логических выражений и функций внутри вордовских шаблонов 1С:УТ 11.5 невозможно из-за архитектуры подсистемы печати. Однако это не является препятствием для автоматизации. Правильный алгоритм действий выглядит так:
проанализировать необходимые падежные формы в тексте договора, добавить соответствующие вычисляемые поля в программный код формирования данных печати (используя ПолучитьСклонениеСтроки или модули БСП) и разместить готовые параметры в шаблоне Word.
Такой подход обеспечивает высокую производительность, так как склонение происходит один раз при формировании документа, и гарантирует корректность отображения данных у конечного пользователя.