Разработка и поддержка конфигураций на платформе 1С:Предприятие 7.7 в наши дни по-прежнему остается актуальной задачей. Одной из классических проблем, с которой сталкиваются программисты при формировании печатных форм (договоров, приказов, доверенностей), является необходимость автоматического склонения ФИО сотрудников или контрагентов по падежам. В отличие от современных версий платформы 1С 8.х, где существуют удобные встроенные механизмы, в «семерке» разработчику приходится решать эту задачу обходными путями.
В этой статье мы подробно разберем, как реализовать склонение ФИО в 1С 7.7 с использованием внешних библиотек и силами чистого кода на встроенном языке, а также детально изучим процесс интеграции готового решения в конфигурацию.
Рассмотрим наиболее надежный и точный способ решения нашей задачи — подключение специализированной библиотеки NameDecl.dll, которая поставлялась фирмой 1С. Логика склонения (правила русского языка, обработка исключений, определение пола) зашита внутри скомпилированного файла, что гарантирует высокую скорость работы и корректность результатов.
Для начала работы нам необходимо убедиться, что файл NameDecl.dll физически находится в каталоге базы данных (в подкаталоге Bin платформы или непосредственно в папке с базой данных). Проанализируем программный код, который осуществляет загрузку этой компоненты и выполняет склонение:
// Функция выполняет склонение ФИО с помощью внешней компоненты NameDecl.dll
Функция глПросклонятьФИО_NameDecl(ФИО, НомерПадежа, Пол = 0) Экспорт
// Проверим наличие и успешность загрузки внешней библиотеки
Если ЗагрузитьВнешнююКомпоненту("NameDecl.dll") <> 1 Тогда
Предупреждение("Внимание! Не удалось загрузить компоненту NameDecl.dll. Склонение ФИО недоступно.");
Возврат ФИО; // возвращаем исходную строку, если библиотека отсутствует
КонецЕсли;
Попытка
// Создаем COM-объект склонения через стандартный метод 1С 7.7
ОбъектПадеж = СоздатьОбъект("AddIn.NameDeclension");
Исключение
Предупреждение("Не удалось инициализировать объект AddIn.NameDeclension!");
Возврат ФИО;
КонецПопытки;
// Вызываем метод склонения.
// Параметры метода Просклонять:
// 1. Исходная строка (ФИО)
// 2. Номер падежа (1 - Именительный, 2 - Родительный, 3 - Дательный, 4 - Винительный, 5 - Творительный, 6 - Предложный)
// 3. Пол (0 - автоопределение, 1 - мужской, 2 - женский)
РезультатСклонения = "";
Попытка
РезультатСклонения = ОбъектПадеж.Просклонять(ФИО, НомерПадежа, Пол);
Исключение
РезультатСклонения = ФИО;
Сообщить("Ошибка при вызове метода Просклонять: " + ОписаниеОшибки(), "!");
КонецПопытки;
Возврат РезультатСклонения;
КонецФункции
Выясним особенности работы с еще одной популярной внешней компонентой — Padeg.dll. Данная библиотека часто применяется в унаследованных системах автоматизации и отлично справляется со сложными фамилиями и именами собственными. Обратите внимание, что эта компонента регистрируется в операционной системе Windows как OLE-сервер.
Посмотрим на пример вызова функций библиотеки Padeg.dll из программного кода 1С 7.7:
// Функция склонения ФИО с помощью библиотеки Padeg.dll
Функция глПросклонятьФИО_Padeg(ФИО, НомерПадежа, Пол = 2) Экспорт
// Параметр Пол в Padeg.dll принимает значения: 1 - мужской, 2 - женский, 3 - автоопределение
ПеременнаяСклонения = "";
Попытка
// Создаем COM-объект
СерверСклонения = СоздатьОбъект("Padeg.Declension");
// Вызываем метод получения ФИО в нужном падеже
// Синтаксис метода: GetFIOPadegFS(ФИО, Пол, НомерПадежа)
ПеременнаяСклонения = СерверСклонения.GetFIOPadegFS(ФИО, Пол, НомерПадежа);
Исключение
Сообщить("Системная ошибка: библиотека Padeg.dll не зарегистрирована в ОС. " + ОписаниеОшибки(), "!");
ПеременнаяСклонения = ФИО;
КонецПопытки;
Возврат ПеременнаяСклонения;
КонецФункции
Рассмотрим ситуацию, когда по соображениям безопасности или из-за архитектурных ограничений (например, работа в терминальном режиме без прав администратора на сервере) регистрация сторонних DLL-файлов в системе невозможна. В этом случае мы можем позаимствовать проверенный временем алгоритм склонения из типовой конфигурации «1С:Зарплата и Кадры 7.7».
Для этого нам потребуется открыть конфигурацию «Зарплата и Кадры 7.7» в режиме Конфигуратора, зайти в Глобальный модуль и найти там встроенную функцию глПадежФИО и сопутствующие ей служебные процедуры анализа окончаний. Мы можем полностью перенести данный блок кода в свою рабочую базу. Ниже представлен пример того, как выглядит вызов такой функции после её переноса:
// Пример использования портированной функции из типовой ЗиК 7.7
Процедура ВыполнитьСклонениеНаЧистомКоде()
ИсходноеИмя = "Иванов Петр Сидорович";
// Вызов перенесенной функции глПадежФИО(ФИО, Падеж, Пол)
// Где Падеж - объект "Падеж" (или числовой индекс падежа в зависимости от реализации)
ФИО_Дательный = глПадежФИО(ИсходноеИмя, 3);
Сообщить("Кому: " + ФИО_Дательный);
КонецПроцедуры
Разберем детально процесс внедрения созданных функций в конфигурацию. В зависимости от бизнес-требований, мы можем разместить наш код либо глобально для всей системы, либо локально внутри конкретного документа.
Вариант А. Размещение кода в Глобальном модуле (Рекомендуется)
Если вам требуется склонять ФИО в различных печатных формах (например, в счетах-фактурах, актах, договорах и накладных), целесообразно вынести код в Глобальный модуль.
глПросклонятьФИО_NameDecl).Экспорт. Без этого слова функция будет видна только внутри самого глобального модуля, и вы не сможете вызвать её из печатных форм документов.Ctrl + S).Вариант Б. Размещение кода в Локальном модуле печатной формы
Если задача ограничивается изменением лишь одной конкретной печатной формы (например, внешней формы договора dogovor.ert), то засорять глобальный модуль не стоит. Впишем код локально:
.ert) через меню Файл — Открыть.Печать()). Ключевое слово Экспорт в данном случае указывать не требуется.Теперь разберем, как связать программный код с визуальным шаблоном печатной формы. Проанализируем по шагам процесс вывода подготовленной переменной на печать:
Пример записи выражения непосредственно в ячейке таблицы:
глПросклонятьФИО_NameDecl(Сотрудник.Наименование, 3)
Если вы предпочитаете готовить данные заранее в модуле документа (что является более профессиональным подходом с точки зрения читаемости кода), сделайте следующее:
// Подготовка данных для вывода в печатную форму
ФИО_Дательный = глПросклонятьФИО_NameDecl(ВыбСотрудник.Наименование, 3);
// Код вывода секции таблицы, содержащей ячейку с выражением "ФИО_Дательный"
Таб.ВывестиСекцию("Строка_Договора");
ФИО_Дательный.Таким образом, мы успешно настроили систему динамического изменения окончаний ФИО. Использование внешних компонент или встроенных алгоритмов гарантирует правильное склонение фамилий, имен и отчеств ваших сотрудников, что значительно повысит качество формируемых документов и минимизирует количество ошибок, вызванных человеческим фактором.