morpher.ru +7 (925) 336 9960
[email protected]
 
 
Мой Морфер

Компонента склонения по падежам в 1С

Внешняя компонента Morpher.dll предназначена для склонения по падежам фамилий, имен и отчеств, а также произвольных словосочетаний на русском, украинском и казахском языках. Для установки компоненты не требуется регистрировать ее в системном реестре и не нужны права администратора. Компонента работает под Windows в любом звене 1С: на сервере, в тонком и толстом клиентах в режиме обычного или управляемого приложения. Для работы компоненты не требуется подключение к Интернет.

В настоящий момент реализованы функции:

ФункцияРусскийУкраинскийКазахский
Склонение фамилий, имен и отчествДаДаДа
Склонение произвольных словосочетанийДаПока нетДа
Определение рода (пола)ДаДа-
Выделение фамилии, имени и отчестваДаПока нетПока нет
Пропись чисел и денежных сумм в любом падежеДаПока нетПока нет
Пропись порядковых числительныхДаПока нетПока нет
Пропись датДаПока нетПока нет

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

Инструкция по установке и использованию

Внешняя компонента состоит из одного файла с названием Morpher.dll. Для установки достаточно поместить этот файл в папку bin 1С:Предприятия (в ту же папку, где находится файл 1cv8.exe).

Для проверки работоспособности компоненты откройте вашу конфигурацию в режиме Конфигуратора, кликните правой кнопкой на узле «Конфигурация» и выберите в появившемся меню пункт «Открыть модуль обычного приложения».

Добавьте в модуль следующий код:

Процедура ПриНачалеРаботыСистемы()

    Если ПодключитьВнешнююКомпоненту(
        "Morpher.dll", 
        "Морфер", 
        ТипВнешнейКомпоненты.Native) 
    Тогда
        морфер = Новый ("AddIn.Морфер.Русский");    
        Сообщить (морфер.Дательный ("Привет Приветыч"));
    Иначе
        Сообщить ("Не удалось ПодключитьВнешнююКомпоненту Morpher.dll.");
    КонецЕсли;

КонецПроцедуры    

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

Функции склонения

Названия функций соответствуют падежам русского языка:

Функция Вопрос Описание
Родительный кого? чего? Строит форму родительного падежа.
Дательный кому? чему? Строит форму дательного падежа.
Винительный кого? что? Строит форму винительного падежа.
Творительный кем? чем? Строит форму творительного падежа.
Предложный о ком? о чем? Предложный падеж без предлога. *
ПредложныйО о ком? о чем? Предложный падеж с предлогом О/ОБ/ОБО. *
ПредложныйВ где? Предложный падеж с предлогом В/НА. *

* См. Рекомендации по выбору варианта предложного падежа

Для украинского языка нужно создать объект "AddIn.Морфер.Українська", а список функций выглядит так:

Функція Питання Опис
Родовий кого? чого? Утворює форму родового відмінку
Давальний кому? чому? Утворює форму давального відмінку
Знахiдний кого? що? Утворює форму знахiдного відмінку
Орудний ким? чим? Утворює форму орудного відмінку
Мiсцевий на кому? на чому? Утворює форму мiсцевого відмінку без прийменника
Кличний Шановний... Утворює форму кличного відмінку

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

Для склонения на казахском языке нужно создать объект "AddIn.Морфер.Қазақша" и вызвать его функцию GetForm:

GetForm (склоняемыйТекст, число, лицо, падеж);

Эта функция имеет четыре параметра:

  1. склоняемыйТекст - слово или словосочетание, которое необходимо обработать;
  2. требуемое число: "көпше" - множественное, "" - единственное;
  3. требуемое лицо (в казахском существительные склоняются по лицам):
    Значение Жақ Лицо
    "" жақсыз без личного окончания
    "менің" I-жақ (жекеше) 1 лицо (ед.число)
    "сенің" II-жақ (жекеше) 2 лицо (ед.число)
    "сіздің" II-жақ сыпайы (жекеше) 2 лицо уважительное (ед.число)
    "оның" III-жақ (жекеше) 3 лицо (ед.число)
    "біздің" I-жақ (көпше) 1 лицо (мн.число)
    "сендердің" II-жақ (көпше) 2 лицо (мн.число)
    "сіздердің" II-жақ сыпайы (көпше) 2 лицо уважительное (мн.число)
    "олардың" III-жақ (көпше) 3 лицо (мн.число)
  4. требуемый падеж:
    Значение Септік Падеж
    "атау" или "" Атау септік Именительный падеж
    "ілік" Ілік септік Родительный падеж
    "барыс" Барыс септік Дательно-направительный падеж
    "табыс" Табыс септік Винительный падеж
    "шығыс" Шығыс септік Исходный падеж
    "жатыс" Жатыс септік Местный падеж
    "көмектес" Көмектес септік Творительный падеж

    Значение "" эквивалентно значению "атау".

Функция возвращает результат строкового типа.

Функция определения рода (пола)

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

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

Функция Возвращаемые значения Означает
Род Муж Мужской род или пол
Жен Женский род или пол
Сред Средний род
Множ Множественное число

Для украинского языка соответствующая функция называется Рід:

Функція Повертає значення Означає
Рід Чол Чоловічий рід або стать
Жін Жіночий рід або стать

Функция Рід в настоящий момент умеет возвращать только "Чол" или "Жін".

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

Функции извлечения фамилии, имени и отчества

Функции называются ИзвлечьИмя, ИзвлечьОтчество и ИзвлечьФамилию соответственно. Все три функции принимают строку текста в качестве единственного параметра и возвращают результат в виде строки. Если во входной строке нет русских слов, то функция возвращает встроенное значение Неопределено. Если во входной строке нет искомой компоненты ФИО, то соответствующая функция возвращает пустую строку.

Пример:

ФИО = "Александр Пушкин";
Сообщить (морфер.ИзвлечьФамилию (ФИО));
Сообщить (морфер.ИзвлечьИмя (ФИО));
Сообщить (морфер.ИзвлечьОтчество (ФИО));

Результат работы фрагмента:

Функция прописи чисел и денежных сумм

Функция Пропись формирует пропись числа или денежной суммы в любом падеже. Функция принимает три параметра:

  1. Числовой параметр "сумма или количество". Может быть положительным, нулем или отрицательным. До 30 десятичных знаков до и после запятой. Для денежных сумм обычно допускается до 2 знаков после запятой, подробнее ниже.
  2. Строковый параметр "единица измерения". Произвольное именное словосочетание на русском языке: "российский рубль", "доллар", "процент", "календарный день".
  3. Строковый параметр "падеж" — первая буква названия падежа: И, Р, Д, В, Т, П. Параметр необязательный. По умолчанию используется именительный падеж.

Построение прописи денежных сумм ("Сумма прописью")

Вызов Результат
морфер.Пропись(123.45, "рубль") Сто двадцать три рубля 45 копеек
морфер.Пропись(123.45, "доллар США") Сто двадцать три доллара США 45 центов
морфер.Пропись(123.45, "евро") Сто двадцать три евро 45 центов

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

Вызов Результат
морфер.Пропись(123.45, "руб.") Сто двадцать три руб. 45 коп.
морфер.Пропись(123.45, "долл. США") Сто двадцать три долл. США 45 центов
морфер.Пропись(123.45, "грн.") Сто двадцать три грн. 45 коп.

В качестве денежной единицы допускается также использование трехбуквенных кодов валют международного стандарта ISO 4217, таких как RUB, USD, EUR и др. При этом в название денежной единицы автоматически включается название страны:

Вызов Результат
морфер.Пропись(123.45, "RUB") Сто двадцать три российских рубля 45 копеек
морфер.Пропись(123.45, "UAH") Сто двадцать три украинских гривны 45 копеек
морфер.Пропись(123.45, "KZT") Сто двадцать три казахских тенге 45 тиынов

См. также Полный список обозначений валют.

Пропись чисел с произвольной единицей измерения

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

Вызов Результат
морфер.Пропись(10, "рабочий день") 10 (Десять) рабочих дней
морфер.Пропись(-2, "пункт") -2 (Минус два) пункта
морфер.Пропись(5.3, "процент") 5.3 (Пять целых три десятых) процента

Чтобы поставить результат в нужный падеж, укажите третьим параметром первую букву названия падежа (И, Р, Д, В, Т, П):

Вызов Результат
морфер.Пропись(2, "рабочий день", "Р") 2 (Двух) рабочих дней
морфер.Пропись(2, "рабочий день", "Д") 2 (Двум) рабочим дням
морфер.Пропись(2, "рабочий день", "П") 2 (Двух) рабочих днях

Например, чтобы сформировать фразу "В течение 30 (Тридцати) календарных дней", используйте код:

Сообщить("В течение " + Пропись(30, "календарный день", "Р"));

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

Обработка ошибок в функции Пропись

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

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

Ниже перечислены возможные ошибки и способы их предупреждения:

Слишком большое число. В целой части допустимо не более 30 значащих цифр.

морфер.Пропись(1000000000000000000000000000000, "единица")

Вы передали в функцию слишком большое число.

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

Примечание: Указать "слишком маленькое" число невозможно. Числа от 10 – 17 и меньше автоматически округляются до 0.

Третий аргумент (падеж) должен быть одной из букв: И, Р, Д, В, Т, П.

морфер.Пропись(1, "единица", "А")

Вы передали в функцию неправильный идентификатор падежа.

Вставьте проверку на допустимость параметра. Значения параметра должны быть заглавными русскими буквами и строго соответствовать списку.

Единица измерения нерусская или не имеет нужной падежной формы.

морфер.Пропись(5, "edinitsa")

морфер.Пропись(5, "теля")

морфер.Пропись(5, "")

Второй параметр либо пустой, либо не является русским словом, либо представляет собой слово, у которого нет нужной падежной формы.

Укажите правильную единицу измерения. Если единица измерения неизвестна на момент составления программы (вводится пользователем, читается из файла...), то оберните вызов функции Пропись в блок Попытка ... Исключение.

Слишком много цифр после запятой. Для большинства валют допустимо не более 2 цифр; для старых белорусских рублей (до деноминации 1 июля 2016 года) число должно быть целым.

морфер.Пропись(1.234, "рубль")

морфер.Пропись(123.4, "BYR")

Указанная денежная сумма содержит слишком много цифр после запятой.

Округлите сумму до нужного количества цифр. Почему функция Пропись не делает округление автоматически? Потому что это могло бы привести к ошибкам округления. Например, если 1 рубль поделить на троих и автоматически округлить результат до 0,33, то одна копейка потеряется: 0,33 * 3 = 0,99.

Пропись порядковых числительных

ПрописьПорядкового

Функция ПрописьПорядкового преобразует число в порядковое числительное: 101 -> сто первый, 45 -> сорок пятый. Функция принимает два параметра:

  1. Числовой параметр "число". Может быть целым числом от -2 147 483 648 до 2 147 483 647. Может быть положительным, нулем или отрицательным.
  2. Булевый параметр "один" — true — писать "один", false — не писать "один". Примеры: (одна) тысяча девятьсот пятый, (одно)миллионный.

Примеры построения прописи порядковых чисел:

Вызов Результат
морфер.ПрописьПорядкового(1023, false) тысяча двадцать третий
морфер.ПрописьПорядкового(1023, true) одна тысяча двадцать третий
морфер.ПрописьПорядкового(-1023, false) минус тысяча двадцать третий
морфер.ПрописьПорядкового(-1023, true) минус одна тысяча двадцать третий

ПрописьПорядковогоСЕдиницейИзмерения

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

  1. Числовой параметр "число". Может быть целым числом от -2 147 483 648 до 2 147 483 647. Может быть положительным, нулем или отрицательным.
  2. Строковый параметр "единица измерения". Произвольное именное словосочетание на русском языке: "российский рубль", "доллар", "процент", "календарный день".
  3. Строковый параметр "падеж" — первая буква названия падежа: И, Р, Д, В, Т, П. Параметр необязательный. По умолчанию используется именительный падеж.
  4. Булевый параметр "один" — true — писать "один", false — не писать. Примеры: (одна) тысяча девятьсот пятый, (одно)миллионный.

Примеры построения прописи порядковых чисел с единицей измерения:

Вызов Результат
морфер.ПрописьПорядковогоСЕдиницейИзмерения(3, "колесо", "Р", false) третьего колеса
морфер.ПрописьПорядковогоСЕдиницейИзмерения(1024, "байт", "И", false) тысяча двадцать четвёртый байт
морфер.ПрописьПорядковогоСЕдиницейИзмерения(1024, "байт", "И", true) одна тысяча двадцать четвёртый байт
морфер.ПрописьПорядковогоСЕдиницейИзмерения(-5, "уровень", "И", false) минус пятый уровень

Пропись дат

ПрописьДаты

Функция ПрописьДаты формирует пропись дат в указанном падеже. Функция принимает три параметра:

  1. Параметр "дата" типа Дата.
  2. Строковый параметр "падеж" — первая буква названия падежа: И, Р, Д, В, Т, П. Параметр необязательный. По умолчанию используется именительный падеж.
  3. Булевый параметр "один" — true — писать одна перед словом тысяча, false — не писать. Примеры: (одна) тысяча девятьсот пятый.

Примеры построения прописи даты:

Вызов Результат
морфер.ПрописьДаты(Дата(2019, 03, 08), "Р", true) восьмого марта две тысячи девятнадцатого года
морфер.ПрописьДаты(Дата(1919, 12, 31), "И", true) тридцать первое декабря одна тысяча девятьсот девятнадцатого года
морфер.ПрописьДаты(Дата(1919, 12, 31), "И", false) тридцать первое декабря тысяча девятьсот девятнадцатого года

Установка на сервер

Как известно, 1С:Предприятие имеет клиент-серверную архитектуру. Это означает, что программа может быть настроена таким образом, что в одной сети работает сервер с данными, а также один или несколько клиентов, которые ведут обмен данными с этим сервером. В некоторых случаях Morper.dll удобнее подключать к серверу, а не к клиенту. Ниже приводится пример такого подключения:

//Этот код необходимо разместить в модуле управляемого (или обычного) приложения
Процедура ПриНачалеРаботыСистемы()
    Если Не Morpher.ПодключитьМорферКСерверу()
    Тогда
        Сообщить("Не удалось ПодключитьВнешнююКомпоненту Morpher.dll.");
        Возврат;
    КонецЕсли;
 
    Сообщить( Morpher.Родительный("Помидор") );
    Сообщить( Morpher.Дательный("Помидор") );
    Сообщить( Morpher.Винительный("Помидор") );
    Сообщить( Morpher.Творительный("Помидор") );
    Сообщить( Morpher.Предложный("Помидор") );
    Сообщить( Morpher.ПредложныйО("Помидор") );
    Сообщить( Morpher.ПредложныйВ("Помидор") );
    Сообщить( Morpher.ОпределитьРод("Помидор") );
КонецПроцедуры    

Также необходимо добавить:

  • общий модуль "Morpher" с включенными параметрами в свойствах "Сервер" и "Вызов сервера":
  • параметр сеанса с именем "Морфер" и типом "Строка":

Предоставьте права доступа к параметру сеанса "Морфер". Для этого создайте роль "Руководитель":

и установите для нее право "Установка" и право "Получение":

Код модуля "Morpher" для подключения Morpher.dll к серверу будет следующим:

Функция ПодключитьМорферКСерверу() Экспорт
    Если Не ПодключитьВнешнююКомпоненту(
        "Morpher.dll", 
        "Морфер", 
        ТипВнешнейКомпоненты.Native) 
    Тогда
        Возврат Ложь;
    КонецЕсли;
 
    Морфер = Новый ("AddIn.Морфер.Русский");
    л_Структура = Новый Структура("Морфер", Морфер);
    ПараметрыСеанса.Морфер = ПоместитьВоВременноеХранилище(л_Структура, Новый УникальныйИдентификатор);
    Возврат Истина;
КонецФункции    

Теперь на сервере можно получить доступ к подключенному модулю Morpher.dll и вызвать его функции. Создадим по функции на каждый падеж для удобного склонения и функцию определения рода:

//Этот код необходимо разместить в общем модуле "Morpher" после функции ПодключитьМорферКСерверу
Функция Родительный(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.Родительный (склоняемыйТекст);
КонецФункции

Функция Дательный(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.Дательный (склоняемыйТекст);
КонецФункции

Функция Винительный(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.Винительный (склоняемыйТекст);
КонецФункции

Функция Творительный(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.Творительный (склоняемыйТекст);
КонецФункции

Функция Предложный(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.Предложный (склоняемыйТекст);
КонецФункции
        
Функция ПредложныйО(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.ПредложныйО (склоняемыйТекст);
КонецФункции
        
Функция ПредложныйВ(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.ПредложныйВ (склоняемыйТекст);
КонецФункции
        
Функция ОпределитьРод(склоняемыйТекст) Экспорт
    Морфер = ПолучитьИзВременногоХранилища(ПараметрыСеанса.Морфер).Морфер;
    Возврат Морфер.Род (склоняемыйТекст);
КонецФункции    

Что лучше – компонента или веб-сервис?

Если сравнивать компоненту 1C Morpher.dll с сервисом «Морфер.Сервер», то преимущества компоненты следующие:

  1. Работает быстрее.
  2. Не требует веб-сервера.

Преимущества локального веб-сервиса перед компонентой:

  1. Позволяет корректировать склонение при помощи пользовательского словаря.
  2. Позволяет интегрироваться с другими системами, кроме 1С.

Полезные ссылки

История изменений

Дата Версия  
22.11.2019 1.4.0.0 Добавлена функция прописи порядковых чисел и дат.
09.09.2019 1.3.0.0 Добавлено склонение по лицам на казахском языке. Добавлены новые слова.
03.05.2019 1.2.0.0 Добавлена поддержка казахского языка. Восстановлена функция Рід украинского языка. Добавлены новые слова русского языка.
19.09.2018 1.1.0.0 Добавлены три функции для выделения имени, отчества и фамилии. Добавлены новые слова. Исправлено ошибочное склонение наречий отдельно, слегка, почти, совершенно и узбекской денежной единицы тийин. Слово "Армавир" теперь по умолчанию склоняется как название города, а не как мужское имя.
19.12.2017 1.0.15.0 Пополнение словаря.
17.01.2017 1.0.14.0 В функции Пропись исправлена ошибка «ноль годов». Добавлены копейки к белорусскому рублю в связи с его деноминацией. Старый (до июня 2016 г.) белорусский рубль имеет обозначение BYR, новый — BYN. Пропись BYR не содержит копеек, а BYN содержит.
25.01.2016 1.0.13.0 В функции Пропись учтены слова-исключения "человек" и "год". Пополнен словарь программы.
17.02.2015 1.0.11.0 Исправлена ошибка в функции Пропись. Ошибка проявлялась для сумм с числом копеек 0x. В результате выдавалось x0 копеек вместо 0x.
07.12.2014 1.0.10.0 Исправлена ошибка в функции Пропись. Ошибка проявлялась только для валюты "белорусский рубль". Сообщение об ошибке: "Русский : Ошибка в Morpher.dll: Исключительная ситуация при вызове функции Spell."
17.10.2014 1.0.9.0 Добавлен 64-битный вариант компоненты. Номер версии не изменился.
26.08.2014 1.0.9.0 Пополнение словаря.
18.12.2013 1.0.8.0 Пополнение словаря.
11.12.2013 1.0.7.0 Небольшое пополнение словаря (русского и украинского).
10.12.2013 1.0.6.0 В украинский алгоритм добавлен учет «апострофов» вида Дерев”яна и Дерев"яна.
11.11.2013 1.0.5.0 При указании более двух цифр после запятой в денежной сумме теперь выдается ошибка.
10.11.2013 1.0.4.0 Добавлена функция прописи чисел и денежных сумм.
26.07.2012 1.0.1.0 Пополнение словарной базы, исправлена функция Рід.
19.09.2011 1.0.0.1 Добавлен украинский язык (номер версии не изменился).
05.07.2011 1.0.0.1 Первая версия
Купить

 

Библиотеки

© Сергей Слепов, 2003 - 2020.