Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Полигон
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:51[Войти] | [Зарегистрироваться]

Склонение фамилий, имен и отчеств по падежам Библиотека функций.

Сергей Плахов
Геннадий Покаташкин
дата публикации 17-05-2001 00:00

Склонение фамилий, имен и отчеств по падежам Библиотека функций.

...Имя человека - это самый сладостный и самый важный для него звук на любом языке.
Д. Карнеги



  1. НАЗНАЧЕНИЕ
  2. ИСТОРИЯ
  3. ЯДРО ПРОГРАММЫ
  4. УСТАНОВКА
  5. ЭКСПОРТИРУЕМЫЕ ФУНКЦИИ DLL И РЕКОМЕНДАЦИИ ПО ИХ ИСПОЛЬЗОВАНИЮ
    1. ОБЩИЕ ПОЛОЖЕНИЯ
    2. ФУНКЦИИ, ВЫПОЛНЯЮЩИЕ СКЛОНЕНИЕ ФИО, ДОЛЖНОСТЕЙ И ПОДРАЗДЕЛЕНИЙ
      1. GetFIOPadeg
      2. GetFIOPadegAS
      3. GetFIOPadegFS
      4. GetFIOPadegFSAS
      5. GetIFPadeg
      6. GetIFPadegFS
      7. GetNominativePadeg
      8. GetAppointmentPadeg
      9. GetFullAppointmentPadeg
      10. GetOfficePadeg
    3. СЕРВИСНЫЕ ФУНКЦИИ
      1. GetSex
      2. GetPadegID
      3. GetFIOParts
    4. ФУНКЦИИ, РАБОТАЮЩИЕ СО СЛОВАРЕМ ИСКЛЮЧЕНИЙ
      1. UpdateExceptions
      2. GetExceptionsFileName
      3. SetDictionary
    5. ПРИМЕРЫ ОБРАЩЕНИЯ К ФУНКЦИЯМ БИБЛИОТЕКИ
      1. Delphi
      2. C/C++
      3. VB/VBA
  6. ВОССТАНОВЛЕНИЕ ИМЕНИТЕЛЬНОГО ПАДЕЖА
  7. СЛОВАРЬ ИСКЛЮЧЕНИЙ
  8. СЕРВЕР АВТОМАТИЗАЦИИ
    1. КРАТКОЕ ОПИСАНИЕ
    2. ПРИМЕРЫ ОБРАЩЕНИЯ
      1. Delphi
      2. VB/VBA (включая VB Script)
      3. 1C
  9. ОБЛАСТЬ ПРИМЕНЕНИЯ
  10. ПРАВИЛА СКЛОНЕНИЯ ФИО, РЕАЛИЗОВАННЫЕ В БИБЛИОТЕКЕ
  11. КОМПЛЕКТ ПОСТАВКИ
  12. ЛИТЕРАТУРА
  13. БЛАГОДАРНОСТИ
  14. ЗАКЛЮЧЕНИЕ

1. Назначение

Программный продукт (в дальнейшем — библиотека) предназначен для преобразования фамилии, имени и отчества (ФИО), наименования должности или подразделения, заданных в именительном падеже в форму любого другого падежа, а также для восстановления именительного падежа для ФИО, записанного в произвольном падеже. Склонение ФИО выполняется по правилам склонения имен собственных, принятых в русском языке (см. ниже). ФИО для склонения может быть задано одной или тремя строками при склонении и одной строкой — при восстановлении именительного падежа. Наименование должности или подразделения задаются одной строкой.

2. История

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

  • Версия 1.0
  • Базовая версия, включающая в себя функции для склонения ФИО.
  • Версия 2.0
    1. Исправлены ошибки преобразования, выявленные при тестировании предыдущей версии.
    2. В состав библиотеки введен словарь исключений для учета некоторых особенностей склонения.
    3. Функции склонения ФИО расширены для обработки восточных имен (Дэн Сяо Пин).
    4. Добавлены функции для склонения пар "Имя Фамилия" (Марк Твен).
    5. Добавлена функция восстановления именительного падежа для ФИО, записанного в произвольном падеже.
  • Версия 3.0
    1. Добавлены функции для склонения наименований должностей и подразделений.
    2. Добавлена возможность учета зависимости окончания от положения ударения в дательном, творительном и предложном падежах.
    3. Добавлены секции в словарь исключений.
    4. Исправлена ошибка преобразования имени Пётр.
  • Версия 3.1
    1. Добавлены сервисные функции.
    2. Исключены функции с типом ShortString.
  • Версия 3.2
    1. Добавлена функция формирования и склонения полной должности.
  • Версия 3.3
    1. Поддержка OLE.
    2. Исправлены ошибки склонения наименования подразделений с числительными.
    3. Добавлена возможность преобразования женских фамилий, склонение которых зависит от склонения соответствующих мужских фамилий.

3. Ядро программы

Ядром программы является библиотека динамической компоновки Padeg.dll с секцией экспорта:

exports
  // функции склонения ФИО, заданного в формате "фамилия имя отчество"
  GetFIOPadeg               Name 'GetFIOPadeg',
  GetFIOPadegAutoSex        Name 'GetFIOPadegAS',
  GetFIOPadegFromStr        Name 'GetFIOPadegFS',
  GetFIOPadegFromStrAutoSex Name 'GetFIOPadegFSAS',

  // функции склонения ФИО, заданного в формате "имя фамилия"
  GetIFPadeg                Name 'GetIFPadeg',
  GetIFPadegFromStr         Name 'GetIFPadegFS',

  // функция восстановления именительного падежа
  GetNominativePadeg        Name 'GetNominativePadeg',

  // функции склонения наименований должностей и подразделений
  GetAppointmentPadeg       Name 'GetAppointmentPadeg',
  GetOfficePadeg            Name 'GetOfficePadeg',
  GetFullAppointmentPadeg   Name 'GetFullAppointmentPadeg',
  
  // сервисные функции
  Get_Sex                   Name 'GetSex',
  GetPadegID                Name 'GetPadegID',
  GetFIOParts               Name 'GetFIOParts',
  
  // функции работы со словарем исключений
  Update_Exceptions         Name 'UpdateExceptions',
  GetExceptionsFileName     Name 'GetExceptionsFileName',
  SetDictionary             Name 'SetDictionary';

end.

Первые шесть функций осуществляют преобразование ФИО, записанное в соответствующем формате, в заданный падеж. Под форматом здесь понимается порядок следования компонент ФИО в списке параметров или параметре, если ФИО передается одной строкой. Другими словами, функции, содержащие FIO в имени, предназначены для преобразования входных данных, записанных в формате "Фамилия Имя Отчество", а IF — "Имя [Имена] Фамилия". Функции, в именах которых присутствует AutoSex (AS), выполняют преобразование, определяя род по отчеству. ФИО, заданные одной строкой, преобразуются функциями с FromStr (FS) в имени.

С помощью функции GetNominativePadeg можно восстановить именительный падеж для ФИО, заданного в произвольном падеже.

Три следующие функции выполняют преобразование наименований должностей (Appointment) и подразделений (Office). Функция GetFullAppointmentPadeg формирует полное наименование должности и склоняет его.

Сервисные функции позволяют определить род по отчеству в произвольном падеже, определить падеж, в котором записано ФИО, выделить составляющие ФИО.

Еще три функции служат для работы со словарем исключений. С помощью функции UpdateExceptions можно принять изменения, сделанные в словаре исключений. Функция GetExceptionFileName позволяет получить полное имя словаря исключений, а SetDictionary — установить словарь в качестве рабочего.

Начиная с версии 3.3, стало возможным выполнять склонение ФИО, должностей и подразделений, обращаясь к методам сервера автоматизации. В ряде случаев это может оказаться предпочтительнее, чем вызывать экспортируемые функции DLL, а в некоторых — единственно возможный путь (использование в продуктах 1С, ASP скрипты и т.д.).

Описание экспортируемых функций DLL, их параметров, а также методов и свойств сервера автоматизации и рекомендации по использованию приводятся в соответствующих разделах.

4. Установка

Для нормального функционирования библиотека Padeg.dll должна находится в доступном для ОС месте. Обычно это — "\Windows\System\" ("\WinNT\SYSTEM32\" — для Windows NT\2000\ХР). Ограничений на местоположение словаря исключений нет. Однако желательно поместить его в каталог: C:\Program Files\Microsoft Office\Office. Если путь к каталогу Office отличается от приведенного или принято решение разместить файл словаря в другом месте, то в этом случае перед установкой программы потребуется редактирование параметра "ExceptionDicDir" в файле Padeg.reg. Для уже установленной библиотеки или при изменении в процессе ее эксплуатации местоположения файла исключений полнофункциональная работа обеспечивается путем редактирования параметра реестра:

HKEY_LOCAL_MACHINE\Software\Padeg\ExceptionDicDir.

Кроме этого, работой программы можно управлять при помощи следующих параметров в секции реестра HKLM\Software\Padeg:

ПараметрТипНазначениеDefault
AccentSymbolStringслужит для обозначения ударной гласной в секции словаря [Accent]"
AccentPositionDWORDсимвол ударения ставится перед (0) или после (1) ударной гласной0

Таким образом, процесс установки сводится к следующему:

  1. Скопировать файлы Padeg.dll и Except.dic в рекомендованные диектории;
  2. При необходимости отредактировать значение параметра "ExceptionDicDir" в файле Padeg.reg для обеспечения возможности работы со словарем исключений;
  3. Выполнить файл Padeg.reg для внесения служебной информации в системный реестр Windows.
  4. Для обеспечения работы с сервером автоматизации необходимо зарегистрировать его, выполнив в командной строке: regsvr32.exe padeg.dll

Примечание: Если файлы Padeg.dll и Except.dic размещаются в папке проекта, то можно не выполнять пункты 1..3. В этом случае будут использоваться значения по-умолчанию для приведенных выше параметров.

5. Экспортируемые функции DLL и рекомендации по их использованию

5.1. Общие положения

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

Двойные фамилии (и даже тройные, если такие есть) склоняются по установленным правилам. В общем случае, будут верно склоняться "N-спальные" с любым N. Единственное требование к такой фамилии — она должна разделяться дефисами: Лебедев-Кумач, Уткин-Задунайский-Краматорский.

Несколько слов по поводу параметра nPadeg, задающего номер падежа (1 — именительный; 2 — родительный и т.д.) в который требуется преобразовать входные данные. При значении этого параметра [2..6] выполняется преобразование ФИО в соответствующий падеж. Если же задать значение, равное 1, то преобразования, естественно, не произойдет, т.к. бессмысленно преобразовывать в именительный падеж то, что уже записано в этом падеже, но выполнится форматирование ФИО: первые символы составляющих ФИО преобразуются к прописным, если они были строчными, а сами составляющие разделятся одним пробелом.

При использовании функций библиотеки следует иметь в виду, что встречаются "нестандартные" ФИО, для которых может быть получен неверный результат, и предусмотреть возможность ручной корректировки. В частности, это касается дательного, творительного и предложного падежей, где окончание некоторых имен и фамилий зависит от положения ударения в именительном падеже, определить которое алгоритмически не представляется возможным. Заметим, что в предлагаемой версии сделана попытка исправить положение путем введения секции [Accent] в словарь исключений.

5.2. Функции, выполняющие склонение ФИО, должностей и подразделений

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

0 — успешное завершение;

-1 — недопустимое значение падежа;

-2 — недопустимое значение рода;

-3 — размер буфера недостаточен для размещения результата преобразования ФИО.

Здесь значение 0 не означает, что преобразование выполнено грамматически правильно, а лишь показывает, что функция отработала без ошибок.

Необходимо отметить, что поскольку параметр рода (bSex) для этих функций — логический (True — мужской и False — женский), то значение -2 никогда не будет возвращено в виде результата выполнения и оставлено только для совместимости с предыдущими версиями.

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

5.2.1. GetFIOPadeg

function GetFIOPadeg(pLastName, pFirstName, pMiddleName: PChar;
                     bSex: Boolean; nPadeg: LongInt; pResult: PChar;
                     var nLen: LongInt): Integer; stdcall; export;

Помещает в буфер (pResult) размера (nLen) результат склонения фамилии (pLastName), имени (pFirstName) и отчества (pMiddleName) рода (bSex) в заданный падеж (nPadeg). Значение функции — результат выполнения операции преобразования.

Данная функция является основной в библиотеке и наиболее универсальной. В качестве параметров ей необходимо передать ФИО в виде трех строк (каждая из которых может быть пустой), явно указанный род, требуемое значение падежа, указатель на буфер результата и размер этого буфера (после преобразования этим параметром возвращается реальный размер результата). При таких условиях этой функцией можно склонять ФИО и его составляющие в любых комбинациях. Корректно обрабатываются фамилии с инициалами (Сидоров И.П.) — склоняться будет только фамилия (у Сидорова И.П.). Допускается использование инициалов, состоящих более чем из одного символа (Иванов Вс.Никод.). Кроме ФИО славянского типа эта функция может выполнять склонение корейских, китайских и им подобным имен. При этом первое слово в таком имени соответствует фамилии, второе — имени и третье — отчеству в наших терминах. Другими словами, при склонении Иванов Иван Иванович и Ли Си Цын не требуется перестановка составляющих ФИО. Поскольку имена подобного вида иногда записывают двумя словами (Ли Сицын), то при вызове функции склонения для такой формы записи необходимо первым параметром передать пустую строку. В подавляющем большинстве случаев эта функция пригодна и для склонения ФИО, записанного в формате "Фамилия Имя [Имя]" (Кеннеди Джон [Фиджеральд]).

Допускается использование признаков рода в фамилии (-оглы/-кызы), записанных через дефис.

5.2.2. GetFIOPadegAS

function GetFIOPadegAS(pLastName, pFirstName, pMiddleName: PChar;
                       nPadeg: LongInt; pResult: PChar; 
                       var nLen: LongInt): Integer; stdcall; export;

Помещает в буфер (pResult) размера (nLen) результат склонения фамилии (pLastName), имени (pFirstName) и отчества (pMiddleName) в заданный падеж (nPadeg) с автоматическим определением рода. Значение функции — результат выполнения операции преобразования.

Функция предназначена для склонения ФИО, род которых неизвестен. Определение рода осуществляется по окончанию отчества. Корректно обрабатываются отчества, имеющие признак рода: Оглы (сын) или Кызы (дочь). Признак рода может записываться через дефис (Аскер-Оглы) или пробел (Аскер Оглы).

5.2.3. GetFIOPadegFS

function GetFIOPadegFS(pFIO: PChar; bSex: Boolean; nPadeg: LongInt;
                      pResult: PChar; var nLen: LongInt):Integer; stdcall;
                      export;

Помещает в буфер (pResult) размера (nLen) результат склонения фамилии имени и отчества, записанных одной строкой (pFIO), рода (bSex) в заданный падеж (nPadeg). Значение функции — результат выполнения операции преобразования.

Функция выполняет преобразование ФИО, заданного одной строкой и требует явного указания рода. Порядок следования составляющих ФИО в строке параметра — фамилия, имя, отчество. Эта функция, как и GetFIOPadeg, тоже допускает использование инициалов и может выполнять преобразование имен типа китайских. Для корректной работы функции необходимо наличие трех компонент ФИО (имена китайского типа допускается задавать двумя словами). В ряде случаев правильно обрабатываются ФИО, записанные в формате "Фамилия Имя [Имя]".

5.2.4. GetFIOPadegFSAS

function GetFIOPadegFSAS(pFIO: PChar; nPadeg: LongInt; pResult: PChar;
                         var nLen: LongInt):Integer; stdcall; export;

Помещает в буфер (pResult) размера (nLen) результат склонения фамилии имени и отчества, записанных одной строкой (pFIO), в заданный падеж (nPadeg) с автоматическим определением рода. Значение функции — результат выполнения операции преобразования.

Функция предназначена для склонения ФИО, заданных одной строкой, род которых неизвестен. Определение рода осуществляется по окончанию отчества. Функция корректно обрабатывает отчества, имеющие признак рода: Оглы (сын) или Кызы (дочь). Признак рода может записываться через дефис (Аскер-Оглы) или пробел (Аскер Оглы).

5.2.5. GetIFPadeg

function GetIFPadeg(pFirstName, pLastName: PChar; bSex: Boolean;
                    nPadeg: LongInt; pResult: PChar;
                    var nLen: LongInt): Integer; stdcall; export;

Помещает в буфер (pResult) размера (nLen) результат склонения имени (pFirstName) и фамилии (pLastName) рода (bSex) в заданный падеж (nPadeg). Значение функции — результат выполнения операции преобразования.

Функция предназначена для склонения пар "Имя Фамилия" (Марк Твен) и требует явного указания рода. Эта функция также пригодна для склонения имен собственных типа Джон Фиджеральд Кеннеди. В этом случае Джон Фиджеральд следует передавать одним параметром, как имя. Разделитель слов в параметре — пробел.

5.2.6. GetIFPadegFS

function GetIFPadegFS(pIF: PChar; bSex: Boolean; nPadeg: LongInt;
                      pResult: PChar; var nLen: LongInt): Integer;
                      stdcall; export;

Помещает в буфер (pResult) размера (nLen) результат склонения имени и фамилии (pIF), записанных одной строкой, рода (bSex) в указанный падеж (nPadeg). Значение функции — результат выполнения операции преобразования.

Функция предназначена для склонения пар "Имя Фамилия" (Марк Твен), записанных одной строкой, и требует явного указания рода. Эта функция также пригодна для склонения имен собственных типа Джон Фиджеральд Кеннеди. При использовании данной функции следует иметь в виду, что фамилией считается последнее слово параметра, а все предыдущие — именами и склоняются соответствующим образом.

5.2.7. GetNominativePadeg

function GetNominativePadeg(pFIO, pResult: PChar; var nLen:
                            LongInt): Integer; stdcall; export;

Помещает в буфер (pResult) размера (nLen) восстановленный именительный падеж для ФИО, записанного одной строкой (pFIO) в произвольном падеже. Значение функции — результат выполнения операции преобразования.

Функция выполняет восстановление именительного падежа для ФИО, заданного в произвольном падеже в формате "Фамилия Имя Отчество". Значение, возвращаемое функцией, может быть равно 0 или -3. Более подробно о восстановлении именительного падежа сказано в разделе "Восстановление именительного падежа".

5.2.8. GetAppointmentPadeg

function GetAppointmentPadeg(pAppointment: PChar; nPadeg: LongInt;
                             pResult: PChar; var nLen: LongInt): Integer;
                             stdcall; export;

Помещает в буфер (pResult) размера (nLen) результат склонения наименования должности (pAppointment) в заданный падеж (nPadeg). Значение функции — результат выполнения операции преобразования.

Функция предназначена для склонения наименования должностей, записанных одной строкой. Начиная с версии библиотеки 3.3.0.21 стала возможной обработка составных должностей. Разделителем в этом случае должна быть цепочка символов: пробел, дефис, пробел (' - '). При этом, каждая из должностей в в своем составе может содержать дефис (инженер-конструктор).

5.2.9. GetFullAppointmentPadeg

function GetFullAppointmentPadeg(pAppointment, pOffice: PChar;
                                 nPadeg: LongInt; pResult: PChar;
                                 var nLen: LongInt): Integer; stdcall;
                                 export;

Помещает в буфер (pResult) размера (nLen) результат объдинения наименований должности (Appointment) и подразделения (Office) в падеже (nPadeg). Значение функции — результат выполнения операции преобразования.

Функция позволяет получить полное наименование должности и выполнить его преобразование в заданный падеж. При объединении удаляются повторяющиеся слова при их наличии. Например: должность — Начальник цеха; подразделение — Цех нестандартного оборудования; результат — Начальник цеха нестандартного оборудования. Все, сказанное выше в отношении составных должностей, справедливо и для данной функции.

5.2.10. GetOfficePadeg

function GetOfficePadeg(pOffice: PChar; nPadeg: LongInt; pResult: PChar;
                        var nLen: LongInt): Integer; stdcall; export;

Помещает в буфер (pResult) размера (nLen) результат склонения наименования подразделения (pSrc) в заданный падеж (nPadeg). Значение функции — результат выполнения операции преобразования.

Функция предназначена для склонения наименования подразделений, записанных одной строкой. Кроме подразделений функция также может выполнять склонение и наименований предприятий.

5.3. Сервисные функции

5.3.1. GetSex

function GetSex(pMiddleName: PChar): Integer; stdcall; export;

Определяет род по отчеству, записанному в произвольном падеже.

Значение, возвращаемое этой функцией, содержит информацию о роде:

1 — мужской;

0 — женский;

-1 — невозможно определить;

Позволяет определить род ФИО. Допускается параметром передавать не только отчество, но и ФИО целиком. Главное, чтобы в передаваемой строке последним было отчество.

5.3.2. GetPadegID

function GetPadegID(pFIO: PChar): Integer; stdcall; export;

Определяет номер падежа в котором записано ФИО(pFIO).

Значение, возвращаемое этой функцией, содержит информацию о падеже:

0 — не определен;

1 — именительный;

...

6 — предложный;

Позволяет определить падеж ФИО. К сожалению, однозначно определить номер падежа можно только учитывая контекст предложения, поскольку запись, допустим, родительного и винительного падежей для мужских ФИО совпадают. То же самое справедливо в отношении женских ФИО для дательного и предложного падежей. В таких случаях функция возвращает значение 2 для мужчин и 3 для женщин.

5.3.3. GetFIOParts

function GetFIOParts(pFIO: PChar; Parts: PPartsFIO): Integer; stdcall;
                     export;

Выделяет из ФИО (pFIO) его составляющие. Результат помещается в буфер (Parts).

Позволяет выделить из заданного ФИО его части. Результат работы помещается в запись со структурой:

type
  PPartsFIO = ^TPartsFIO;
  TPartsFIO = record
    pLastName, pFirstName, pMiddleName : PChar;
    nLastName, nFirstName, nMiddleName : LongInt;
  end;

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

0 — успешное завершение;

-3 — размер буфера pLastName недостаточен;

-4 — размер буфера pFirstName недостаточен;

-5 — размер буфера pMiddleName недостаточен;

Корректно обрабатываются ФИО, содержащие признак рода (Оглы, Кызы) записанный через дефис или пробел.

5.4. Функции, работающие со словарем исключений

Группа функций, работающих со словарем исключений, имеет (в основном) тип — Boolean.

5.4.1. UpdateExceptions

function UpdateExceptions: Boolean; stdcall; export;

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

Значение, возвращаемое этой функцией, содержит информацию о том, что словарь исключений найден и программа с ним работает (True). В противном случае функция возвратит значение False.

5.4.2. GetExceptionsFileName

function GetExceptionsFileName(pResult: PChar; var nLen: LongInt): Integer;
                               stdcall; export;

Возвращает в буфере (pResult) рамера (nLen) полное имя словаря исключений.

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

5.4.3. SetDictionary

function SetDictionary(FileName: PChar): Boolean; stdcall; export;

Устанавливает в качестве рабочего словарь FileName.

Позволяет приложениям работать с различными словарями. Может быть полезной при разграничении прав доступа пользователей. Осуществляет установку словаря в качестве рабочего и считывание из него информации. Возвращает True, если словарь установлен и обновлен и False в противном случае.

5.5. Примеры обращения к функциям библиотеки

"Объяснение принципов помогает думать. Примеры учат обезьянничать" ©, поэтому, несмотря на название раздела, приводятся все-таки, по возможности, принципы. Кроме того, примеры вызовов функций можно посмотреть и в соответствующих файлах примеров.

5.5.1. Delphi

Перед обращением к функциям DLL необходимо выбрать тип линковки — статическая или динамическая.

Статическая линковка.

Объявляется библиотечная функция:

function GetFIOPadegFSAS(pFIO: PChar; nPadeg: LongInt; pResult: PChar; var
                         nLen: LongInt):Integer; stdcall; external 
                         'padeg.dll' Name 'GetFIOPadegFSAS';

После этого можно к ней обратиться. Примерно так:

function MakePadeg(cFIO: String; nPadeg: Integer): String;
var
  tmpS   : PChar;
  nLen   : LongInt;
  RetVal : Integer;
begin
  Result := '';
  nLen := Length(cFIO) + 10; // размер буфера под результат преобразования
  tmpS := StrAlloc(nLen);    // распределение памяти под результат
  try
    RetVal := GetFIOPadegFSAS(PChar(cFIO), nPadeg, tmpS, nLen);
    // проверим возвращенное значения.
    if RetVal=-1 then
      ShowMessage('Недопустимое значение падежа - ' + IntToStr(nPadeg))
    else
      Result := Copy(tmpS, 1, nLen);
  finally
    StrDispose(tmpS); // освобождение выделенной памяти
  end;
end;

Динамическая линковка.

Сначала объявляем переменные:

var
  DllHandle : HMODULE;
  GetPadeg  : function(pFIO: PChar; nPadeg: LongInt; pResult: PChar;
                       var nLen: LongInt): Integer; stdcall;

затем, допустим, при создании формы:

procedure TForm1.FormCreate(Sender: TObject);
begin
  .....
  DllHandle := LoadLibrary('Padeg.dll');
  if DllHandle <> 0 then
    @GetPadeg := GetProcAddress(DllHandle, 'GetFIOPadegFSAS')
  else begin 
    MessageBox(0, 'Не найдена динамическая библиотека Padeg.dll'+#10+#13+
                  'Функции склонения недоступны.',
                  'Предупреждение',
                  MB_OK + MB_ICONEXCLAMATION + MB_TASKMODAL);
    btnDecl.Enabled := False; // обращение к DLL из обработчика этой кнопки
  end;
  ......
end;

сам обработчик:

procedure TForm1.btnDeclClick(Sender: TObject);
var
  pResult : PChar;
  nLen, i : Integer;
begin
  if Assigned(GetPadeg) then begin
    nLen := Length(edFIO.Text) + 10;
    pResult := StrAlloc(nLen);
    try
      i := GetPadeg(PChar(edFIO.Text), rgCase.ItemIndex+1, pResult, nLen);
      if i = 0 then Edit2.Text := StrPas(pResult)
               else Edit2.Text := IntToStr(i);  // при ошибке покажем код
    finally
      StrDispose(pResult);
    end;
  end;
end;

здесь: edFIO — TEdit, содержащий ФИО для склонения; rgCase — TRadioGroupe в которой задается нужный падеж;

ну и, наконец:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  .....
  FreeLibrary(DllHandle);
  .....
end;

Приведеные решения можно оформить в виде некоторого модуля, отвечающего за работу с DLL. В секции initialization выполнять загрузку (LoadLibrary), а в finalization — выгрузку (FreeLibrary) библиотеки. Именно такой подход использован при разработке интерфейсного модуля padegFIO.pas, входящего в комплект поставки.

5.5.2. C/C++

Для обзора возможностей библиотечных функций создадим консольный проект на Microsoft Visual C++.

Рассмотрим динамическую загрузку функций библиотеки.

// подключим необходимые модули
#include "stdafx.h"
#include 
#include 
HINSTANCE hDLL;               // хендл библиотеки DLL
// объявления используемых функций
typedef int (__stdcall *LPFNGetFIOPadegAS)
  (unsigned char *,unsigned char *, unsigned char *, int, unsigned char *, int &); 
LPFNGetFIOPadegAS lpfnGetFIOPadegAS;    // указатель на функцию
typedef int (__stdcall *LPFNGetFullAppointmentPadeg)
  (unsigned char *, unsigned char *, int, unsigned char *, int &); 
LPFNGetFullAppointmentPadeg lpfnGetFullAppointmentPadeg;
// и само тело
void main()
{
…
// загружаем библиотеку с указанием пути к ней
// (или без пути, если использовались приведенные выше рекомендации)
   hDLL=LoadLibrary("padeg.dll");
   if(hDLL==NULL)   // ошибка загрузки библиотеки
   {
      cout << "Unable to load library!" << endl;
      return;
   }
// получим указатель на нашу функцию
   lpfnGetFIOPadegAS=(LPFNGetFIOPadegAS)GetProcAddress(hDLL, "GetFIOPadegAS");
   if( lpfnGetFIOPadegAS==NULL )
   {
      cout << "Unable to load function(s)." << endl;
      FreeLibrary(hDLL);
      return;
   }
// и для примера возьмем известного русского
   char *cpLastName, *cpFirstName, *cpMiddleName;
   char cResult[200]; // буфер для результата
   cpLastName="Иванов";
   cpFirstName="Иван";
   cpMiddleName="Иванович";
   iLen=200;
// указываем фамилию, имя, отчество, падеж и куда поместить результат
   iParam=lpfnGetFIOPadegAS((unsigned char *) cpLastName, 
             (unsigned char *) cpFirstName,
             (unsigned char *)cpMiddleName, 
             5,
             (unsigned char *)cResult,
             iLen); 
   cout << cResult << endl; // на выходе видим "Ивановым Иваном Ивановичем"
// аналогично просклоняем должность и отдел
   lpfnGetFullAppointmentPadeg=(LPFNGetFullAppointmentPadeg)GetProcAddress(hDLL, "GetFullAppointmentPadeg");
   if( lpfnGetFullAppointmentPadeg==NULL )
   {
      cout << "Unable to load function GetFullAppointmentPadeg" << endl;
      FreeLibrary(hDLL);
      return;
   }
// только теперь, для разнообразия, укажем размер входящих буферов
   char cAppointment[100], cOffice[100];
   iLen=200;
   strcpy(cAppointment,"инженер-программист");
   strcpy(cOffice, "отдел информационных технологий");
   iParam=lpfnGetFullAppointmentPadeg((unsigned char *)cAppointment,
             (unsigned char *)cOffice,
             5,
             (unsigned char *)cResult,
             &iLen);
// на выходе "инженером-программистом отдела информационных технологий"
   cout << cResult << endl; 
   FreeLibrary(hDLL); // освобождаем память
  …
}

5.5.3. VB/VBA

Предлагаемая версия программы совместима с продуктами Microsoft Office 97/2000/XP.

Ниже приводятся примеры объявления библиотечных функций GetFIOPadegFSAS и GetNominativePadeg, а также глобальной функции MakePadeg (см. также файл Example.bas).

' Функция склонения ФИО с автоматическим определением пола по отчеству
Private Declare Function GetPadeg Lib "Padeg.dll" Alias "GetFIOPadegFSAS" _
  (ByVal pFIO As String, ByVal nPadeg As Long, _
   ByVal pResult As String, ByRef nLen As Long) As Integer
' Функция восстановления именительного падежа
Private Declare Function GetNominativePadeg Lib "Padeg.dll" _
  (ByVal pFIO As String, ByVal pResult As String, _
   ByRef nLen As Long) As Integer
' Функция преобразования cFIO в падеж nPadeg
Public Function MakePadeg(ByVal cFIO As String, _
                          ByVal nPadeg As Long) As String
Dim tmpS As String
Dim nLen As Long
Dim RetVal As Integer
  nLen = 255
  tmpS = String(nLen, 0)
  RetVal = GetPadeg(cFIO, nPadeg, tmpS, nLen)
  If RetVal = -1 Then MsgBox "Недопустимое значение падежа - " & _
                             "(" & nPadeg & ")", , "Склонение"
  MakePadeg = Mid(tmpS, 1, nLen)
End Function
' Функция восстановления именительного падежа
Public Function Nominative(ByVal cFIO As String) As String
Dim tmpS As String
Dim nLen As Long
Dim RetVal As Integer
  nLen = 255
  tmpS = String(nLen, 0)
  RetVal = GetNominativePadeg(cFIO, tmpS, nLen)
  Nominative = Mid(tmpS, 1, nLen)
End Function

Как видно из кода, реализация функции MakePadeg предусматривает вывод предупреждения с указанием неправильного значения падежа при некорректном его задании. Обращение к остальным функциям DLL производится аналогично.

Для выполнения операций склонения в приложениях Microsoft Word и Microsoft Excell в поставку включены макросы, основой которых является функция MakePadeg. Указанные макросы находятся в файлах MacroWrd.bas и MacroExl.bas для MS Word и MS Excell, соответственно. Кроме того, в поставку входит шаблон Справка.dot с несколько модифицированной функцией MakePadeg. Поместите его в каталог "\Program Files\Microsoft Office\Шаблоны" или другой, содержащий шаблоны для MS Office. Создайте документ на основе этого шаблона ("Пуск->Создать документ Microsoft Office"). Ввод ФИО получателя справки и вставка в текст ФИО в нужном падеже производится с помощью панели инструментов "Ввод ФИО для справки".

Приведенные макросы и функции могут использоваться как сами по себе, так и при разработке собственных программ.

6. Восстановление именительного падежа

Как отмечалось выше, настоящая версия библиотеки дополнена функцией для восстановления именительного падежа для ФИО, заданного в произвольном падеже в формате "Фамилия Имя Отчество". К сожалению, нам не удалось получить точности восстановления именительного падежа, сравнимой с точностью преобразования в некоторый падеж. Это связано, в частности, с тем, что запись, допустим, родительного падежа для разных фамилий (Перцева и Перцевая) могут совпадать (Перцевой). Подобную коллизию не в состоянии разрешить даже человек. Кроме того, окончаниями некоторых фамилий в склонении могут быть гласные: "ы", "и", "у", "ю", "е". Как известно, фамилии, имеющие такие окончания, относятся к несклоняемым и поэтому при восстановлении невозможно определить является ли такая фамилия несклоняемой или получила такое окончание в результате склонения. Однако если подобные фамилии присутствуют в словаре исключений, то восстановление происходит без проблем. Значительно повысить точность восстановления именительного падежа можно с помощью некоторой базы ФИО. В файле Example.bas приведен текст функции NominativeByBase, использующей для восстановления именительного падежа локальную базу данных. Суть алгоритма сводится к следующему: получив ФИО для восстановления, выполняется запрос к базе данных на выборку ФИО, подобных заданному. После этого каждое ФИО последовательно преобразуется во все допустимые падежи и результат сравнивается с исходным ФИО. При полном совпадении считаем, что именительным падежом ФИО будет очередная выборка из базы. Если совпадения не удалось достичь, то именительный падеж восстанавливается экспортируемой функцией DLL. Такой подход, кроме повышения точности, может расширить спектр ФИО для которых возможно восстановление именительного падежа за счет включения в обработку ФИО с инициалами и ФИО, записанных в формате "Имя Фамилия" (естественно, при наличии в базе поля, определяющего род, и после соответствующей коррекции кода функции). При этом, использование некоторого признака (в примере — Exact) позволяет определить восстановлено ли ФИО с использованием базы данных или нет. Во втором случае можно выводить диалоговое окно с предложением проверить и откорректировать, при необходимости, результат восстановления и запросом на запись именительного падежа ФИО в базу данных.

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

Заметим, что приведенный алгоритм является примером и не учитывает возможность существования "полных" однофамильцев при необходимости точной идентификации. Кроме того, используя этот алгоритм восстановления именительного падежа, не следует забывать о возможном увеличении временных затрат.

7. Словарь исключений

Словарь исключений предназначен для коррекции алгоритма преобразования составляющих ФИО, учета национальных, региональных и семейных особенностей склонения, а также для исключения неоднозначности некоторых правил. Он представляет собой текстовый файл со структурой, подобной структуре INI — файлов и содержит 15 секций, В первые девять помещаются соответствующие компоненты ФИО, преобразование которых при склонении не должно происходить или происходить несколько иначе. Следующие пять секций служат для обеспечения работоспособности функций склонения наименований должностей и подразделений. Секции словаря имеют следующие имена и назначения:

  1. [LastName] — помещенные в эту секцию фамилии не преобразуются для любого рода, в том числе и при использовании в качестве первых частей составных фамилий.
  2. [LastNameW] — помещенные в эту секцию фамилии не преобразуются для женского рода, в том числе и при использовании в качестве первых частей составных женских фамилий.
  3. [DependedLastNameW] — женские фамилии (как правило на -ина) склонение которых зависит от склонения соответствующей мужской фамилии. Например, женской фамилии Щербина могут соответствовать мужские фамилии Щербина и Щербин.
  4. [FirstNameM] — несклоняемые мужские имена
  5. [FirstNameW] — несклоняемые женские имена
  6. [FirstPartLastName] — несклоняемые первые части составных фамилий обоих родов. При использовании в качестве отдельной фамилии, фамилии из этой секции могут изменяться, если это разрешено правилами, и они не входят в состав других секций.
  7. [BaseNonRussian] — фамилии, имеющие не славянские (или не русские) корни на -ов, -ин, -их (Бюлов, Рабин, Либих и т.д.), которые должны преобразовываться при склонении и при этом не присутствуют в других секциях.
  8. [NonLeaveVocalic] — фамилии на -ок, -ец при склонении которых не происходит выпадения гласной (Корешок — Корешока, ср. Корешка).
  9. [FirstNameParallelForms] — список параллельных форм мужских имен на -о(а). (Михайло — Михайла).
  10. [Accent] — женские имена на -ия, мужские фамилии на -ец и фамилии обоих родов на -а с предшествующей шипящей, у которых окончание в родительном, творительном и предложном падежах зависит от положения ударения.
  11. [NonAdjective] — слова на -ая, -яя, -ее, -ие, -ий, -ое, -ой, -ые, -ый не являющиеся прилагательными. Как правило, это существительные в именительном и творительном падежах.
  12. [NonDeclBeforeHyphen] — несклоняемые части составных слов.
  13. [HyphenAbbreviation] — сокращения существительных дефисом.
  14. [PointAbbreviation] — сокращения существительных точкой.
  15. [Plural] — существительные во множественном числе.
  16. [OfficeNoLowerCase] - первое слово в наименовании подразделения, которое не надо приводить к нижнему регистру при формировании полной должности.

Первые шесть секций допускают использование масок, общая часть компонент ФИО в которых обозначается символом звездочка. Например, для исключения из преобразования японских фамилий на -ава (Куросава) для обоих родов достаточно в секцию [LastName] поместить строку: *ава. Отметим, что пользоваться масками следует с известной осторожностью. Так, запись строки *ь в секцию женских имен [FirstNameW], исключит из преобразования все женские имена на -ь, в том числе и Любовь.

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

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

8. Сервер автоматизации

8.1. Краткое описание

Сервер автоматизации (ClassName — Declension) содержит восемь методов, выполняющих склонение ФИО, должностей и подразделений, а также три сервисных метода, с помощью которых можно определить род, получить номер падежа и выделить из ФИО его составляющие.

При некорректном задании падежа или рода генерируется исключение EOleException. Значение поля ErrorCode в этом случае равно -1 для неверного падежа и -2 — для неверного рода. Поле Message содержит описание ошибки с указанием значения неверного параметра.

Большинство методов сервера автоматизации реализовано в виде функций у которых типом входных строковых данных и типом результата является тип WideString. Таким же типом передается в метод информация о роде в виде одного из символов: '' (пустая строка), 'м' или 'ж' (в любом регистре). Передача в качестве параметра рода пустой строки означает требование выполнить автоматическое определение рода перед преобразованием. Если род определить невозможно (выполняется попытка склонять фамилию с инициалами, "китайского" типа или входные данные имеют формат "Фамилия Имя [Имя]") метод возвращает исходные данные без изменения. Аналогично и при указании явно ошибочного рода. Имена методов совпадают с именами соответствующих экспортируемых функций. Кроме того, сервер имеет свойство Dictionary, являющееся, в свою очередь, сервером и предоставляющим доступ к своему методу Update и свойству FileName, так же имеющему тип WideString. Свойство FileName доступно как по чтению, так и по записи. Это позволяет не только получить имя словаря исключений в приложении для выполнения некоторых действий с ним, но и устанавливать словарь в процессе работы приложения.

Ниже приводится список методов серверов автоматизации с перечислением параметров и их типов.

Declension:

function GetFIOPadeg(const cLastName, cFirstName, cMiddleName, cSex:
                     WideString; nPadeg: Integer): WideString; safecall;

function GetFIOPadegFS(const cFIO, cSex: WideString; nPadeg: Integer):
                      WideString; safecall;

function GetIFPadeg(const cFirstName, cLastName, cSex: WideString;
                    nPadeg: Integer): WideString; safecall;

function GetIFPadegFS(const cIF, cSex: WideString; nPadeg: Integer):
                      WideString; safecall;

function GetNominativePadeg(const cFIO: WideString): WideString; safecall;

function GetAppointmentPadeg(const cAppointment: WideString; nPadeg:
                             Integer): WideString; safecall;

function GetOfficePadeg(const cOffice: WideString; nPadeg: Integer;):
                        WideString; safecall;

function GetFullAppointmentPadeg(const cAppointment, cOffice: WideString;
                                 nPadeg: Integer): WideString; safecall;

function GetSex(const cMiddleName: WideString): Integer; safecall;

function GetPadegID(const cFIO: WideString): Integer; safecall;

procedure SeparateFIO(const cFIO: WideString; var cLastName, cFirstName,
                      cMiddleName: WideString); safecall;

Dictionary:

function Update: WordBool; safecall;

Все сказанное выше в отношении экспортируемых функций в части их работы и особенностей остается справедливым и для методов сервера. Естественно, с учетом того, что типы параметров методов и возвращаемых ими значений стали другими.

8.2. Примеры обращения

Работа с сервером автоматизации из приложений, реализованных на различных языках, осуществляется стандартно для технологии COM.

8.2.1. Delphi

После объявления переменной:

var
  Decl : Variant;

Создается объект автоматизации:

Decl := CreateOleObject('Padeg.Declension');

Выполнение операций склонения сводится к вызову требуемых методов с передачей им необходимых параметров. Естественно, вместо строковых параметров можно использовать строковые переменные.

// явное задание рода, дательный падеж
SomeStr := Decl.GetFIOPadeg('Злотникова','Людмила','Владимирована','ж',3); 

// автоопределение рода, родительный падеж
SomeStr := Decl.GetFIOPadegFS('Иванов Иван Иванович', '', 2); 

// дательный падеж для должности "Начальник цеха нестандартного оборудования"
SomeStr := Decl.GetFullAppointmentPadeg('Начальник цеха',
                                        'Цех нестандартного оборудования',
                                        3);
// определить падеж ФИО
SomeInt := Decl.GetPadegID('Ивановым Иваном Ивановичем');

// получить имя файла словаря
ExceptFileName := Decl.Dictionary.FileName; 

// установить словарь
Decl.Dictionary.FileName := FullExceptDicFileName; 

// обновить словарь
[SomeBool :=] Decl.Dictionary.Update;

После завершения работы с объектом Decl нужно освободить его, выполнив:

Decl := UnAssigned;

8.2.2. VB/VBA (включая VB Script)

В качестве примера приводится текст функции из приложения, реализующего формирование приказов.

Public Function PersonDescription(ByVal FIO As String, _
                                        Sex As Boolean, _
                                  ByVal Appointment As String, _
                                  ByVal Office As String, _
                                        Amount As Single, _
                                        CoWorker As Boolean) As String
' возвращает ФИО и полную должность в дательном падеже
Dim Decl As Object
Dim nLen As Long, strWorker As String, nWrkPadeg As Long
On Error Resume Next
  ' выделим номер и сформируем наименование подразделения
  nLen = InStr(Office, "науч")
  If nLen = 0 Then nLen = Len(Office) + 1
  Office = Trim(Mid(Office, 1, nLen - 1))
  Select Case Mid(Office, 1, 1)
    Case "Г"
      Office = "госбюджетная тема " & Office
    Case "Х"
      Office = "хоздоговорная тема " & Office
  End Select
  
  ' первый символ должности в нижний регистр
  Appointment = LCase(Mid(Appointment, 1, 1)) & Mid(Appointment, 2)
  
  If Amount = 1 Then
    strWorker = ""
    nWrkPadeg = 3 ' дательный
  Else
    strWorker = IIf(Sex, "работающему ", "работающей ") & _
                "на " & Amount & " ставки должности "
    nWrkPadeg = 2 ' родительный
  End If
  Set Decl = CreateObject("Padeg.Declension")
  ' проверим результат создания объекта Decl
  If Err.Number = 0 Then
    ' просклоняем ФИО и преобразуем фамилию к верхнему регистру
    FIO = UCaseFIO(Decl.GetFIOPadegFS(FIO, IIf(Sex, "м", "ж"), 3)) & ", "
    
    PersonDescription = FIO & strWorker & _
          Decl.GetFullAppointmentPadeg(Appointment, Office, nWrkPadeg) & _
          IIf(CoWorker, " по совместительству", "")
  Else
    ' преобразуем фамилию к верхнему регистру
    FIO = UCaseFIO(FIO) & ", "
    ' выведем результат для ручной правки
    PersonDescription = FIO & strWorker & Appointment & ", " & Office & _
          IIf(CoWorker, " по совместительству", "")
  End If
  Set Decl = Nothing
End Function

8.2.3. 1C

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

Склонение = СоздатьОбъект("Padeg.Declension");
// автоопределение рода, родительный падеж
ФИО_РодПадеж = Склонение.GetFIOPadegFS("Иванов Иван Иванович", "", 2);

Для удобства использования функций библиотеки в составе конфигурации 1С инициализацию COM-объекта удобно определить в глобальном модуле и проводить один раз при старте системы:

// Глобальный модуль
Перем Склонение Экспорт; // ссылка на объект сервера автоматизации
...
// предопределенная системная процедура
Процедура ПриНачалеРаботыСистемы()
  Склонение = 0;
  Попытка
    Склонение = СоздатьОбъект("Padeg.Declension");
  Исключение
    Сообщить("Функции склонения недоступны! ", "!" );
  КонецПопытки;
  ...
КонецПроцедуры //ПриНачалеРаботыСистемы

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

// Выражение в шаблоне таблицы документа "РасходныйКассовыйОрдер".
// Выдать: <ФИО в дательном падеже>
// (если функции склонения недоступны, то выводим "как есть")
?( Склонение=0, Сотр, Склонение.GetFIOPadegFS( Сотр.Наименование, "", 3 ); 

При работе с библиотекой, "подключенной" к 1С данным способом, необходимо учитывать, что при передаче параметров в вызываемые методы автоматическое преобразование агрегатных типов данных ("Справочник", "Перечисление") к базовым ("Строка") не производится, поэтому при несоответствии будет сгенерировано исключение:

// в форме списка справочника
ВыбСотр = ТекущийЭлемент();
Род = Склонение.GetSex( ВыбСотр.Наименование ); // правильно 
Род = Склонение.GetSex( ВыбСотр ); // неправильно, ошибка

Со словарем исключений следует работать через атрибут Dictionary объекта сервера автоматизации:

Если Склонение.Dictionary.Update() = 0 Тогда
  Сообщить( "Не найден словарь исключений", "!" );
Иначе
  Сообщить( "Активный словарь исключений: "+Склонение.Dictionary.FileName);
КонецЕсли;

Вызов метода SeparateFIO(), единственного метода, возвращающего результат в выходные параметры процедуры, не приведет к желаемому эффекту из-за особенностей реализации OLE-взаимодействия самой системы 1С:

Фам = ""; Имя = ""; Отч = "";
Склонение.SeparateFIO("Иванов Иван Иванович", Фам, Имя, Отч);
// Результат: Фам=""; Имя=""; Отч="";

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

Альтернативные способы подключения библиотеки в 1С

Использование внешней компоненты "Universal 1C LanguageExtender" (ULE)

ULE — это внешняя компонента 1С, которая позволяет инициализировать в среде 1С другой COM-объект таким образом, что для 1С подключенный COM-объект представляется "как внешняя компонента", что в данном случае дает возможность полноценно использовать метод SeparateFIO().

Код инициализации объекта сервера автоматизации будет выглядеть так:

Если ПодключитьВнешнююКомпоненту( "ULE.dll" ) = 1 Тогда
  // создаем объект ULE - "пустую" внешнюю компоненту
  Склонение = СоздатьОбъект( "AddIn.ULE" );
  // наполняем "пустышку" функционалом нашего объекта
  Склонение.TransmuteInto( "Padeg.Declension", "" );
  // теперь <Склонение> - ссылка на объект "внешней компоненты"
КонецЕсли;

Подробнее о компоненте ULE

Использование внешней компоненты "V7 Name Declination Support" (NDS)

NDS — это внешняя компонента 1С, объект которой осуществляет динамические вызовы функций, экспортируемых библиотекой padeg.dll (см. п.3). Поскольку реализация NDS соответствует "технологии создания внешних компонент" 1С (AddIn 2.0 Type Library), то это дает возможность использовать русскоязычные синонимы функций библиотеки, а также передавать в качестве параметров объекты не только базовых, но и агрегатных типов данных.

Подключение компоненты и создание объекта сервера автоматизации стандартны для 1С:

Если ПодключитьВнешнююКомпоненту( "ndeclin.dll" ) = 1 Тогда
  Склонение = СоздатьОбъект( "AddIn.NameDeclination" );
КонецЕсли;

Подробнее о компоненте NDS

9. Область применения

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

10. Правила склонения ФИО, реализованные в библиотеке

Не склоняются:

  1. Женские фамилии, оканчивающиеся на согласный звук и мягкий знак (у Анны Жук, семья Марии Мицкевич, назначить Людмилу Коваль).
  2. Женские имена, оканчивающиеся на согласный звук (Кармен, Гюльчетай, Долорес, Элен, Суок, Эдит, Элизабет).
  3. Иноязычные фамилии, оканчивающиеся на гласный звук, исключая безударные -а, -я (Гюго, Бизе, Россини, Шоу, Неру, Гете, Бруно, Дюма, Золя).
  4. Мужские и женские имена, оканчивающиеся на гласный звук исключая -а, -я (Серго, Нелли).
  5. Фамилии на -а, -я с предшествующим гласным -и (сонеты Эредия, стихи Гарсия, рассказы Гулиа)
  6. Русские фамилии, представляющие собой застывшие формы родительного падежа единственного числа с окончаниями: -ово, -аго, -яго (Дурново, Сухово, Живаго, Шамбинаго, Дебяго, Хитрово) и множественного числа с окончаниями: -их, -ых (Крученых, Островских, Польских, Долгих, Седых). В разговорной речи фамилии на -их, -ых могут склоняться.
  7. Украинские по происхождению фамилии на ударное и безударное -ко (Головко, Ляшко, Франко, Янко, юбилей Шевченко, деятельность Макаренко, произведения Короленко).
  8. Первая часть двойной фамилии, если она сама по себе не употребляется как фамилия (в роли Сквозняк-Дмухановского, исследования Грун-Грижимайло, скульптура Демут-Малиновского).

Склоняются:

  1. Мужские фамилии и имена, оканчивающиеся на согласный звук и мягкий знак. (институт им. С.Я.Жука, стихи Адама Мицкевича, встретить Игоря Коваля).
  2. Женские имена, оканчивающиеся на мягкий знак. (Любовь, Юдифь).
  3. Склоняются, как правило, фамилии на неударные -а, -я (в основном славянские, романские и некоторые другие) (статья В.М. Птицы, творчество Яна Неруды, песни в исполнении Роситы Кинтаны, беседа с А.Вайдой, стихи Окуджавы). Колебания наблюдаются в употреблении грузинских и японских фамилий, где встречаются случаи склоняемости и несклоняемости:
    • игра нар. артиста СССР Харавы; 100 лет со дня рождения Сен-Катаямы, фильмы Куросавы;
    • работы А.С. Чикобава (и Чикобавы); творчество Пшавела; министр в кабинете Икэда; выступление Хатояма; фильмы Витторио де Сика (не де Сики).
  4. Славянские фамилии на ударные -а, -я (у писателя Майбороды, с философом Сковородой, к режиссеру Головне).
  5. Первая часть русских двойных фамилий, если она сама по себе употребляется как фамилия (стихи Лебедева-Кумача, постановка Немировича-Данченко, выставка Соколова-Скаля)
  6. Стоящее перед фамилией иностранное имя, оканчивающееся на согласный звук, склоняется (романы Жюля Верна, рассказы Марка Твена). Но, по традиции: романы Вальтер (и Вальтера) Скотта, песни о Робин Гуде.
  7. При склонении иностранных фамилий и имен используются формы русских склонений и не сохраняются особенности склонения слов в языке подлинника. (Карел Чапек — Карела Чапека [не Карла Чапека]). Также польские имена (у Владека, у Эдека, у Янека [не: у Владка, у Эдка, у Янка]).
  8. Польские женские фамилии на -а склоняются по образцу русских фамилий на -ая (Бандровска-Турска — гастроли Бандровской-Турской, Черни-Стефаньска — концерты Черни-Стефаньской). При этом возможно оформление таких фамилий по образцу русских и в именительном падеже (Опульская-Данецкая, Модзелевская). То же целесообразно для чешских фамилий на -а (Бабицка — Бабицкая, Бабицкой).
  9. Славянские мужские фамилии на -и, -ы целесообразно склонять по образцу русских фамилий на -ий, -ый (Бобровски — Бобровского, Покорны — Покорного). При этом возможно оформление таких фамилий по образцу русских и в именительном падеже (Бобровский, Покорный, Лер-Сплавинский).

Особенности склонения на -а:

  1. Если перед -а стоит согласная, то окончаниями падежей будут: -а, -ы, -е, -у, -ой, -е.
  2. Если перед -а стоит одна из букв (г, к, х) или мягкая шипящая (ч, щ) или ж, то окончанием род.п. будет -и.
  3. Если перед -а стоит шипящая (ч, щ, ц, ш) или ж, то окончанием тв.п. при ударении на конец слова будет -ой, и -ей при ударении на начало или середину слова.

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

Если Вы можете дополнить приведенные правила — напишите нам (желательно с точной ссылкой на источник) и мы постараемся реализовать Ваши дополнения.

11. Комплект поставки

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

  1. Library.zip
    • Библиотека динамической компоновки — Padeg.dll
    • Файл словаря исключений — Except.dic
    • Файл Padeg.reg
  2. LibrarySmall.zip
    • Библиотека динамической компоновки — Padeg.dll
    • Файл словаря исключений — Except.dic
    • Файл Padeg.reg
  3. Docs.zip
    • Файл License.txt
    • Файл справки для 1С — Padeg.als
    • Файл Price.txt
    • Файл Files.txt
    • Этот файл — ReadMe.doc
  4. Samples.zip
    • Файл с примерами (VB/VBA) — Example.bas
    • Пример использования в Visual FoxPRO — FoxPro.prg
    • Макросы для MS Excel — MacroExl.bas
    • Макросы для MS Word — MacroWrd.bas
    • Скрипт Oracle — Packet_padeg_v3.sql
    • Файл Padeg.h
    • Текст библиотеки на pl/sql для Oracle Forms — Padeg.pll
    • Компилированная библиотека для Oracle Forms — Padeg.plx
    • Модуль Object Pascal — PadegFIO.pas
    • Скрипт MS SQLServer 2000 — xp_padeg.rar
    • Шаблон MS Word — Справка.dot
    • С# обертка для Padeg.dll - Declension1251.cs

Архив LibrarySmall.zip отличаются от Library.zip тем, что включенный в него файл Padeg.dll не содержит сервер автоматизации.

Файлы для Oracle Forms проверены для версий 6 и 6i.

12. Литература

Приведенные правила склонения имен собственных сформулированы по материалам следующих источников:

  1. Розенталь Д.Э., Теленкова М.А., "Словарь трудностей русского языка", 3-е изд., доп. М., Русский язык, 1984;
  2. "Русская грамматика" т.I, изд. АН СССР, 1982;
  3. Пехливанова К.И., Лебедева М.Н., "Грамматика русского языка в иллюстрациях (для иностранцев, изучающих русский язык)", М.,Русский язык, 1989.

13. Благодарности

Авторы благодарны, всем пользователям, принявшим участие в тестировании программы, и приславшим свои замечания.

Отдельное спасибо нашей группе поддержки:

1. Анатолию Гусину за участие в выпуске первой версии программы.

2. Сотрудникам тестовой лаборатории журнала PC Magazine RE за ценные замечания и направление дальнейшего развития.

3. Елене Филипповой за неоценимую помощь в организации on-line тестирования библиотеки на сайте "Королевство Delphi"

4. Владимиру Юдину и Михаилу Бакулину за ценныe замечания и предложения.

5. Валерию Даниленко за предоставление файла Padeg.h и скрипта для MS SQLServer 2000

6. Сергею Слепову за предоставление шаблона Справка.dot

7. Никите Кирий за предоставление скрипта для Oracle.

8. Дмитрию Терехину и Павлу Ойлеру за помощь в реализации примеров для 1С и предложения по развитию программы, а Павлу еще и за предоставление файла справки Padeg.als.

9. Александру Ашихмину за помощь в реализации примеров на С/С++ и предоставление файлов для Oracle Forms.

10. Андрею Петрову за предоставление примеров использования в Visual FoxPRO.

11. Федору Шарыкину за предоставление файла Declension1251.cs для С#

продолжение списка следует...

14. Заключение

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

Со всем к Вам уважением.
Плахов С.В.
Покаташкин Г.Л.





К материалу прилагаются файлы:


Смотрите также материалы по темам:
[Обработка текста]

 Обсуждение материала [ 04-05-2022 11:06 ] 335 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования