|
|
|
ЗиК. Склонение. | ☑ | ||
|---|---|---|---|---|
|
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
|
Спасибо, нашла в чем была проблема.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |