Modber Сообщество
профессионалов по 1С

Склонение ФИО (код)



Платформы: 1С:Предприятие 8.3, 1С:Предприятие 8.2, 1С:Предприятие 8.1, 1С:Предприятие 7.7
Конфигурации: Все конфигурации
2014-03-17
3148 
pvlunegov
0  

Склонение ФИО в виде небольшой процедуры. Писалось студентом-программистом и студентом-лингвистом.


_______________________________________________________________________________
Функция ПадежФИО(Знач ФИО,Падеж=1,ТолькоИнициалы=Ложь, Знач пРазделитель=".") 
Если ТипЗнч(ФИО)<>Тип("Строка") Тогда
Сообщить("Неверная строка передана ""падежу ФИО!"""); Возврат ФИО;
КонецЕсли;

// уберем множественные пробелы
Пока 1=1 Цикл
ФИО=СокрЛП(СтрЗаменить(ФИО," "," "));
Если Найти(ФИО," ")=0 Тогда Прервать КонецЕсли;
КонецЦикла;

Если ТипЗнч(Падеж)=Тип("Строка") Тогда
пад=СокрЛП(НРег(Лев(Падеж,1))); 
Если Найти("ирдвтп",пад)=0 Тогда
Сообщить("Неверный падеж передан ""падежу ФИО""!"); Возврат ФИО;
КонецЕсли;
ИначеЕсли ТипЗнч(Падеж)=Тип("Число") Тогда
Если (Падеж<1) или (Падеж>6) Тогда
Сообщить("Неверный падеж передан ""падежу ФИО""!"); Возврат ФИО;
КонецЕсли; 
пад=Падеж-1;
КонецЕсли;

ФИО=СокрЛП(НРег(ФИО)); // так удобнее

// свой анализатор состава
Фамилия="";
Для й=1 По СтрДлина(ФИО) Цикл
символс=Сред(ФИО,й,1);
Если символс=" " Тогда Прервать КонецЕсли;
Фамилия=Фамилия+символс;
КонецЦикла;
ы=й+1; // перешли пробел
Имя="";
Для й=ы По СтрДлина(ФИО) Цикл
символс=Сред(ФИО,й,1);
Если символс=" " Тогда Прервать КонецЕсли;
Имя=Имя+символс;
КонецЦикла;
ы=й+1; // перешли второй пробел
Отчество="";
Для й=ы По СтрДлина(ФИО) Цикл
символс=Сред(ФИО,й,1);
Если символс=" " Тогда Прервать КонецЕсли;
Отчество=Отчество+символс;
КонецЦикла;

// теперь имеем раздельно Фамилию, Имя и Отчество. 
// начинается собственно блок анализа содержания и падежей

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


// проанализируем пол М/Ж
Если Прав(Отчество,1)="а" Тогда Пол="Ж" Иначе Пол="М" КонецЕсли;

// создадим структуру таблицы, хранящей окончания слов
ток=Новый ТаблицаЗначений;
ТипСтроки=Новый ОписаниеТипов("Строка",Новый КвалификаторыСтроки(3));
ТипЧисла=Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(1,0));
ток.Колонки.Добавить("СтарОк",ТипСтроки); // старое окончание 2 символа
// колонки, хранящие новые окончания слов
ток.Колонки.Добавить("р"); // родительный
ток.Колонки.Добавить("д"); // дательный
ток.Колонки.Добавить("в"); // винительный
ток.Колонки.Добавить("т"); // творительный
ток.Колонки.Добавить("п"); // предложный
// для указания, сколько букв с конца слова отсечь,
ток.Колонки.Добавить("КолвоСрез",ТипЧисла); // кол-во срезаемых букв

Гласные="аеэоуиыяюьъ"; // список гласных букв в виде строки

// ======== обработаем фамилию ==========
// заполним таблицу данными для фамилии

Если пол="М" Тогда
строток=ток.Добавить(); // иванов
строток.СтарОк="*s";
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ым"; строток.п="е";
строток.КолвоСрез=0;

строток=ток.Добавить(); // красинский
строток.СтарОк="*й"; 
строток.р="ого"; строток.д="ому"; строток.в="ого"; строток.т="им"; строток.п="ом";
строток.КолвоСрез=2; 

строток=ток.Добавить(); // всемогущий
строток.СтарОк="щий"; 
строток.р="его"; строток.д="ему"; строток.в="его"; строток.т="им"; строток.п="ем";
строток.КолвоСрез=2; 

строток=ток.Добавить(); // белый
строток.СтарОк="ый";
строток.р="ого"; строток.д="ому"; строток.в="ого"; строток.т="ым"; строток.п="ом";
строток.КолвоСрез=2;

строток=ток.Добавить(); // палей
строток.СтарОк="*й";
строток.р="я"; строток.д="ю"; строток.в="я"; строток.т="ем"; строток.п="е";
строток.КолвоСрез=1;

строток=ток.Добавить(); // рабинович
строток.СтарОк="*ч";
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ем"; строток.п="е";
строток.КолвоСрез=0;

строток=ток.Добавить(); // починок, зализняк
строток.СтарОк="*к";
строток.р="ка"; строток.д="ку"; строток.в="ка"; строток.т="ком"; строток.п="ке";
строток.КолвоСрез=2;

строток=ток.Добавить(); // шинкарь
строток.СтарОк="*ь";
строток.р="я"; строток.д="ю"; строток.в="я"; строток.т="ем"; строток.п="е";
строток.КолвоСрез=1;

строток=ток.Добавить(); // перельман, оганесян
строток.СтарОк="*н";
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ом"; строток.п="е";
строток.КолвоСрез=0;

строток=ток.Добавить(); // баранкин
строток.СтарОк="ин";
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ым"; строток.п="е";
строток.КолвоСрез=0;

ИначеЕсли Пол="Ж" Тогда 
строток=ток.Добавить(); // склодовская
строток.СтарОк="ая";
строток.р="ой"; строток.д="ой"; строток.в="ую"; строток.т="ой"; строток.п="ой";
строток.КолвоСрез=2;

строток=ток.Добавить(); // иванова
строток.СтарОк="*а"; 
строток.р="ой"; строток.д="ой"; строток.в="у"; строток.т="ой"; строток.п="ой";
строток.КолвоСрез=1;
КонецЕсли;

// таблица заполнена. считаем 2 последних буквы и поищем их
Если не ПустаяСтрока(Фамилия) Тогда
пб=Прав(Фамилия,3); кол="СтарОк"; // ищем по ней
новФамилия=Фамилия; // если ничего не изменится, так и будет
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли строгое сразу
Основа=Лев(Фамилия,СтрДлина(Фамилия)-стро.КолвоСрез);
новФамилия=Основа+СокрЛП(стро[пад]);
Иначе
// строго не нашли по трем последним символам, ищем по двум символам только по последней
пб=Прав(Фамилия,2);
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда
Основа=Лев(Фамилия,СтрДлина(Фамилия)-стро.КолвоСрез);
новФамилия=Основа+СокрЛП(стро[пад]);
Иначе // если по двум не нашли, ищем по одному
пб="*"+Прав(пб,1); 
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли по последней
Основа=Лев(Фамилия,СтрДлина(Фамилия)-стро.КолвоСрез);
новФамилия=Основа+СокрЛП(стро[пад]);
Иначе // по последней не нашли, ищем по виду буквы
пб="*"+?(Найти(Гласные,Прав(пб,1))=0,"s","g");
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли по виду
Основа=Лев(Фамилия,СтрДлина(Фамилия)-стро.КолвоСрез);
новФамилия=Основа+СокрЛП(стро[пад]);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
новФамилия="";
КонецЕсли;

// ======== обработаем имя ==========
// заполним таблицу данными для имени
ток.Очистить();

Если Пол="М" Тогда
// обработаем исключения
Если Имя="лев" Тогда Имя="льв" КонецЕсли;
Если Имя="павел" Тогда Имя="павл" КонецЕсли;

строток=ток.Добавить(); // сергей
строток.старок="*й";
строток.р="я"; строток.д="ю"; строток.в="я"; строток.т="ем"; строток.п="е";
строток.колвосрез=1;

строток=ток.Добавить(); // иван + лев + павел
строток.старок="*s";
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ом"; строток.п="е";
строток.колвосрез=0;

строток=ток.Добавить(); // никита
строток.старок="*а";
строток.р="ы"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;

строток=ток.Добавить(); // лука
строток.старок="ка";
строток.р="и"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;

строток=ток.Добавить(); // иеремия
строток.старок="ия";
строток.р="и"; строток.д="и"; строток.в="ю"; строток.т="ей"; строток.п="и";
строток.колвосрез=1;

строток=ток.Добавить(); // илья
строток.старок="*я";
строток.р="и"; строток.д="е"; строток.в="ю"; строток.т="ей"; строток.п="е";
строток.колвосрез=1;

строток=ток.Добавить(); // игорь
строток.старок="*ь";
строток.р="я"; строток.д="ю"; строток.в="я"; строток.т="ем"; строток.п="е";
строток.колвосрез=1;

ИначеЕсли Пол="Ж" Тогда
// обработаем исключения
//Если Имя="ольга" Тогда Имя="ольгь" КонецЕсли;

строток=ток.Добавить(); // ирина
строток.старок="*а";
строток.р="ы"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;

строток=ток.Добавить(); // инга, ольга
строток.старок="га";
строток.р="и"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;

строток=ток.Добавить(); // эсфирь
строток.старок="*ь";
строток.р="и"; строток.д="и"; строток.в="ь"; строток.т="ью"; строток.п="и";
строток.колвосрез=1;

строток=ток.Добавить(); // мария
строток.старок="ия";
строток.р="и"; строток.д="и"; строток.в="ю"; строток.т="ей"; строток.п="и";
строток.колвосрез=1;

строток=ток.Добавить(); // софья
строток.старок="*я";
строток.р="и"; строток.д="е"; строток.в="ю"; строток.т="ей"; строток.п="е";
строток.колвосрез=1;
КонецЕсли;

// таблица заполнена. считаем 2 последних буквы и поищем их
Если не ПустаяСтрока(Имя) Тогда
пб=Прав(Имя,2); кол="СтарОк"; // ищем по ней
новИмя=Имя; // если ничего не изменится, так и будет
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли строгое сразу
Основа=Лев(Имя,СтрДлина(Имя)-стро.КолвоСрез);
новИмя=Основа+СокрЛП(стро[пад]);
Иначе // строго не нашли, ищем только по последней
пб="*"+Прав(пб,1); 
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли по последней
Основа=Лев(Имя,СтрДлина(Имя)-стро.КолвоСрез);
новИмя=Основа+СокрЛП(стро[пад]);
Иначе // по последней не нашли, ищем по виду буквы
пб="*"+?(Найти(Гласные,Прав(пб,1))=0,"s","g");
стро=ток.Найти(пб,кол);
Если стро<>Неопределено=1 Тогда // нашли по виду
Основа=Лев(Имя,СтрДлина(Имя)-стро.КолвоСрез);
новИмя=Основа+СокрЛП(стро[пад]);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
новИмя="";
КонецЕсли;

// ======== обработаем отчество, тут проще ==========
ток.Очистить();

Если Пол="М" Тогда
строток=ток.Добавить();
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ем"; строток.п="е";
строток.колвосрез=0;
ИначеЕсли Пол="Ж" Тогда
строток=ток.Добавить();
строток.р="ы"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;
КонецЕсли;
Если не ПустаяСтрока(Отчество) Тогда
Основа=Лев(Отчество,СтрДлина(Отчество)-ток[0].КолвоСрез); 
новОтчество=Основа+СокрЛП(ток[0][пад]);
Иначе
новОтчество="";
КонецЕсли; 

Если ТолькоИнициалы Тогда
новИмя=Лев(новИмя,1); новОтчество=Лев(новОтчество,1);
КонецЕсли;

// установим первые буквы верхним регистром
новФамилия=ВРег(Лев(новФамилия,1))+Сред(новФамилия,2);
новИмя=ВРег(Лев(новИмя,1))+Сред(новИмя,2);
новОтчество=ВРег(Лев(новОтчество,1))+Сред(новОтчество,2);

// и теперь всё вместе 
Если ТолькоИнициалы Тогда // если задан формат инициалов
новФИО=новФамилия+" "+новИмя+пРазделитель+новОтчество+пРазделитель;
Иначе
новФИО=новФамилия+" "+новИмя+" "+новОтчество;
КонецЕсли;

Если Найти(ФИО, ".") Тогда // На тот случай, если входной параметр Фамилию с инициалами. Инициалы не трогаем
новФИО = новФамилия + " " + ТРег(Имя) + Трег(Отчество);
КонецЕсли; 

Возврат СокрЛП(новФИО);
КонецФункции

____________________________________________________________

еще одна функция.

____________________________________________________________

 

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

            Предлагаемая функция позволяет выполнить склонение фамилий имен и отчеств в соответствии с правилами русского языка. Напомню, что мужские фамилии в русском языке склоняются всегда, кроме тех случаев, когда их вообще невозможно просклонять (фамилии типа Тёмных,  Джугашвили, Беранже, Приходько и т.д.). В прочих случаях "экзотическая" мужская фамилия склоняется, а женская — нет. Например: господина Ганжу, но госпожу Ганжа; господина Веббера, но госпожу Веббер и т.д.

            Функция имеет три входных параметра: фамилия_имя_отчество полностью (или фамилия + инициалы), пол (М или Ж) и падеж (Р-родительный или Д-дательный).

            Выход функции: склонение в заданном падеже.

 

P.S. Функция была проверена на около 100 различных сочетаний (правильно склоняет даже такую "экзотику" как Кац Мойша Абрамович), но возможно на каких-то сочетаниях имеются "блохи". В таком случае надо добавить соответствующее условие.

P.S.S. В тексте специально не употреблялись сложные конструкции "Если — Иначе" для удобства добавления новых условий.

 

Функция Склонять(ФИО, Пол, Падеж) экспорт

      ///Упорядочивание алфавита

 

      Перем L[32];

 

      L[1]="Б";

      L[2]="В";

      L[3]="Г";

      L[4]="Д";

      L[5]="Ж";

      L[6]="З";

      L[7]="К";

      L[8]="Л";

      L[9]="М";

      L[10]="Н";

      L[11]="П";

      L[12]="Р";

      L[13]="С";

      L[14]="Т";

      L[15]="Ф";

      L[16]="Х";

      L[17]="Ц";

      L[18]="Ч";

      L[19]="Ш";

      L[20]="Щ";

      //Гласные

      L[21]="А";

      L[22]="Е";

      L[23]="И";

      L[24]="Й";

      L[25]="О";

      L[26]="У";

      L[27]="Ы";

      L[28]="Э";

      L[29]="Ю";

      L[30]="Я";

      L[31]="Ь";

      L[32]="Ъ";

/////////Выделение Фамилия, Имя, Отчество

    Пол=СокрЛП(Строка(Пол));

    Пол=Врег(Пол);

    Если (Пол<>"М") И (Пол<>"Ж") Тогда

       Предупреждение ("Неверно задан пол: М или Ж");

       Возврат " ";

    КонецЕсли;

    Падеж=СокрЛП(Строка(Падеж));

    Падеж=Врег(Падеж);

    Если (Падеж<>"Р") И (Падеж<>"Д") Тогда

       Предупреждение ("Неверно задан падеж: Р или Д");

       Возврат " ";

    КонецЕсли;

    ПолноеИмя=Строка(ФИО);

    ПолноеИмя=СокрЛП(ПолноеИмя);

    ПозицияПервогоПробела = Найти(ПолноеИмя, " ");

      Фамилия = Лев(ПолноеИмя, ПозицияПервогоПробела);

      Фамилия=СокрЛП(Фамилия);

      ИмяОтчество = Сред(ПолноеИмя, ПозицияПервогоПробела+1);

      ИмяОтчество = СокрЛП(ИмяОтчество);

      ПозицияТочки=Найти(ИмяОтчество,".");

      Если ПозицияТочки>0 Тогда //если введены инициалы

          Имя=Сред(ИмяОтчество,1,ПозицияТочки);

          Отчество=Сред(ИмяОтчество,ПозицияТочки+1);

          Отчество=СокрЛ(Отчество);

      Иначе;

          ПозицияВторогоПробела = Найти(ИмяОтчество, " ");

          Имя = Сред(ИмяОтчество,1, ПозицияВторогоПробела-1);

          Имя=СокрЛП(Имя);

          Отчество = Сред(ИмяОтчество, ПозицияВторогоПробела+1);

          Отчество = СокрЛП(Отчество);

       КонецЕсли;

      //////////Склонение фамилии

 

      Фам1=ВРЕГ(Фамилия);

 

      Последняя=Прав(Фам1,1);

      ДвеПоследних=Прав(Фам1,2);

      ТриПоследних=Прав(Фам1,3);

 

      Флаг=0;

      Для i=1 По 32 Цикл

            Если L[i]=Последняя Тогда

                  Прервать;

            КонецЕсли;

      КонецЦикла;

      Если i<=20 Тогда

            ТипБуквы=1;//согласная

      ИНАЧЕ;

            ТипБуквы=2;//гласная

      КонецЕсли;

//////////////// Исключения ////////////////////

      Если СтрДлина(Фамилия)<=2 Тогда

            Родительный=Фамилия;//фамилии типа Ге, Че

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

 

      Если (ДвеПоследних="ИХ") ИЛИ  (ДвеПоследних="ЫХ") Тогда

            Родительный=Фамилия;//сибирские фамилии

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

      Если Последняя="О" Тогда

            Родительный=Фамилия;//украинские фамилии

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

 

      Если ДвеПоследних="УА" Тогда

            Родительный=Фамилия;//фамилии типа Стуруа

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

 

      Если ДвеПоследних="ИА" Тогда

            Родительный=Фамилия;//фамилии типа Туташхиа

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

 

      Если (ДвеПоследних="ЖА") И (Пол="Ж") Тогда

            Родительный=Фамилия;// женские фамилии типа Ганжа

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

 

      Если ТриПоследних="ДЗЕ" Тогда

            Родительный=Фамилия;//грузинские фамилии типа Гогадзе

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

 

      Если ТриПоследних="ИЛИ" Тогда

            Родительный=Фамилия;//грузинские фамилии типа Габошвили

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

 

      Если (ДвеПоследних="ОЙ") И (Пол="М") И (СтрДлина(Фамилия)=3) Тогда

            Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"я";//фам. типа Цой

            Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"ю";

            Перейти ~выход;

      КонецЕсли;

 

      Если (ДвеПоследних="ОЙ") И (Пол="Ж") И (СтрДлина(Фамилия)=3) Тогда

            Родительный=Фамилия; //фам. типа Цой

            Дательный=Фамилия;

            Перейти ~выход;

      КонецЕсли;

///////////////////////////////////////////////////////////////////////

      Если (Пол="М") И (ТипБуквы=1) Тогда //мужскую склоняем

            Родительный=Фамилия+"а";

            Дательный=Фамилия+"у";

            Флаг=1;

      КонецЕсли;

 

      Если (Пол="М") И (ДвеПоследних="ДЬ") Тогда //специально для губернатора

            Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"я";//Лебедя

            Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"ю";

            Флаг=1;

      КонецЕсли;

 

      Если (Пол="Ж") И (ТипБуквы=1) Тогда //женскую не склоняем

            Родительный=Фамилия;

            Дательный=Фамилия;

            Флаг=1;

      КонецЕсли;

 

 

 

      Если (Пол="Ж") И (Последняя="А") Тогда

      Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"у";

          Дательный=  Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"ой";

            Флаг=1;

      КонецЕсли;

 

      Если (Пол="М") И (Последняя="А") Тогда //фам. типа Соткилава

      Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"у";

          Дательный=  Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"е";

            Флаг=1;

      КонецЕсли;

      Если (ДвеПоследних="ОЙ") И (Пол="М") И (СтрДлина(Фамилия)>3) Тогда

            Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"го";

            Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-1)+"му";

            Флаг=1;

      КонецЕсли;

 

      Если (ДвеПоследних="АЯ") И (Пол="Ж") И (СтрДлина(Фамилия)>3) Тогда

            Родительный=Сред(Фамилия,1,СтрДлина(Фамилия)-2)+"ую";

            Дательный=Сред(Фамилия,1,СтрДлина(Фамилия)-2)+"ой";

            Флаг=1;

      КонецЕсли;

      Если Флаг=0 Тогда  //если не сработало ни одно условие

            Родительный=Фамилия;

            Дательный=Фамилия;

      КонецЕсли;

 

~выход: //////////////склонение имени////////

      Если ПозицияТочки>0 Тогда

        РодительныйИмя=Имя;

        ДательныйИмя=Имя;

        РодительныйОтчество=Отчество;

        ДательныйОтчество=Отчество;

        Перейти ~выход1;

      КонецЕсли;

      Имя1=ВРЕГ(Имя);

      Последняя=Прав(Имя1,1);

    ДвеПоследних=Прав(Имя1,2);

      ТриПоследних=Прав(Имя1,3);

    Флаг=0;

 

      Для i=1 По 32 Цикл

            Если L[i]=Последняя Тогда

                  Прервать;

            КонецЕсли;

      КонецЦикла;

      Если i<=20 Тогда

            ТипБуквы=1;//согласная

      ИНАЧЕ;

            ТипБуквы=2;//гласная

      КонецЕсли;

    Если (Пол="М") И (ТипБуквы=1) Тогда ///Иван, Петр и т.д.

            РодительныйИмя=Имя+"а";

        ДательныйИмя  =Имя+"у";

            Флаг=1;

      КонецЕсли;

      Если (Пол="М") И (Последняя="Й") Тогда ///Сергей, Дмитрий и т.д.

            РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"я";

        ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"ю";

            Флаг=1;

      КонецЕсли;

    Если (Пол="М") И (Последняя="А") Тогда ///Фома

            РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"у";

        ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"е";

          Флаг=1;

      КонецЕсли;

     

 

      Если (Пол="М") И (Последняя="Я") Тогда ///Илья

         РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"ю";

         ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"е";

         Флаг=1;

      КонецЕсли;

      Если (Пол="М") И (Последняя="Ь") Тогда ///Игорь

          РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"я";

          ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"ю";

          Флаг=1;

      КонецЕсли;

      Если (Пол="Ж") И (Последняя="А") Тогда ///Татьяна, Людмила и т.д.

          РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"у";

          ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"е";

      КонецЕсли;

      Если (Пол="Ж") И (Последняя="Я") Тогда ///Зоя, Наталья и т.д.

          РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"ю";

          ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"е";

          Флаг=1;

      КонецЕсли;

      Если (Пол="Ж") И (ДвеПоследних="ИЯ") Тогда ///Наталия,Виктория и т.д.

          РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"ю";

          ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"и";

          Флаг=1;

      КонецЕсли;

      Если Флаг=0 Тогда

          РодительныйИмя=Имя;

          ДательныйИмя  =Имя;

      КонецЕсли;

 

/////////склонение отчества///////

    Если (Пол="М") Тогда

        РодительныйОтчество=Отчество+"а";

        ДательныйОтчество  =Отчество+"у";

      КонецЕсли;

      Если (Пол="Ж") Тогда

        РодительныйОтчество=Сред(Отчество,1,СтрДлина(Отчество)-1)+"у";

        ДательныйОтчество  =Сред(Отчество,1,СтрДлина(Отчество)-1)+"е";

      КонецЕсли;

 ~выход1: /////////////////////

    Если Падеж="Д" Тогда

      ФИОВозврат=Дательный+" "+ДательныйИмя+" "+ДательныйОтчество;

    Иначе;

      ФИОВозврат=Родительный+" "+РодительныйИмя+" "+РодительныйОтчество;

    КонецЕсли;

    Возврат ФИОВозврат;

КонецФункции



Как установить отработку или отчет 1С


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


Бесплатная юридическая
консультация по телефону

8 (499) 350-80-26(Москва)
8 (812) 627-15-62(Спб)

звонок бесплатный

В центре внимания

Комментарии (4)