Как настроить склонение ФИО и ответственных лиц в шаблонах печатных форм Word в 1С:ЗУП 3.1?

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

В конфигурации 1С:Зарплата и Управление Персоналом 3.1 реализован механизм печати документов по настраиваемым шаблонам в формате Microsoft Word (файлы docx / Office Open XML). Одной из скрытых, но мощных возможностей этого механизма является автоматическое склонение строковых реквизитов и представлений прямо внутри шаблона, например с помощью конструкции вида [ФИООтветственногоЗаОбработкуПДн.Падеж.Родительный].

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

Как устроен механизм склонения в шаблонах docx

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

Склонение выполняется автоматически на платформенном уровне: если в информационной базе активна константа ИспользоватьСервисСклоненияMorpher и доступен интернет, задействуется веб-сервис, а при его недоступности или отсутствии сети система использует встроенные алгоритмы платформы 1С:Предприятие. Все скорректированные пользователем варианты ФИО сохраняются в регистре сведений СклоненияПредставленийОбъектов. Если в регистре есть запись для конкретного физического лица, система возьмет именно ее, а не результат работы алгоритма.

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


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

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

  1. [ИмяПоля.Падеж.Именительный] — кто? что?
  2. [ИмяПоля.Падеж.Родительный] — кого? чего?
  3. [ИмяПоля.Падеж.Дательный] — кому? чему?
  4. [ИмяПоля.Падеж.Винительный] — кого? что?
  5. [ИмяПоля.Падеж.Творительный] — кем? чем?
  6. [ИмяПоля.Падеж.Предложный] — о ком? о чем?

Почему нельзя взять ответственное лицо организации напрямую из шаблона

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

В программе «1С:ЗУП 3.1» ответственные лица (руководитель, главный бухгалтер, кассир и др.) не являются реквизитами справочника Организации. Сведения о них периодически изменяются и хранятся в регистре сведений ОтветственныеЛицаОрганизаций. Напрямую сделать срез последних по регистру сведений из формул шаблона невозможно. Чтобы использовать эти данные в макете, их необходимо предварительно предоставить в источник данных документа.

Способ 1. Доработка источников данных через расширение конфигурации

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

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

Способ 2. Программное склонение и передача готового параметра

Если нет жесткого требования давать пользователю выбор падежа внутри самого шаблона, можно упростить задачу: просклонять ФИО ответственного лица на сервере перед выводом и передать в макет уже готовую строку.

Для программного склонения строк и ФИО в БСП используется функция СклонениеПредставленийОбъектов.ПросклонятьПредставление(), либо базовая функция платформы ПолучитьСклоненияСтроки():


// Пример программного склонения ФИО в родительный падеж
ФИОРуководителя = "Иванов Иван Иванович";
ПадежРодительный = 2; // 1 - Именительный, 2 - Родительный, 3 - Дательный...

РезультатСклонения = "";
Если СклонениеПредставленийОбъектов.ПросклонятьПредставление(ФИОРуководителя, ПадежРодительный, РезультатСклонения) Тогда
    ДанныеДляПечати.Вставить("РуководительВРодительномПадеже", РезультатСклонения);
Иначе
    ДанныеДляПечати.Вставить("РуководительВРодительномПадеже", ФИОРуководителя);
КонецЕсли;

После передачи параметра в структуру печатных данных в самом файле docx достаточно вставить простую метку [РуководительВРодительномПадеже] без указания дополнительных модификаторов.

Способ 3. Пользовательский вариант без программирования

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

  1. В настройках программы активируем использование дополнительных реквизитов и сведений.
  2. Для нужного вида документа добавляем строковый дополнительный реквизит (например, Руководитель (в род. падеже)).
  3. Типовой механизм печати docx автоматически выводит дополнительные реквизиты в дерево доступных полей шаблона. Вставляем маркер этого реквизита в текст макета.
  4. Единственным ограничением данного подхода является необходимость ручного заполнения этого поля пользователем при создании каждого документа.

Где в интерфейсе посмотреть список макетов

Увидеть все доступные шаблоны печатных форм, отредактировать их или просмотреть дерево доступных полей можно в разделе: Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. При открытии макета программа выгружает файл docx и предоставляет список полей, разрешенных к подстановке.

← На главную