При настройке шаблонов документов (включая автозаполнение шаблонов файлов MXL) в 1С:Документооборот 2.1 часто возникает необходимость автоматического склонения ФИО сотрудников. Например, в тексте договора или приказа нужно указать автора документа («Подготовил») в родительном или дательном падеже. Несмотря на наличие встроенных механизмов склонения, начинающие разработчики часто сталкиваются с тем, что скрипт «не работает» или возвращает пустые значения. В этой статье мы подробно разберем, как реализовать склонение ФИО, проанализируем типичные ошибки и рассмотрим лучшие практики написания скриптов для шаблонов файлов.
Проанализируем типичную ситуацию. В первом сообщении темы автор пытается просклонять реквизит Подготовил, используя следующий код:
СклоненияПодготовил = Файл.ВладелецФайла.Подготовил;
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьФИО(СклоненияПодготовил, 2, СклоненияПодготовил);
Выясним причину, по которой этот код не работает. Основная ошибка кроется в типах данных. Реквизит Подготовил во внутреннем или исходящем документе является ссылкой на справочник Пользователи. Функция ПросклонятьФИО (как и большинство аналогичных функций в системе) ожидает на вход строку в именительном падеже, а не ссылку на объект.
Когда вы передаете ссылку в функцию, которая ждет строку, 1С пытается преобразовать объект в строку, но делает это по своим внутренним правилам (часто получается просто представление ссылки), что мешает алгоритму склонения корректно распознать фамилию, имя и отчество. Поэтому первым правилом при работе со склонением должно быть: всегда передавайте функции строковое значение.
В конфигурации «1С:Документооборот» (особенно в версии 2.1) доступно несколько механизмов для изменения падежей. Рассмотрим наиболее эффективные из них:
Проанализируем параметры функции ПросклонятьФИО:
ФИО (Строка) — ФИО в именительном падеже.Падеж (Число) — номер падежа от 1 (Именительный) до 6 (Предложный). Родительный падеж — 2, Дательный — 3.Пол (Число/Перечисление) — необязательный параметр. Рекомендуется передавать (1 — мужской, 2 — женский), если есть возможность его определить, так как это значительно повышает точность склонения сложных фамилий.Разберем по шагам, как написать отказоустойчивый скрипт, используя подходы, схожие с настройкой произвольных действий дополнительных реквизитов. Вместо прямого обращения через точку (так называемый Dot-walking), которое может вызвать ошибку при незаполненных реквизитах, используем методы общего модуля ОбщегоНазначения.
Рассмотрим пример кода, который получает ФИО подготовившего сотрудника и склоняет его в дательный падеж (кому?):
// 1. Получаем ссылку на пользователя, который подготовил документ
ПользовательСсылка = Файл.ВладелецФайла.Подготовил;
Если ЗначениеЗаполнено(ПользовательСсылка) Тогда
// 2. Получаем наименование (ФИО) пользователя строкой
// Безопаснее всего обращаться к связанному физлицу
ФИОСтрока = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательСсылка, "Наименование");
// 3. Выполняем склонение (падеж 3 - Дательный)
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьПредставление(ФИОСтрока, 3);
Иначе
РезультатОбработки = "Пользователь не указан";
КонецЕсли;
В 1С:Документооборот справочник Пользователи часто содержит сокращенные наименования (например, «Иванов И.И.»). Склонять инициалы — задача неблагодарная, и результат может быть некорректным. Для качественного результата лучше склонять полное ФИО, которое хранится в справочнике ФизическиеЛица.
Посмотрим на пример продвинутого скрипта:
ПользовательСсылка = Файл.ВладелецФайла.Подготовил;
ФизЛицо = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательСсылка, "ФизическоеЛицо");
Если ЗначениеЗаполнено(ФизЛицо) Тогда
// Получаем ФИО и Пол из карточки физлица
ДанныеФизЛица = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ФизЛицо, "ФИО, Пол");
ИмяДляСклонения = ДанныеФизЛица.ФИО;
// Определяем числовой код пола для функции
// Перечисление.ПолФизическогоЛица.Мужской -> 1, Женский -> 2
ПолКод = ?(ДанныеФизЛица.Пол = Перечисления.ПолФизическогоЛица.Мужской, 1, 2);
// Используем специализированную функцию
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьФИО(ИмяДляСклонения, 2, ПолКод);
Иначе
РезультатОбработки = "Данные для склонения не найдены";
КонецЕсли;
Важно учитывать контекст исполнения скрипта. Как заметили участники обсуждения, состав реквизитов зависит от вида документа. У входящих документов может не быть реквизита Подготовил, зато есть Отправитель или Адресат.
Проанализируем ситуацию с получателями в исходящих документах, как это было предложено в финальном решении на форуме:
// Если работаем со списком получателей
Если Файл.ВладелецФайла.Получатели.Количество() > 0 Тогда
// Берем первого получателя из списка
СтрокаПолучатель = Файл.ВладелецФайла.Получатели[0];
// Получаем наименование адресата через безопасный метод
ФИО = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаПолучатель.Адресат, "Наименование");
// Склоняем в Дательный падеж
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьПредставление(ФИО, 3);
КонецЕсли;
При использовании функций склонения вторым параметром всегда передается номер падежа. Сохраните себе эту шпаргалку:
Если скрипт все равно не выдает нужный результат, выполните следующие действия:
Проверьте заполнение данных: Убедитесь, что у пользователя или физического лица заполнено поле «Наименование» или «ФИО». Если в базе вместо имени записано «Администратор», программа не сможет просклонять это как ФИО.
Используйте Журнал регистрации: Если скрипт падает с ошибкой, информация об этом запишется в журнал регистрации. Это поможет понять, на какой строке произошло обращение к пустому объекту.
Тестируйте на простых строках: Временно замените получение реквизита на статичную строку, например: РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьПредставление("Иванов Иван Иванович", 2);. Если это работает, значит проблема именно в получении данных из документа (пустые ссылки или неверные пути к реквизитам).
Используя предложенные методы и функцию СклонениеПредставленийОбъектов.ПросклонятьПредставление, вы сможете создавать профессиональные и корректные шаблоны документов в 1С:Документооборот, которые будут автоматически адаптировать ФИО под нужный грамматический контекст.