gifts2017

Склонение ФИО и должностей

Опубликовал Осипов Сергей (fixin) в раздел Программирование - Практика программирования

Бесплатное склонение ФИО и должностей на языке 1С

 

Обработка предназначена для склонения ФИО и должностей.

Я решил сделать абсолютно бесплатную и свободную функцию склонения. Есть тестовая база, которая постоянно пополняется, чтобы вы были уверены, что функция работает правильно. Несложно адаптировать для 77.Учитывая, что для склонения нужен или словарь исключений, или ИИ, доступно простое ведение списка исключений.

Подобные проекты есть, но у них есть недостатки:

1.       Используется внешняя компонента, ее требуется зарегистрировать, для этого нужны права администратора (яркий пример – склонение в типовых конфигурациях)

2.       Отсутствует словарь исключений.

3.       Код на языке 1С запутанный и непрозрачный (Падеж «Крохотулька»)

4.       Некоторые разработки платные.

Обработка реализована в виде функции обСклонениеСтроки. В обработке «Тест склонения» можно протестировать мою функцию, обработку namedecl.dllот 1С и крохотульку.

Я использую подход, когда написана не только обработка, но и тесты к ней.

Форма редактирования таблицы исключений

Можно использовать константу (строка неограниченной длины) с именем «КонстантаГения1СДляИсключенийСклонения» для хранения исключений.

Таблицу исключений можно редактировать обработкой: «РедакторТаблицыИсключенийСклонений.epf»

Данные в константе хранятся в виде XML-строки вида:

 

 

1

Иванов

Д

Фамилия

М

RU

Иванидзе

 

 

2

Иванов

Р

Фамилия

М

RU

Иванидзе1

 

 

В событии «При открытии формы» вызывается функция общего модуля «ХукерНастройкаРедактораТаблицыИсключений(П)». Вы можете объявить эту функцию и перенастроить форму, заполнить списки выбора и т.п.

Доступные поля структуры П:

  • СписокПадеж – список падежей
  • СписокПол – список полов
  • СписокЯзык – список языков
  • СписокВид – список видов
  • ЭтаФорма – ссылка на форму
  • ЭтотОбъект – сам объект обработки
  • ТЗИсключения – таблица исключений

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
down.zip
.zip 333,60Kb
06.02.12
281
.zip 333,60Kb 281 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. noprogrammer (noprogrammer) 07.02.12 00:43
А почему склонение не сделать через регистры правил?! чем описание "доступа" http://infostart.ru/public/115906/ отличается от склонения? Зачем плодить сущности в виде исключений?
2. Осипов Сергей (fixin) 07.02.12 08:28
(1) а почему автор "Крохотульки" не использовал регистры правил? Особенности реализации. Так и я - использовал реализацию в виде кода. Если быть точнее, то на момент реализации про регистры правил не знал, поэтому писал в коде. Но код более прозрачный чем Крохотулька. А исключения - для того, чтобы сделать не закрытый алгоритм, а устойчивый к реальной жизни (исключениям).
Помимо этого у меня есть тестирование обработок склонения, что тоже не мало важно...

Если хотите реализовать склонение через регистр правил - бог вам в помощью, я буду только за.
3. Fomix (fomix) 07.02.12 17:05
Прикольное название zip файла для скачивания ))))
4. Vladimir (Boroda) 10.02.12 22:10
Хорошая, нужная, понятная вещица. Спасибо!
5. Осипов Сергей (fixin) 10.02.12 22:19
(4) хорошая была бы, если бы на регистр правил переложить, а сами правила в XML закатать. ;-)
но как бесплатный и полностью контролируемый код тоже неплоха.
6. Ольга (ВРедная) 23.04.12 08:23
Для склонения подразделений не предполагается использовать?
Например, Администрация президента сколняется неправильно. А у Крохотульки правильно :)
7. Осипов Сергей (fixin) 03.05.12 10:53
(6) не предполагается. Но можно занести в исключения. ;-)
8. yuravk (YuraVK) 17.05.12 16:40
украинский не поддерживает?
9. geterosser (Belkin_Sergey) 12.07.12 12:11
А как просклоняется должность "Первый заместитель директора по корпоративным вопросам" или "Главный технический руководитель по охране труда и ТБ"?
10. geterosser (Belkin_Sergey) 12.07.12 12:13
11. Ирли Бёрд (EarlyBird) 15.08.12 08:00
Я офигеваю с этих людей!
Скачало 74 человека, сказали спасибо (в виде плюса) только 17.
По ходу, 57 неблагодарных свиней детектед :)
12. Осипов Сергей (fixin) 21.08.12 19:43
(11) ну может остальным не понравилось. спокойно.
13. sumixam (sumixam) 24.08.12 14:28
спасибо полезнаю вещь да ещё и бесплатно )))
14. itt (itt) 10.09.12 13:53
надо попробывать, а то в БП нет склонения ФИО и подразделений
15. Осипов Сергей (fixin) 10.09.12 14:28
(14) Если бы делал счас, сделал бы через регистр правил, но и так недурно.
16. Карина -- (ponaroshku) 16.10.12 06:15
17. Алексей Горюшин (alsegor) 09.01.13 15:50
Спасибо за обработку. Склонение Гения 1С неправильно склоняет имя Ольга (может и другие).
В проверке используется имя Анна, которое склоняется правильно.
Для Ольги должно быть:
И: Ольга
Р: Ольги
Д: Ольге
В: Ольгу
Т: Ольгой
П: Ольге

А Гений склоняет так:
И: Ольга
Р: Ольгы
Д: Ольге
В: Ольгу
Т: Ольгой
П: Ольге

Усовершенствуйте, пожалуйста, проверку.
18. Ольга (_n26__) 15.01.13 08:47
Спасибо, будем тестировать. Очень нужная вещь!
19. Александр Майнагашев (dedicated) 20.02.13 15:43
Спасибо! Помогло решить задачу вывода в Дательном падеже должности и ФИО в печатной форме "М2" документа Доверенность. Я использую в печатной форме таким образом:
// Перевод Падежей встроенной функцией Гения
	С = обСлужРазбитьНаФИО(ФамилияИмяОтчествоДоверенного);
	Пол = Строка(Шапка.ФизЛицо.Пол);
	Если Пол = "Мужской" Тогда Пол = "М";
	ИначеЕсли Пол = "Женский" Тогда	Пол = "Ж";
	КонецЕсли;
	
	НовоеФамилия = обСклонениеСтроки(С.Фамилия, "Д", "Фамилия",Пол );
    НовоеИмя = обСклонениеСтроки(С.Имя,  "Д", "Имя",Пол);
	НовоеОтчество = обСклонениеСтроки(С.Отчество,  "Д", "Отчество",Пол);

	ФамилияИмяОтчествоДоверенного = НовоеФамилия+?(НовоеИмя="",""," ")+НовоеИмя+?(НовоеОтчество="",""," ")+НовоеОтчество;
	
	ДолжностьДоверенного = обСклонениеСтроки(ДолжностьДоверенного,  "Д", "Должность");
...Показать Скрыть


Если кому то поможет прикрепил файл печ. формы.
Прикрепленные файлы:
Доверенность.epf
20. Александр Лыткин (TrinitronOTV) 11.03.13 10:55
21. Алекс Ю (AlexO) 15.03.13 16:40
Сергей, а что так некорректно отозвались о Крохотульке, "уперев" оттуда 2\3 контента по примерам склонения? :)
22. Осипов Сергей (fixin) 15.03.13 16:56
(21) AlexO, что именно я оттуда упер? дядя?
мне пришлось разбирать алгоритмы склонения самому.
и я взял за основу не крохотульку, а код на каком-то SQL-подобном языке с SQL.RU
Ибо в крахотульке разобраться невозможно, код специалом так написан.
23. muha muhaha (fr.myha) 10.07.13 14:04
Делюсь функцией, возвращающая инициалы в дательном падеже

// функция в зависимости от переданного параметра возвращает ФИО
//
// Параметры:
// ФИО - строка. Если Можно вводить только Фамилию или Фимилия Имя или полное ФИО,
// разделитель пробел.
// Пол - Перечисления.Пол
// ТипВывода - числа 1: полное ФИО
// 2: Фамилия И.О.
// 3: И.О. Фамилия
// Возвращаемое значение:
// строка - результат форматирования
Функция обДательныйПадежНаСервере(ФИО,Пол,ТипВывода=0) Экспорт

ФИО_Падеж="";
Фамилия="";
Имя="";
Отчество="";
ФамилияПадеж="";
ИмяПадеж="";
ОтчествоПадеж="";
ФИО=СокрЛП(ФИО);
Длина=0;

Если СтрЧислоВхождений(ФИО," ") = 0 Тогда
Фамилия = ФИО;
Длина = 1;
ИначеЕсли СтрЧислоВхождений(ФИО," ") = 1 Тогда
Фамилия = Лев(ФИО,Найти(ФИО," ")-1);
Имя = СтрЗаменить(ФИО,Фамилия+" ","");
Длина = 2;
ИначеЕсли СтрЧислоВхождений(ФИО," ") = 2 Тогда
Фамилия = Лев(ФИО,Найти(ФИО," ")-1);
Имя = Лев(СтрЗаменить(ФИО,Фамилия+" ",""),Найти(СтрЗаменить(ФИО,Фамилия+" ","")," ")-1);
Отчество = СтрЗаменить(СтрЗаменить(ФИО,Фамилия+" ",""),Имя+" ","");
Длина = 3;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Неправильно записано ФИО. Проверьте пробелы!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;

Если (Нрег(Прав(Отчество,1))="ч") Тогда
ТекПол = Перечисления.Пол.Муж;
ИначеЕсли (Нрег(Прав(Отчество,1))="а") Тогда
ТекПол = Перечисления.Пол.Жен;
КонецЕсли;

Если ТекПол = Перечисления.Пол.Муж Тогда
КонецФамилии = Прав(Фамилия,1);
Если Нрег(КонецФамилии)="е"
ИЛИ Нрег(КонецФамилии) = "и"
ИЛИ Нрег(КонецФамилии) = "о"
ИЛИ Нрег(КонецФамилии) = "у"
ИЛИ Нрег(КонецФамилии) = "э"
ИЛИ Нрег(КонецФамилии) = "ю"
Тогда
ФамилияПадеж = Фамилия;
ИначеЕсли Нрег(КонецФамилии) = "я" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
ИначеЕсли Нрег(КонецФамилии) = "а" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
ИначеЕсли Нрег(КонецФамилии) = "й"
ИЛИ Нрег(КонецФамилии) = "ь"
Тогда
Если Нрег(Прав(Фамилия,2)) = "ий"
ИЛИ Нрег(Прав(Фамилия,2)) = "ый"
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "ому";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "ю";
КонецЕсли
Иначе
Если Нрег(Прав(Фамилия,2)) = "ец" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "цу";
Иначе
ФамилияПадеж = Фамилия + "у";
КонецЕсли
КонецЕсли;

Если Имя = "Лев" Тогда
ИмяПадеж = "Льву";
ИначеЕсли Имя="Павел" Тогда
ИмяПадеж = "Павлу";
ИначеЕсли Имя = "Пётр" Тогда
ИмяПадеж = "Петру";
ИначеЕсли Нрег(Прав(Имя,1)) = "й"
ИЛИ Нрег(Прав(Имя,1)) = "ь"
Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "ю";
ИначеЕсли Нрег(Прав(Имя,1)) = "и" Тогда
ИмяПадеж = Имя;
ИначеЕсли Нрег(Прав(Имя,1)) = "а" Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "е";
Иначе
ИмяПадеж = Имя + "у";
КонецЕсли;
ОтчествоПадеж = Отчество + "у";
ИначеЕсли ТекПол = Перечисления.Пол.Жен Тогда
КонецФамилии = Прав(Фамилия,1);

Если Нрег(КонецФамилии) = "а" Тогда
Если Нрег(Прав(Фамилия,3)) = "ова"
ИЛИ Нрег(Прав(Фамилия,3))="ева"
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "ой";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
КонецЕсли
ИначеЕсли Нрег(КонецФамилии) = "я" Тогда
Если Нрег(Прав(Фамилия,2)) = "ая" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "ой";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
КонецЕсли
Иначе
ФамилияПадеж = Фамилия;
КонецЕсли;

Если Нрег(Прав(Имя,1)) = "а" Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "е";
ИначеЕсли Нрег(Прав(Имя,1)) = "я" Тогда
Если Нрег(Прав(Имя,2)) = "ия" Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "и";
Иначе
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "е";
КонецЕсли
Иначе
ИмяПадеж = Имя;
КонецЕсли;
ОтчествоПадеж = Лев(Отчество,СтрДлина(Отчество)-1) + "е";
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Неправильно задан Пол. Проверьте!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;

Если Длина = 1 Тогда
ФИО_Падеж = "" + ФамилияПадеж;
ИначеЕсли Длина = 2 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = "" + ИмяПадеж + " " + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = "" + ФамилияПадеж + " " + Лев(ИмяПадеж,1) + ".";
ИначеЕсли ТипВывода = 3 Тогда
ФИО_Падеж = "" + Лев(ИмяПадеж,1) + "." + " " + ФамилияПадеж;
Иначе
ФИО_Падеж = "" + ФамилияПадеж + " " + ИмяПадеж;
КонецЕсли
ИначеЕсли Длина = 3 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = "" + ИмяПадеж + " " + ОтчествоПадеж + " " + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = "" + ФамилияПадеж + " " + Лев(ИмяПадеж,1) + "." + " " + Лев(ОтчествоПадеж,1) + ".";
ИначеЕсли ТипВывода=3 Тогда
ФИО_Падеж = "" + Лев(ИмяПадеж,1) + "." + " " + Лев(ОтчествоПадеж,1) + "." + " " + ФамилияПадеж;
Иначе
ФИО_Падеж = "" + ФамилияПадеж + " " + ИмяПадеж + " " + ОтчествоПадеж;
КонецЕсли
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Это не ФИО. Проверьте!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;
Возврат ФИО_Падеж;
КонецФункции
24. Nadin_.ka (SotNick) 30.01.14 18:30
Спасибо, отличная обработка!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа