Как правильно просклонять ФИО в скрипте шаблона документа 1С:Документооборот

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

При настройке шаблонов документов (включая автозаполнение шаблонов файлов MXL) в 1С:Документооборот 2.1 часто возникает необходимость автоматического склонения ФИО сотрудников. Например, в тексте договора или приказа нужно указать автора документа («Подготовил») в родительном или дательном падеже. Несмотря на наличие встроенных механизмов склонения, начинающие разработчики часто сталкиваются с тем, что скрипт «не работает» или возвращает пустые значения. В этой статье мы подробно разберем, как реализовать склонение ФИО, проанализируем типичные ошибки и рассмотрим лучшие практики написания скриптов для шаблонов файлов.

Разбор основной проблемы: Ссылка против Строки

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


СклоненияПодготовил = Файл.ВладелецФайла.Подготовил;
РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьФИО(СклоненияПодготовил, 2, СклоненияПодготовил);

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

Когда вы передаете ссылку в функцию, которая ждет строку, 1С пытается преобразовать объект в строку, но делает это по своим внутренним правилам (часто получается просто представление ссылки), что мешает алгоритму склонения корректно распознать фамилию, имя и отчество. Поэтому первым правилом при работе со склонением должно быть: всегда передавайте функции строковое значение.

Выбор правильной функции для склонения

В конфигурации «1С:Документооборот» (особенно в версии 2.1) доступно несколько механизмов для изменения падежей. Рассмотрим наиболее эффективные из них:

  1. СклонениеПредставленийОбъектов.ПросклонятьФИО — узкоспециализированная функция, предназначенная строго для ФИО. Она хорошо работает, когда данные четко структурированы.
  2. СклонениеПредставленийОбъектов.ПросклонятьПредставление — более универсальный метод. Рассмотрим его подробнее. Эта функция пытается сама определить, что ей передали: просто ФИО или связку «Должность + ФИО». Она считается более «живучей» в сложных шаблонах.

Проанализируем параметры функции ПросклонятьФИО:

Реализация надежного скрипта

Разберем по шагам, как написать отказоустойчивый скрипт, используя подходы, схожие с настройкой произвольных действий дополнительных реквизитов. Вместо прямого обращения через точку (так называемый Dot-walking), которое может вызвать ошибку при незаполненных реквизитах, используем методы общего модуля ОбщегоНазначения.

Рассмотрим пример кода, который получает ФИО подготовившего сотрудника и склоняет его в дательный падеж (кому?):


// 1. Получаем ссылку на пользователя, который подготовил документ
ПользовательСсылка = Файл.ВладелецФайла.Подготовил;

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

Повышение точности: Обращение к Физическому лицу

В 1С:Документооборот справочник Пользователи часто содержит сокращенные наименования (например, «Иванов И.И.»). Склонять инициалы — задача неблагодарная, и результат может быть некорректным. Для качественного результата лучше склонять полное ФИО, которое хранится в справочнике ФизическиеЛица.

Посмотрим на пример продвинутого скрипта:


ПользовательСсылка = Файл.ВладелецФайла.Подготовил;
ФизЛицо = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательСсылка, "ФизическоеЛицо");

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

Склонение для разных видов документов

Важно учитывать контекст исполнения скрипта. Как заметили участники обсуждения, состав реквизитов зависит от вида документа. У входящих документов может не быть реквизита Подготовил, зато есть Отправитель или Адресат.

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


// Если работаем со списком получателей
Если Файл.ВладелецФайла.Получатели.Количество() > 0 Тогда
    // Берем первого получателя из списка
    СтрокаПолучатель = Файл.ВладелецФайла.Получатели[0];
    
    // Получаем наименование адресата через безопасный метод
    ФИО = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаПолучатель.Адресат, "Наименование");
    
    // Склоняем в Дательный падеж
    РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьПредставление(ФИО, 3);
КонецЕсли;

Памятка по падежам для разработчика

При использовании функций склонения вторым параметром всегда передается номер падежа. Сохраните себе эту шпаргалку:

  1. Именительный (Кто? Что?) — используется редко, обычно это значение по умолчанию.
  2. Родительный (Кого? Чего?) — часто нужен для предлогов «от», «для», «в лице».
  3. Дательный (Кому? Чему?) — для полей «Кому», «Адресату», «Выдано».
  4. Винительный (Кого? Что?) — используется в конструкциях «назначить кого-то».
  5. Творительный (Кем? Чем?) — используется в фразах «в лице (директора)», «подписано (кем)».
  6. Предложный (О ком? О чем?) — используется в описательных частях документов.

Рекомендации по отладке

Если скрипт все равно не выдает нужный результат, выполните следующие действия:

Проверьте заполнение данных: Убедитесь, что у пользователя или физического лица заполнено поле «Наименование» или «ФИО». Если в базе вместо имени записано «Администратор», программа не сможет просклонять это как ФИО.

Используйте Журнал регистрации: Если скрипт падает с ошибкой, информация об этом запишется в журнал регистрации. Это поможет понять, на какой строке произошло обращение к пустому объекту.

Тестируйте на простых строках: Временно замените получение реквизита на статичную строку, например: РезультатОбработки = СклонениеПредставленийОбъектов.ПросклонятьПредставление("Иванов Иван Иванович", 2);. Если это работает, значит проблема именно в получении данных из документа (пустые ссылки или неверные пути к реквизитам).

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

← На главную