Полезные функции. Склонение (должность и фамилия подписантов). Любой язык

03.03.14

Разработка - Универсальные функции

Уехал директор в командировку, отпуск... , оставил доверенность на хозяйственные операции на другого сотрудника.
Все договора и другие  документы в обмороке - "подписант" теперь другой, по тексту тоже много правок...
Пересмотрел много публикаций, вариантов много, не приглянулось. Сделал свой "Баян" .
У меня всего-то крутится  пять фигурантов ... Нет простого, наглядного и всепогодного варианта без  языкового барьера.
Всем процессом управляет  пользователь.

Три падежа :  именительный, родительный, дательный.
Сделано подобно получению наименований валют.

Строка 1:  "Иванов Иван Иванович, Иванова Ивана Ивановича, Иванову Ивану Ивановичу".
Строка 2: "директор, директора, директору".
Строка3 : "заместитель директора по общим вопросам, заместителя директора по общим вопросам, заместителю директора по общим вопросам";


//  Получение Должности для текста, подписи  
//  ПолучитьДолжностьСписок(ктоЭто_,Падеж=0,тип=0)
//  Параметры:
//  КтоЭто_ : - строка : "директор, директора, директору"  
//  Падеж   : - 1-Именительный,2- родительный,3- дательный.
//  Тип     : - 0- первая буква БОЛЬШАЯ ВРЕГ : "Директор",  1 - маленькая НРЕГ : "директор"
//  
&НаСервере
Функция ПолучитьДолжностьСписок(ктоЭто_,Падеж=0,тип=0)
    Если Падеж=0 тогда Падеж=1;конецесли;
    Должность="";
    Если значениезаполнено(ктоЭто_) тогда
        // страховка
        ктоэто__=стрЗаменить(ктоэто_,"  ","");     ктоэто=стрЗаменить(ктоэто__," ","");
        
        Если СтрЧислоВхождений(ктоЭто,",") >0 тогда   // три варианта по падежам - обязательно
            // Именительный
            Где=Найти(КтоЭто,",");

           Первый=Лев(КтоЭто,где-1) ;    остаток2=сред(КтоЭто,где+1,стрдлина(ктоЭто)) ; 
        

          // родительный
            Где=Найти(остаток2,",");

         второй=Лев(остаток2,где-1) ;остаток3=сред(остаток2,где+1,стрдлина(остаток2)); 
         

          // дательный  
            третий= остаток3;

            Если Падеж=1 тогда
                Должность=Первый ;    
            иначеЕсли Падеж=2 тогда    
                Должность=второй ;    
            иначе
                Должность=третий ;    
            конецесли;    
            Если тип=0 тогда
                Должность=Врег(сред(Должность,1,1)) +Нрег(сред(Должность,2,стрдлина(Должность)-1)) ; 
            иначе
                Должность=нрег(сред(Должность,1,1)) +Нрег(сред(Должность,2,стрдлина(Должность)-1)) ; 
            конецесли;    
        конецесли;
    конецесли;        
    возврат Должность;    
Конецфункции

//  Получение фамилии для текста, подписи  
//  ПолучитьФИОСписок(ктоЭто_,Падеж=0,тип=0)
//  Параметры:
//  КтоЭто_ : - строка : "Иванов Иван Иванович, Иванова Ивана Ивановича, Иванову Ивану Ивановичу"  
//  Падеж   : - 1-Именительный,2- родительный,3- дательный.
//  Тип     : - 0- кратко : "Иванов И.И.",  1 - полно : "Иванов Иван Иванович"
//  
&НаСервере
Функция ПолучитьФИОСписок(ктоЭто_,Падеж=0,тип=0)

    Если Падеж=0 тогда Падеж=1;конецесли;
    Подписант="";
    Если значениезаполнено(ктоЭто_) тогда
        // страховка
        ктоэто__=стрЗаменить(ктоэто_,"   "," "); ктоэто = стрЗаменить(ктоэто_,"  "," ");
        Если СтрЧислоВхождений(ктоЭто,",") >0 тогда   // три варианта по падежам - обязательно
            // найдем свой падеж
            // 1    Именительный
            Где=Найти(КтоЭто,",");    
            Первый=Лев(КтоЭто,где-1) ;    
            остаток2=сред(КтоЭто,где+1,стрдлина(ктоЭто)) ;
            // 2  родительный
            Где=Найти(остаток2,",");    
            второй=Лев(остаток2,где-1) ;    
            остаток3=сред(остаток2,где+1,стрдлина(остаток2)) ;
            // 3   дательный
            третий= остаток3;
            
            Если Падеж=1 тогда
                Подписант=Первый ;    
            иначеЕсли Падеж=2 тогда    
                Подписант=второй ;    
            иначе
                Подписант=третий ;    
            конецесли;    
            
            // по умолчанию : Иванов Иван Иванович
            Где=Найти(Подписант," ");    
            Фамилия=Лев(Подписант,где-1) ;    
            остаток2=сред(Подписант,где+1,стрдлина(Подписант)) ;
            Где=Найти(остаток2," ");    
            Имя=Лев(остаток2,где-1) ;
            Остаток3=сред(остаток2,где+1,стрдлина(остаток2)) ;
            Отчество= остаток3;
            
            Если тип = 0   тогда       // Если нужно кратко  Иванов И. И.
                Подписант= Фамилия+" "+ Врег(лев(Имя,1))+"."+вРег(Лев(Отчество,1))+".";
            конецесли;    
        конецесли;
    конецесли;        
    возврат Подписант;    
Конецфункции


Фрагмент программного кода :

.....................................

   // Это основной вариант, берем данные из справочников

    ФиоКлиент=Ссылка.клиент.ДиректорОрганизации  ;
    ФиоБрокер=Ссылка.Организация.Директор  ;

     // Это замена подписанта и где надо по тексту документа


    Если Значениезаполнено(ссылка.ФиоКлиент) тогда
              ФиоКлиент = ПолучитьФИОСписок(ссылка.ФиоКлиент,2,1) ;
    конецЕсли;    
      
    Если Значениезаполнено(ссылка.ФиоБрокер) тогда
          ФиоБрокер = ПолучитьФИОСписок(ссылка.ФиоБрокер,2,1) ;
    конецЕсли;    
...................................



На картинке показан документ с  вкладкой "Подписи(замена)". Если значения полей заполнены - идет подмена должности, фамилии, полученных из соответствующих справочников конфигурации.

См. также

Библиотека процедур и функций для технологической платформы "1С: Предприятие 7.7"

Универсальные функции Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    631    8    user706545_kseg1971    0    

4

1С 7.7 и новый 1С:Контрагент

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    1802    zhenyat    7    

6

Печать таблицы значений в 1С 7.7 при отладке

Универсальные функции Платформа 1С v7.7 Россия Бесплатно (free)

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    4371    Zoltan_Black    11    

2

Установка принтера по умолчанию для 1С 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13259    4    alsen    3    

3

Формирование строки json в 1С: 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10045    malovandrey    1    

17

Как создать индикатор в 1С:Предприятии 7.7

Универсальные функции Работа с интерфейсом Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18658    2    HAMMER_59    6    

2
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. seermak 665 03.03.14 13:30 Сейчас в теме
//1 = Именительный (КТО? ЧТО?)
//2 = Родительный (КОГО?ЧЕГО?)
//3 = Дательный (КОМУ? ЧЕМУ?)
//4 = Винительный (КОГО? ЧТО?)
//5 = Творительный (КЕМ? ЧЕМ?)
//6 = Предложный (О КОМ? О ЧЕМ?)

Функция СклонятьНаСервере(НачальноеНаименование, Падеж)
НужнаяФорма = Ложь;
Запрос = "";
Существительное = НачальноеНаименование;
//Заменим пробелы в строке на %20 для успешного запроса
Запрос = СтрЗаменить(Существительное, " ", "%20");
//Сгенерируем УРЛ и путь для получаемого ответа в виде XML
Путь = КаталогВременныхФайлов() + "sklon.xml";
url = "/inflect.xml?name=" + СокрЛП(Запрос);
HTTP = Новый HTTPСоединение("export.yandex.ru");
//Записываем ответ сервера в xml файл
HTTP.Получить(url, Путь);
//Парсим XML файл
Файл = Новый ЧтениеXML;
Файл.ОткрытьФайл(Путь);
	Пока Файл.Прочитать() Цикл
		Если Файл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Пока Файл.ПрочитатьАтрибут() Цикл
			//Номер падежа является значением в атрибуте "case"
				Попытка
					Если Число(Файл.Значение) = Падеж Тогда //Число(Падеж)
					НужнаяФорма = Истина;
					КонецЕсли;
				Исключение
				Файл.Закрыть();
            УдалитьФайлы(Файл);
				Возврат Существительное;
				КонецПопытки;
			КонецЦикла;
		КонецЕсли;
			
		Если Файл.ТипУзла = ТипУзлаXML.Текст И НужнаяФорма Тогда
		НужнаяФорма = Ложь;
		Существительное = Файл.Значение;
		Прервать; 
		КонецЕсли;
			
		Если Файл.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда 
		КонецЕсли; 
	КонецЦикла; 
Файл.Закрыть();
УдалитьФайлы(Файл);
Возврат Существительное;
КонецФункции
Показать

/// нате и не майтесь....
2. kompas-dm 780 03.03.14 17:27 Сейчас в теме
(1) Смотрел и это, не приглянулось.
1) Не всегда имеется у пользователя в нужное время выход в интернет.
2) Само склонение не цель, а средство для получения законченного текста .
3) А как быть с казахским, молдавским, украинским ?
4) Есть такие фамилии (должности) после "склонения" - обхохочешься.
5) Люди ставят свои подписи не вычитывая текст.Выводы потом на лице...

А здесь все в одном флаконе - как видица, так и пишица.
4. FractonKireyev 19.03.14 11:32 Сейчас в теме
(2)
Не знаю, как с казахским и молдавским, а вот с украинским - абсолютно так-же, как и с русским (грамматика (в том числе и склонения) и пунктуация одинаковые).
3. premierex 204 05.03.14 12:17 Сейчас в теме
А в типовой ЗиУП есть компонента склонения ФИО и должностей. ЗиУП, я так полагаю, в любой организации есть и эту компоненту можно к любой конфигурации применить. Тоже, конечно, далеко не всё правильно склоняет, но как вариант рассмотреть вполне можно.
Оставьте свое сообщение