Имя: Пароль:
1C
1С v8
daСклонение - склонение ФИО, должностей, числительных
0 daMaster
 
16.02.15
14:12
1. NameDecl.dll (типовая 1С) 0% (0)
2. Padeg.dll (Плахов, Покаташкин) 0% (0)
3. Крохотулька (SuperJur) 0% (0)
4. Morpher (Слепов) 0% (0)
5. другой метод 0% (0)
Всего мнений: 0

Как известно, новый велосипед лучше старых двух, поэтому предлагаю вашему вниманию очередную функцию склонения для 1С!
Фишки:
- склонение ФИО
- склонение должностей
- склонение числительных
- склонение прилагательных, существительных и их сочетаний
- склонение глаголов по родам и числам
- определение рода
- форматная строка для вывода результата
- открытый код 1С, без внешних компонент и .dll
- весь код в одной функции
- правила склонения не в коде, а в наглядных таблицах, возможность самостоятельно исправлять и дополнять правила
- точность работы гораздо выше, чем у функции "Крохотулька", типовой 1С "NameDecl.dll" и пр.
Буду признателен за найденные ошибки и за ценные советы по развитию функции!

Листинг функции:
https://yadi.sk/i/iHYzKStEehka6
--------------------
Опрос: какими функциями склонений вы пользуетесь?
1 daMaster
 
16.02.15
14:12

//(c) daMaster 2015
//mailto: damasterprog@yandex.ru
//
//СИНТАКСИС
//        daСклонение(_Выражение, _Падеж, _Род, _Режим, _ФорматнаяСтрока);
//            _Выражение      - склоняемое выражение
//            _Падеж          - падеж склонения, буква или цифра: "И" = 1, "Р" = 2, "В" = 3, "Д" = 4, "Т" = 5, "П" = 6
//            _Род          - род склоняемого выражения, буква или цифра: "М" = 1, "Ж" = 2, "С" = 3, "Н" = 4
//            _Режим         - режим работы функции, определяется типом склоняемого выражения
//            _ФорматнаяСтрока - определяет формат и регистр выводимого результата
//
//СКЛОНЕНИЕ ФИО
//запуск выполняется в режиме "ФИО" или с пустым режимом, в таком случае - режим "ФИО" установится по умолчанию:
//        daСклонение("Пухов Федор Николаевич", "Р", "М", "ФИО")    = "Пухова Федора Николаевича"
//        daСклонение("Пухова Ольга Сергеевна", "Д")                 = "Пуховой Ольге Сергеевне"
//порядок символов "Ф", "И", "О" в параметре режима определяет порядок частей ФИО в склоняемом выражении, т.к. фамилия, имя и отчество склоняются по разным правилам
//        daСклонение("Мария Ивановна Кожедуб", "Т", , "ИОФ")     = "Марией Ивановной Кожедуб"
//        daСклонение("В. Тёркин", "П", , "ИФ")                     = "В. Тёркине"
//        daСклонение("Тихончук", "Р", "Ж", "Ф")                     = "Тихончук"
//форматная строка может содержать ключевые слова "Фамилия", "Имя", "Отчество" или сокращения "Ф", "И", "О", их регистр определяет регистр выводимого результата
//        daСклонение("Чапаев Василий Иванович", "Р", , , "Имя Отчество Фамилия")     = "Василия Ивановича Чапаева"
//        daСклонение("Чапаев Василий Иванович", "Д", , , "Фамилия И. О.")             = "Чапаеву В. И."
//        daСклонение("Чапаев Василий Иванович", "И", , , "отчество: Имя - ФАМИЛИЯ")     = "иванович: Василий - ЧАПАЕВ"
//
//ОПРЕДЕЛЕНИЕ РОДА
//если с параметром _Род передать переменную со значением "?", в нее вернется род в случае успеха или останется "?" в случае неудачи
//        ПоискРода = "?"; Результат = daСклонение("Лукашенко Александр Григорьевич", "Р", ПоискРода); Сообщить(ПоискРода); //"М"
//        ПоискРода = "?"; Результат = daСклонение("Лукашенко А. Г.", "Р", ПоискРода); Сообщить(ПоискРода); //"?"
//
//СКЛОНЕНИЕ ПРОФЕССИЙ
//запуск выполняется в режиме "Д":
//        daСклонение("Ведущий программист 1С и консультант по ЗиК", "Р", , "Д") = "Ведущего программиста 1С и консультанта по ЗиК"
//в этом и остальных режимах форматная строка определяет регистр слов результата и задается при помощи литер, если литера не задана - остается исходный регистр,
//А - первая буква первого слова, Б - первая буква остальных слов, В - все остальные буквы всех слов, Г - специально для аббревиатур:
//        daСклонение("Ведущий программист 1С и Консультант по ЗиК", "Р", , "Д", "АБВГ")     = "ВЕДУЩЕГО ПРОГРАММИСТА 1С И КОНСУЛЬТАНТА ПО ЗИК"
//        daСклонение("Ведущий программист 1С и Консультант по ЗиК", "Р", , "Д", "абвг")     = "ведущего программиста 1с и консультанта по зик"
//        daСклонение("Ведущий программист 1С и Консультант по ЗиК", "Р", , "Д", "АБ")     = "Ведущего Программиста 1С и Консультанта По ЗиК"
//        daСклонение("Ведущий программист 1С и Консультант по ЗиК", "Р", , "Д", "Абв")     = "Ведущего программиста 1С и консультанта по ЗиК"
//
//СКЛОНЕНИЕ СУЩЕСТВИТЕЛЬНЫХ, ПРИЛАГАТЕЛЬНЫХ, ГЛАГОЛОВ, ГЕОГРАФИЧЕСКИХ НАИМЕНОВАНИЙ
//запуск выполняется в режиме "Ч":
//        daСклонение("Генеральная доверенность", "Р", , "В")            = "Генеральной доверенности"
//        daСклонение("Санкт-Петербург", "П", , "В")                    = "Санкт-Петербурге"
//в этом режиме возможно склонение в форме множественного числа, для этого в параметре _Род указывается "Н" (мНожественный):
//        daСклонение("Устав", "И", "Н", "В")                            = "Уставы"
//        daСклонение("Генеральная доверенность", "Р", "Н", "В")        = "Генеральных доверенностей"
//возможно склонение глаголов по родам и по числам, исходный глагол может быть в форме любого рода и числа, но в настоящем времени:
//        daСклонение("Подготовили", "И", "Ж", "В")                    = "Подготовила"
//        daСклонение("Утвердило ответственное лицо", "И", "Н", "В")    = "Утвердили ответственные лица"
//
//СКЛОНЕНИЕ ЧИСЕЛ, ВАЛЮТ, ЕДИНИЦ ИЗМЕРЕНИЯ
//запуск выполняется в режиме "Ч", возможно склонение по родам:
//        daСклонение("Двадцать один", "И", "С", "Ч")                = "Двадцать одно"
//        daСклонение("Двадцать один", "Р", "Ж", "Ч")                = "Двадцати одной"
//параметр _Выражение может иметь тип "Число":
//        daСклонение(21, "И", "С", "Ч")                            = "Двадцать одно"
//        daСклонение(21, "Р", "Ж", "Ч")                            = "Двадцати одной"
//возможно склонение сочетания числа и исчислимого (валюты, единицы измерения, прочих существительных)
//        daСклонение("32 доска", "Р", , "Ч")                        = "Тридцати двух досок"
//исчислимое должно быть в начальной форме (именительный падеж, единственное число):
//        daСклонение("23 австралийский доллар", "Р", , "Ч")        = "Двадцати трех австралийских долларов"
//исключение для популярных валют, они могут быть в формате встроенной функции ЧислоПрописью()- "5 рублей", "13 долларов"):
//        daСклонение("14 рублей 88 копеек", "Р", , "Ч", "абв")    = "четырнадцати рублей восьмидесяти восьми копеек"
//если перед словом поставить символ "\", данное слово не будет изменено:
//        daСклонение("51 рубль \81 копейка", "Р", , "Ч")            = "Пятидесяти одного рубля 81 копейки"
//если перед числом поставить символ "^", данное слово будет склоняться без преобразования в пропись:
//        daСклонение("^25 страница", "П", , "Ч")                    = "25-ти страницах"
//для получения формы винительного падежа одушевленных существительных, используется специальный падеж "О" (винительный Одушевленный):
//        daСклонение("41 мешок", "В", , "Ч")                        = "Сорок один мешок"
//        daСклонение("41 маляр", "О", , "Ч")                        = "Сорок одного маляра"
//
Функция daСклонение(_Выражение, _Падеж = "И", _Род = "", _Режим = "ФИО", _ФорматнаяСтрока = "")
    
    _Версия = "13.02.2015";
    
    //ТАБЛИЦЫ ПРАВИЛ СКЛОНЕНИЯ
    //в колонке "Окончания" указывается перечень окончаний, для которых действует данное правило, разделитель "/", в конце также ставится разделитель
    //алгоритм ищет строки с окончаниями последовательно, при совпадении останавливается, поэтому более узкое правило ("РВИН") должно следовать выше, чем широкое ("ИН")
    //если окончание не найдено в таблице правил - такое слово не склоняется
    //колонка "Обрезка" определяет, сколько символов с конца слова обрезать, перед добавлением окончания из колонки падежа ("Р", "Д", "В", "Т", "П")
    _ПравилаФ = //Фамилия
    //Род;    Окончания;                                            Обрезка;    Р;        Д;        В;        

Т;        П;        Комментарий  
    //символ "*" перед окончанием означает, что данное окончание сравнивается не с концом слова, а с целым словом ("*ГРИН" сработает только на Грин, а "ГРИН" - и на "Грин",

и на "Багрин")
    "М-;    *ГРИН/*ЧАПЛИН/РВИН/*БИН/;                            0;            а;        у;        а;        ом;        

е;        Грин, Дарвин, Чаплин - исключения, чтобы пройти тест gramota.ru )
    //в колонке "Род" указывается один литерал рода ("М", "Ж", "С"), если окончание позволяет однозначно определить род ("Петров" - "М", "Ильина" - "Ж")
    |Ж;        ЕВА/ЁВА/ИНА/ОВА/ЫНА/;                                1;            ой;        ой;        у;        

ой;        ой;
    |М;        ЕВ/ЁВ/ИН/ОВ/ЫН/;                                    0;            а;        у;        а;        

ым;        е;
    |М;        ЧИЙ/ШИЙ/ЩИЙ/;                                        2;            его;    ему;    его;    им;        

ем;        Осадчий, Старший, Вещий
    |Ж;        ЧАЯ/ШАЯ/ЩАЯ/;                                        2;            ей;        ей;        ую;        

ей;        ей;     Осадчая, Старшая, Вещая
    |Ж;        АЯ/;                                                2;            ой;        ой;        

ую;        ой;        ой;     Крутая
    |Ж;        ЯЯ/;                                                2;            ей;        ей;        

юю;        ей;        ей;     Верхняя
    //"М-" в колонке "Род" означает, что по окончанию род не определить, но правило действует  только для рода "М" ("Воробей" склоняется только для "М", для "Ж" - не

склоняется)
    |М-;    *ВОРОБЕЙ/*СОЛОВЕЙ/;                                    2;            ья;        ью;        ья;        

ьем;    ье;        Воробей, Соловей
    |М-;    *ЛЕВ/;                                                2;            ьва;    ьву;    ьва;    ьвом;    ьве;    

Лев
    |М-;    *КИЙ/*БОКИЙ/;                                        1;            я;        ю;        я;        

ем;        е;        Кий
    |М-;    ЦОЙ/ВИЙ/СОЙ/ЕЙ/АЙ/УЙ/;                                1;            я;        ю;        я;        ем;        

е;        Цой, Гелетей, Лузай
    |М;        ХОЙ/ШОЙ/;                                            2;            ого;    ому;    ого;    им;        

ом;     Плохой, Большой
    |М;        ЧОЙ/ЩОЙ/;                                            2;            его;    ему;    его;    им;        

ом;    
    |М;        ОЙ/ЫЙ/;                                                2;            ого;    ому;    ого;    ым;        

ом;     Крутой, Мудрый
    |М;        ГИЙ/КИЙ/;                                            2;            ого;    ому;    ого;    им;        

ом;
    |М-;    ИЙ/;                                                1;            я;        ю;        я;        

ем;        и;        Шарий
    |М-;    КАШ/;                                                0;            а;        у;        а;        

ом;        е;      Лукаш
    |М-;    ЬМИЧ/;                                                0;            а;        у;        а;        

ом;        е;      Кузьмич
    |М-;    ИЧ/Ш/;                                                0;            а;        у;        а;        

ем;        е;      Митрич, Гаспажиньш, Милош, Хараш, Черныш
    |М-;    АК/АН/ЕР/ИР/ЙН/НГ/ОН/ОР/УК/ЯК/ЯН/БИХ/РИХ/;            0;            а;        у;        а;      ом;     е;                  
    //колонка "Род" пустая, если по окончанию род не определить, но правило склонения одинаковое для "М" и "Ж ("Живаго", "Лисица")
    |;        АГО/ИА/НКО/ОВО/ОТО/ЦКО/ЫХ/ЮДО/ОЛЯ/ЬДА/ИХ/ЫХ/УА/;    0;            ;        ;        ;          ;         ;                  
    //символ "+" перед окончанием означает, что данное правило действует, для не последней части составного слова (в "Абдул-Шах" часть "Абдул" не склоняется, а если "Абдул"

- отдельное слово, то склоняется)
    |;        +ВАН/+АБДУЛ/+БЕЛИЦ/+ГАСАН/+ДЮССАР/+ДЮМОН/+КНИППЕР/+КОРВИН/  0;    ;        ;        ;          ;         ;        
    |;        +КАРА/+САЕД/+БОНЧ/+ШОЛОМ/+ПРИЗВАН/+МЕЛИК/*ТЕР/*ВАР/*ФОН/;    0;    ;        ;        ;          ;         ;        
    |;        *ДЮМА/*ТОМА/*ДЕГА/*ЛЮКА/*ФЕРМА/*ГАМАРРА/;           0;            ;        ;        ;          ;         ;        
    |;        *ПЕТИПА/*ШАНДРА/*СКАЛЯ/*КАРУАНА/;                    0;            ;        ;        ;          ;         ;        
    |М-;    ИЯ/;                                                1;            и;        и;        ю;        

ей;        и;      Берия            
    |М-;    ОЯ/;                                                1;            и;        е;        ю;        

ей;        е;        
    |;        НЖА/;                                                1;            и;        е;        

у;        ей;        е;        Стринжа
    |;        ЖА/;                                                1;            и;        е;        

у;        ой;        е;        Ганжа
    |;        ГА/КА/УЛЕША/ВАША/ХА/;                                1;            и;        е;        у;        

ой;        е;        Кулеша/Кулешой
    |;        Я/;                                                    1;            и;        е;        

ю;        ей;        е;        Разиня
    |;        ЙА/ЧА/ША/ЩА/;                                        1;            и;        е;        у;        

ей;        е;        Олеша/Олешей, Мойа
    |;        ЦА/;                                                1;            ы;        е;        

у;        ей;        е;        Лисица
    |;        А/;                                                    1;            ы;        е;        

у;        ой;        е;                  
    |М-;    ЕНЬ/;                                                3;            ня;        ню;        ня;        

нем;    не;        Камень
    |М-;    Ь/;                                                    1;            я;        ю;        

я;        ем;        е;        Даль
    |М-;    ЁК/;                                                2;            ька;    ьку;    ька;    ьком;    ьке;    

Королёк
    |М-;    БЛОК/;                                                0;            а;        у;        а;        

ом;        е;      Блок
    |М-;    ОК/;                                                2;            ка;        ку;        ка;        

ком;    ке;        Миненок, Кисляченок
    |М-;    ИЕЦ/;                                                2;            йца;    йцу;    йца;    йцем;    йце;    

Коломиец
    |М-;    ПАЛЕЦ/;                                                2;            ьца;    ьцу;    ьца;    ьцем;    ьце;    

Долгопалец
    |М-;    ЛЕЦ/;                                                2;            ьца;    ьцу;    ьца;    ьцом;    ьце;    

Стрелец
    |М-;    ЧЕЦ/;                                                0;            а;        у;        а;        

ом;        е;        Чайчец
    |М-;    АВЕЦ/ЖЕЦ/;                                            2;            ца;        цу;        ца;        

цем;    це;        Переяславец, Запорожец
    |М-;    ОВЕЦ/БЕЦ/АМЕЦ/НЕЦ/ТЕЦ/;                                2;            ца;        цу;        ца;        цом;    

це;        Горовец
    |М-;    ШВЕЦ/;                                                0;            а;        у;        а;        

ом;        е;        Швец
    |М-;    Ц/;                                                    0;            а;        у;        

а;        ем;        е;        Кац, Бэц
    |М-;    ЁЛ/;                                                2;            ла;        лу;        ла;        

лом;    ле;        Козёл
    |М-;    ДЖ/ИЖ/ОЖ/РЖ/ЙЧ/;                                    0;            а;        у;        а;        

ем;        е;        Джордж, Лейч
    |М-;    Б/В/Г/Д/Ж/З/К/Л/М/Н/П/Р/С/Т/Ф/Х/Ч/Ш/Щ/;                0;            а;        у;        а;        ом;        е;        

Заканчивается на согласную";
    
    _ПравилаИ = //Имя
    //Род;    Окончания;                                            Обрезка;    Р;        Д;        В;        

Т;        П;        Комментарий  
    "Ж;        *ИЯ/;                                                1;            и;        е;        

ю;        ей;        е;        Ия
    |Ж;        ИЯ/;                                                1;            и;        и;        

ю;        ей;        и;        Мария
    |;        ГА/КА/ХА/;                                            1;            и;        е;        

у;        ой;        е;        Ольга, Серега, Лука, Лика, Хоха
    |;        ЖА/ЙА/ЧА/ША/ЩА/;                                    1;            и;        е;        у;        

ей;        е;        Миша, Маша
    |;        ЦА/;                                                1;            ы;        е;        

у;        ей;        е;      Маца
    |Ж;        НА/ВЕРА/;                                            1;            ы;        е;        

у;        ой;        е;      Инна, Нина, Ирина, Вера
    |Ж;        А/;                                                    1;            ы;        е;        

у;        ой;        е;      Тома (женские на -а чаще)
    |М;        *ШОТА/;                                                0;            ;        ;        

;        ;        ;        Шота
    |М;        А/ЛО/;                                                1;            ы;        е;        

у;        ой;        е;      Дима, Гаврило
    |М;        *ИЛЬЯ/*ИЛИЯ/;                                        1;            и;        е;        ю;        

ей;        е;        Илья
    |Ж-;    Я/;                                                    1;            и;        е;        

ю;        ей;        е;        Дуня
    |М-;    Я/;                                                    1;            и;        е;        

ю;        ей;        е;        Гия
    |М;        РЬ/;                                                1;            я;        ю;        

я;        ем;        е;        Игорь
    |Ж;        *ЛЮБОВЬ/*АГАРЬ/*РАХИЛЬ/*РУФЬ/*СУЛАМИФЬ/*ЭСФИРЬ/;    1;            и;        и;        ь;        ью;        и;        

Любовь
    |Ж;        *ЮДИФЬ/*РАШЕЛЬ/*НИНЕЛЬ/*ИЗАБЕЛЬ/*ИСАБЕЛЬ/;            1;            и;        и;        ь;        ью;        

и;        Любовь
    |М-;    Ь/;                                                    1;            я;        ю;        

я;        ем;        е;        Олесь
    |М;        *ПАВЕЛ/;                                            2;            ла;        лу;        

ла;      &nbs
2 daMaster
 
16.02.15
14:14
форум код обрезал по живому месту(( берите по ссылке выше на Яндекс.Диск
3 mikecool
 
16.02.15
14:16
за поделку - молодец
а так - хвастаться пришел?
4 daMaster
 
16.02.15
14:40
(3) хвастаться - да, но мне важнее обратная связь, может, пожелания какие-то или ошибки обнаружатся
5 DuAV
 
10.03.15
11:09
Отличная штука. Еще бы добавить в склонения множественное/единственно число. Пример: "1 (одного) банковского дня, следующЕГО", "3 (трех) банковских дней, следующИХ".
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший