Имя: Пароль:
1C
 
ЗиК. Склонение.
0 lena
 
19.01.05
05:52
ЗиК 2.3 (246)
При печати кадровых документов (приказов) не происходит склонения ФИО. Как быть в этом случае, если это необходимо?
1 Морозов Александр
 
19.01.05
06:06
В клубе профессиналов есть
2 lena
 
19.01.05
06:08
Что есть?
3 Морозов Александр
 
19.01.05
06:09
Что лень зайти и в поиске написать "склонение"?
4 lena
 
19.01.05
06:22
Спасибо.Еще бы я могла разработку скачать, было бы замечательно.
5 Морозов Александр
 
19.01.05
06:26
Какую?
6 Морозов Александр
 
19.01.05
06:30
В документах предприятия часто употребляются фамилия, имя, отчество в родительном и дательном падежах. Например: выдать (кому?), назначить (кого?) и т.д. В типовой конфигурации не предусмотрена функция склонения ФИО.
   Предлагаемая функция позволяет выполнить склонение фамилий имен и отчеств в соответствии с правилами русского языка. Напомню, что мужские фамилии в русском языке склоняются всегда, кроме тех случаев, когда их вообще невозможно просклонять (фамилии типа Тёмных,  Джугашвили, Беранже, Приходько и т.д.). В прочих случаях "экзотическая" мужская фамилия склоняется, а женская - нет. Например: господина Ганжу, но госпожу Ганжа; господина Веббера, но госпожу Веббер и т.д.
   Функция имеет три входных параметра: фамилия_имя_отчество полностью (или фамилия + инициалы), пол (М или Ж) и падеж (Р-родительный или Д-дательный).
   Выход функции: склонение в заданном падеже.

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: /////////////////////
   Если Падеж="Д" Тогда
     ФИОВозврат=Дательный+" "+ДательныйИмя+" "+ДательныйОтчество;
   Иначе;
     ФИОВозврат=Родительный+" "+РодительныйИмя+" "+РодительныйОтчество;
   КонецЕсли;
   Возврат ФИОВозврат;
КонецФункции
7 lena
 
19.01.05
06:30
Сервис поддержки склонений ФИО (Склонение ФИО для V7).
8 lena
 
19.01.05
06:42
Т.е. эту функцию вставляь в документы?
9 Морозов Александр
 
19.01.05
06:44
(8)В глобальный модуль, и вызывать из документов.
10 lena
 
19.01.05
06:53
А если будут делать обновление, то опять нужно будет ее вставлять в ГМ?
А вызывать так: Склонять(Сотрудник.Наименование,,"Д")??
11 Морозов Александр
 
19.01.05
07:06
(10)
1.ДА

2.Вызывать
ФИО=Склонять(Сотрудник.Наименование,Лев(Сотрудник.Пол.Наименование,1),"Д")
12 lena
 
19.01.05
07:17
(11)Большое спасибо.
А вы эту функцию сами писали?
13 Storm
 
19.01.05
08:59
Ну можно и в обработку вставить, если глобальник правит не охота, это ж ФУНКЦИЯ.
Кстати очень хорошая и полезная вещь. Только сразу предупреждаю: придется много правил добавлять (здесь это просто, но надо учитывать).
14 lena
 
19.01.05
09:11
(13)Какие правила надо добавлять?
15 Storm
 
19.01.05
09:22
Как это какие? Смотрите какие фамилии склоняются и что из этого получается. Вроде фамилия Молодец неправильно склонялась, еще что то было. Только длительная эксплуатация все выявит, разнообразных фамилий очень много, благо что когда найдено - подправить дело трех минут.
16 lena
 
19.01.05
10:19
Ага. У меня имя Полина в дательном не склоняется.
17 lena
 
19.01.05
12:25
Хотя вот условие, если пол женский и имя заканчивается на А:

Если (Пол="Ж") И (Последняя="А") Тогда ///Татьяна, Людмила и т.д.
      РодительныйИмя=Сред(Имя,1,СтрДлина(Имя)-1)+"у";
        ДательныйИмя  =Сред(Имя,1,СтрДлина(Имя)-1)+"е";
КонецЕсли;

Почему тогда Полина не меняет на Полине
18 lena
 
20.01.05
04:52
Ответьте, плиз.
19 Морозов Александр
 
20.01.05
05:03
Испрользуй отладчик
20 lena
 
20.01.05
05:04
Я не умею.
21 Морозов Александр
 
20.01.05
05:08
Куда записала функцию? В глобальный модуль или документ?
22 lena
 
20.01.05
05:11
В глобальный.
23 Морозов Александр
 
20.01.05
05:26
1.Открываеш в конфигураторе глобальный модуль и находиш свою функцию.
2. внизу экрана есть иконка с красной стрелочкой (открыть модуль в отладчике)
3. После открытия модуля в отладчике с левой стороны есть желтая полоса,
напротив строчки Пол=СокрЛП(Строка(Пол)); кликаем по ней два раза мышкой. должна появиться точка останова (ввиде шлакбаума).
4. Запускаем 1С предприятие и выполняем функцию.
5. Как только программа дойдет до точки останова активизируется отладчик и появится "жучек" напротив точки останова.
6. Далее нажимаем F8 и смотрим куда идет жучек - тоесть как работает функция.
7. если надо Глануть какую-нибудь переменную (например "РодительныйИмя") то
выделяем переменную черным цветом и нажимаем вверху экрана иконку с линзой "Вычислить выражение". Далее есль нажмеш кнопку поместить в табло. то в низу экрана откроется табло и будет показываться чему равна переменная в данный момент.
24 lena
 
20.01.05
05:59
Спасибо, нашла в чем была проблема.