В конфигурации 1С:Зарплата и Управление Персоналом 3.1 реализован механизм печати документов по настраиваемым шаблонам в формате Microsoft Word (файлы docx / Office Open XML). Одной из скрытых, но мощных возможностей этого механизма является автоматическое склонение строковых реквизитов и представлений прямо внутри шаблона, например с помощью конструкции вида [ФИООтветственногоЗаОбработкуПДн.Падеж.Родительный].
Разберем, как устроен этот механизм изнутри, почему ответственных лиц организации нельзя просто так получить через реквизиты объекта и как правильно решить задачу вывода ответственного лица в нужном падеже.
Механизм формирования печатных форм Word базируется на совместной работе двух стандартных библиотечных подсистем БСП: Управление печатью и Склонение представлений объектов.
Склонение выполняется автоматически на платформенном уровне: если в информационной базе активна константа ИспользоватьСервисСклоненияMorpher и доступен интернет, задействуется веб-сервис, а при его недоступности или отсутствии сети система использует встроенные алгоритмы платформы 1С:Предприятие. Все скорректированные пользователем варианты ФИО сохраняются в регистре сведений СклоненияПредставленийОбъектов. Если в регистре есть запись для конкретного физического лица, система возьмет именно ее, а не результат работы алгоритма.
Для того чтобы реквизит в макете получил возможность обращаться к падежам через точку, разработчики регистрируют его через специальный программный интерфейс при определении источников данных печати:
Если Объект = "Документ.СогласиеНаОбработкуПерсональныхДанных.ФИООтветственногоЗаОбработкуПДн" Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда
МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов");
МодульСклонениеПредставленийОбъектов.ПодключитьИсточникДанныхПечатиСклоненияСтрок(ИсточникиДанныхПечати);
КонецЕсли;
КонецЕсли;
Вызов метода ПодключитьИсточникДанныхПечатиСклоненияСтрок() добавляет к указанному полю ветку Падеж, которая поддерживает следующие стандартные модификаторы падежей русского языка:
[ИмяПоля.Падеж.Именительный] — кто? что?[ИмяПоля.Падеж.Родительный] — кого? чего?[ИмяПоля.Падеж.Дательный] — кому? чему?[ИмяПоля.Падеж.Винительный] — кого? что?[ИмяПоля.Падеж.Творительный] — кем? чем?[ИмяПоля.Падеж.Предложный] — о ком? о чем?Выясним причину, по которой стандартная конструкция вроде [Организация.Руководитель] не работает в шаблоне docx. В редакторе макета через точку можно обращаться исключительно к прямым реквизитам объекта и его ссылочных полей (например, [Организация.ИНН]).
В программе «1С:ЗУП 3.1» ответственные лица (руководитель, главный бухгалтер, кассир и др.) не являются реквизитами справочника Организации. Сведения о них периодически изменяются и хранятся в регистре сведений ОтветственныеЛицаОрганизаций. Напрямую сделать срез последних по регистру сведений из формул шаблона невозможно. Чтобы использовать эти данные в макете, их необходимо предварительно предоставить в источник данных документа.
Рассмотрим основной способ решения задачи, позволяющий сохранить возможность свободного выбора падежа в шаблоне через конструкцию [Руководитель.Падеж.Родительный]. Для этого в расширении конфигурации выполняем следующие шаги:
ПриОпределенииИсточниковДанныхПечати общего модуля УправлениеПечатьюПереопределяемый. В ней описываем новое поле для нашего документа и подключаем механизм склонения строк:
&Вместо("ПриОпределенииИсточниковДанныхПечати")
Процедура Расш_ПриОпределенииИсточниковДанныхПечати(Объект, ИсточникиДанныхПечати)
ПродолжитьВызов(Объект, ИсточникиДанныхПечати);
Если Объект = "Документ.СогласиеНаОбработкуПерсональныхДанных.РуководительОрганизации" Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда
МодульСклонения = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов");
МодульСклонения.ПодключитьИсточникДанныхПечатиСклоненияСтрок(ИсточникиДанныхПечати);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ОтветственныеЛицаОрганизаций или функции модуля ОтветственныеЛицаЗарплатаКадры, после чего помещаем полученную строку ФИО в структуру данных печати.Если нет жесткого требования давать пользователю выбор падежа внутри самого шаблона, можно упростить задачу: просклонять ФИО ответственного лица на сервере перед выводом и передать в макет уже готовую строку.
Для программного склонения строк и ФИО в БСП используется функция СклонениеПредставленийОбъектов.ПросклонятьПредставление(), либо базовая функция платформы ПолучитьСклоненияСтроки():
// Пример программного склонения ФИО в родительный падеж
ФИОРуководителя = "Иванов Иван Иванович";
ПадежРодительный = 2; // 1 - Именительный, 2 - Родительный, 3 - Дательный...
РезультатСклонения = "";
Если СклонениеПредставленийОбъектов.ПросклонятьПредставление(ФИОРуководителя, ПадежРодительный, РезультатСклонения) Тогда
ДанныеДляПечати.Вставить("РуководительВРодительномПадеже", РезультатСклонения);
Иначе
ДанныеДляПечати.Вставить("РуководительВРодительномПадеже", ФИОРуководителя);
КонецЕсли;
После передачи параметра в структуру печатных данных в самом файле docx достаточно вставить простую метку [РуководительВРодительномПадеже] без указания дополнительных модификаторов.
Если возможность доработки конфигурации или подключения расширения отсутствует, проанализируем вариант с использованием типового механизма дополнительных реквизитов:
Увидеть все доступные шаблоны печатных форм, отредактировать их или просмотреть дерево доступных полей можно в разделе: Администрирование → Печатные формы, отчеты и обработки → Макеты печатных форм. При открытии макета программа выгружает файл docx и предоставляет список полей, разрешенных к подстановке.