При работе в 1С пользователь сталкивается с вопросом склонения фамилии или должности сотрудника в печатных формах документов, то есть с ситуацией, когда надо выполнить склонение фамилий по падежам.
Для склонения ФИО в программах 1С предусмотрена внешняя компонента – NameDecl.dll, в которой содержится функция склонения. Ее можно взять на диске ИТС и, скопировав в папку с установленной платформой 1С – bin, зарегистрировать ее в операционной системе. Выполняется данная процедура при помощи команды resvr32 NameDecl.dll (под учетной записью администратора). Для этого необходимо вызвать команду «Выполнить» через кнопку «Пуск», воспользовавшись поиском или сочетание клавиш Windows + R.
Рис.1 Окно поиска. Поиск команды «Выполнить»
В появившемся окне вводим команду resvr32.exe и указываем путь к подключаемой библиотеке, используя кнопку «Обзор».
Рис.2 Окно команды «Выполнить»
После нажатия «Ок» появится сообщение о том, что библиотека успешно зарегистрирована.
Рис.3 Окно сообщения
Описание метода склонения в 1С
Просклонять (ФИО, Падеж, Пол) по параметрам:
- ФИО (обязательный), тип – строка
- Падеж (обязательный), тип – число
Падеж, в который необходимо поставить ФИО, задается числом от 1 до 6.
Таблица падежей: вопросы, предлоги и их значения в программном коде
Случается, возникает неоднозначная ситуация, когда программе необходимо определить принадлежность фамилии к полу, например, Сигида, Чепко, Сушко, Оганезян и т.д.
В этом случае используют дополнительный параметр:
- Пол (необязательный), тип – число
Он показывает, склонять или не склонять фамилию. В других случаях этот параметр опускают или используют значение 0 («авто»), т.к. неправильное указание пола может повлиять на правильность склонения. Здесь возможные значения: 0 – авто, 1 – мужской, 2 – женский.
Сервис «Склонение по падежам»
В программах 1С 8.3 уже включен сервис для склонения данных сотрудников или контрагентов в соответствии с применяемыми в документе падежами.
Фрагмент 1
#Область ПрограммныйИнтерфейс // Склоняет ФИО // Только яля работы на ОС Windows. // // Параметры: // ФИО - Строка - Строка, в которой содержится ФИО для склонения. // Падеж - Число - падеж, в который необходимо просклонять представление объекта. // 1 - Именительный. // 2 - Родительный. // 3 - Дательный. // 4 - Винительный. // 5 - Творительный. // 6 - Предложный. // Объект - СбъехтСклонения - Ссылка на объект, реквизит которого склоняется // Пол - Число - Число - пол физического лида, // 1 - мужской, // 2 - женский. // // Возвращаемое значение: // Строка - Результат склонения ФИО в падеже. // Функция ПросклонятьФИО(ФИО, Падеж, Объект = Неопределемо, Пол = Неопределено) Экспорт // Склоняет представление объекта. Функция ПросклонятьПредставлекие(Представление, Падеж, Объект = Неопределено) Экспорт // Выполняет с формой действия, необходимые для подключения подсистемы Склонения.Рис.4 Окно конфигуратора
Фрагмент 2
// Склоняет представление объекта. Функция ПросклонятьПредставление(Представление, Падеж, Объект = Неопределено) Экспорт Возврат Просклонять(Представление, Падеж, Объект); Конецфункции // Выполняет с формой действия, не обходимые для подключения подсистемы Склонения Процедура ПриСозданииНаСервере(Форма, Представление, ИмяОсновногоРеквизитаФормы = "Объект") Экспорт // Обработчик события ПриЗаписиНаСервере управляемой формы объекта для склонения Процедура ПриЗаписиНаСервере(Форма, Представление, Объект, ЭтоФИО = Ложь, Пол = Неопределено) Экспорт // Устанавливает признак доступности сервиса склонения Процедура УстановитьДоступнсстьСервисаСклонения(Доступность) Экспорт УстановитьПривилегированныйРежим (Истина); ТекущиеПараметры = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере); ТекущиеПараметры.Вставить("ДоступенСервисСклонения", Доступность); ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСсответствие(ТекущиеПараметры); УстановитьПривилегированныйРежим(Ложь); КонецПроцедурыРис.5 Использование функции «Просклонять»
Используя в документе реквизиты, которые выбираются из справочника, в котором они представлены в именительном падеже, в печатную форму документа они будут выведены с нужным склонением.
Рассмотрим функцию склонения на примере договора в «1С:Бухгалтерия» 3.0. (1С:Предприятие 8.3). Здесь предусмотрено склонение ФИО и должности.
Рис.6 Окно формы договора. Настройка склонения фамилии и должности
В печатную форму программа автоматом поставит правильный вариант.
Рис.7 Окно программы – «Склонение по падежам»
Пример склонения по падежам можно видеть в «Приказе о приеме на работу». В карточке сотрудника его ФИО указано в Именительном падеже, а в печатной форме – в Родительном.
Рис.8 Пример склонения ФИО в печатной форме «Приказ о приеме на работу»
Программа 1С, учитывая требования законодательства и стандартов, позволяет соответствовать утвержденному порядку оформления документации и формирования печатных форм.
Склонение по падежам обусловлено и стандартами делового оборота, которые предусматривают, что любой документ должен быть оформлен не только грамотно, но и эстетически грамотно, что отражает статус организации.
Помимо этого использование таких функций в программе, как автосклонение, значительно снижает вероятность ошибок в составлении документов.
Склонение ФИО в 1С 8.3
В ходе эксплуатации комплекса программного обеспечения 1С у пользователей часто возникают вопросы относительно склонения ФИО 1С 8.3. 1С функция склонения ФИО осуществляется специальной компонентой, которая именуется как "NameDecl.dll". Для старта использования компоненту необходимо скопировать с диска информационно-технического сопровождения в папку, где расположена основная платформа bin, а также зарегистрировать ее в операционке. Осуществляется копирование через команду «resvr32 NameDecl.dll». С этой целью открываем «Пуск» вызываем директиву «Выполнить», как это показано на рисунке.
Открываем окно и прописываем «resvr32.exe», указывая путь к нужной библиотеке. Библиотека выбирается через кнопку «Обзор». Далее нужно выбрать «ОК» и подтвердить регистрацию библиотеки.
1с склонение ФИО выполняется по 2 параметрам:
- Падеж, тип - число. Это обязательный параметр.
- ФИО, тип - строка. Также является обязательным параметром.
Так как в русском языке имеется шесть падежей, падежу присваивается число от 1 до 6 в соответствии с таблицей, представленной ниже:
Также выделяют третий, необязательный параметр компоненты склонения ФИО 1С - пол (тип - число). Здесь есть 3 варианта: 0 - авто, 1 - муж, 2 - жен.
Сервис 1С 8 склонение ФИО
Программы версии 1С 8.3 имеют специальный сервис для склонения ФИО по падежам 1С 8.3, который работает через конфигуратор. Поэтому, чтобы просклонять ФИО, открываем окно конфигуратора и используем функцию «Просклонять», как это показано ниже:
Реквизиты вводим из справочника, где они отображены в именительном падеже. На печать документы выводятся и отображаются в формах уже в желаемом склонении. В качестве примера, вот это выглядит в форме договора:
В качестве примера ниже представлении приказ о найме на работу, где в карточки специалиста его фамилия, имя и отчество прописаны в И.П., а вот в печатной форме они отображаются в Р.П.
1С автоматически дает возможность составлять печатные формы и документацию с учетом действующих требований законодательства. Необходимость склонения по падежам, родам и числам продиктована стандартами делового документооборота, согласно которым любой документ составляется эстетично, грамотно и соответствует статусу компании.
Применение функции автосклонения минимизирует вероятность ошибок при формировании документов, что защищает от негативных последствий в будущем. Особенно актуально это для тех случаев, когда формируется сразу большое количество документов. Автосклонение рационализирует работу с документацией и экономит время, что положительно сказывается на результативности.
Мы разобрали 2 способа склонения фамилии, имя отчества по падежам, числам и родам - с помощью специальной компоненты склонения ФИО 1С 8.3 и через сервис конфигуратора. Попробуйте оба и определите, какой больше подходит для вас.
В файле - процедуры для 7.7 и для 8.х. В процедуру передаётся строка в формате Фамилия Имя Отчество.
UPD 26.11.10: с благодарностью - новая версия функции. Я - не тестировала! Вопросы по работе этой версии - к нему, выкладывать сам почему-то не хочет:)
Функция ПадежФИО(Знач ФИО,Падеж=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;
КонецЕсли;
Если не ПустаяСтрока(Фамилия) Тогда
пб=Прав(Фамилия,3); кол="СтарОк"; // ищем по ней
новФамилия=Фамилия; // если ничего не изменится, так и будет
стро=ток.Найти(пб,кол);
Если стро<>
Иначе
// строго не нашли по трем последним символам, ищем по двум символам только по последней
пб=Прав(Фамилия,2);
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда
Основа=Лев(Фамилия,СтрДлина(Фамилия)-стро.КолвоСрез);
новФамилия=Основа+СокрЛП(стро[пад]);
Иначе // если по двум не нашли, ищем по одному
пб="*"+Прав(пб,1);
стро=ток.Найти(пб,кол);
Если стро<>
Основа=Лев(Фамилия,СтрДлина(Фамилия)-стро.КолвоСрез);
новФамилия=Основа+СокрЛП(стро[пад]);
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли по виду
Основа=Лев(Фамилия,СтрДлина(Фамилия)-стро.КолвоСрез);
новФамилия=Основа+СокрЛП(стро[пад]);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
новФамилия="";
КонецЕсли;
// ======== обработаем имя ==========
// заполним таблицу данными для имени
ток.Очистить();
Если Пол="М" Тогда
// обработаем исключения
Если Имя="лев" Тогда Имя="льв" КонецЕсли;
Если Имя="павел" Тогда Имя="павл" КонецЕсли;
Строток=ток.Добавить(); // сергей
строток.старок="*й";
строток.р="я"; строток.д="ю"; строток.в="я"; строток.т="ем"; строток.п="е";
строток.колвосрез=1;
Строток=ток.Добавить(); // иван + лев + павел
строток.старок="*s";
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ом"; строток.п="е";
строток.колвосрез=0;
Строток=ток.Добавить(); // никита
строток.старок="*а";
строток.колвосрез=1;
Строток=ток.Добавить(); // лука
строток.старок="ка";
строток.колвосрез=1;
Строток=ток.Добавить(); // иеремия
строток.старок="ия";
строток.колвосрез=1;
Строток=ток.Добавить(); // илья
строток.старок="*я";
строток.колвосрез=1;
Строток=ток.Добавить(); // игорь
строток.старок="*ь";
строток.р="я"; строток.д="ю"; строток.в="я"; строток.т="ем"; строток.п="е";
строток.колвосрез=1;
ИначеЕсли Пол="Ж" Тогда
// обработаем исключения
//Если Имя="ольга" Тогда Имя="ольгь" КонецЕсли;
Строток=ток.Добавить(); // ирина
строток.старок="*а";
строток.р="ы"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;
Строток=ток.Добавить(); // инга, ольга
строток.старок="га";
строток.р="и"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;
Строток=ток.Добавить(); // эсфирь
строток.старок="*ь";
строток.р="и"; строток.д="и"; строток.в="ь"; строток.т="ью"; строток.п="и";
строток.колвосрез=1;
Строток=ток.Добавить(); // мария
строток.старок="ия";
строток.р="и"; строток.д="и"; строток.в="ю"; строток.т="ей"; строток.п="и";
строток.колвосрез=1;
Строток=ток.Добавить(); // софья
строток.старок="*я";
строток.р="и"; строток.д="е"; строток.в="ю"; строток.т="ей"; строток.п="е";
строток.колвосрез=1;
КонецЕсли;
// таблица заполнена. считаем 2 последних буквы и поищем их
Если не ПустаяСтрока(Имя) Тогда
пб=Прав(Имя,2); кол="СтарОк"; // ищем по ней
новИмя=Имя; // если ничего не изменится, так и будет
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли строгое сразу
Иначе // строго не нашли, ищем только по последней
пб="*"+Прав(пб,1);
стро=ток.Найти(пб,кол);
Если стро<>Неопределено Тогда // нашли по последней
Основа=Лев(Имя,СтрДлина(Имя)-стро.КолвоСрез);
новИмя=Основа+СокрЛП(стро[пад]);
Иначе // по последней не нашли, ищем по виду буквы
пб="*"+?(Найти(Гласные,Прав(пб,1))=0,"s","g");
стро=ток.Найти(пб,кол);
Если стро<>Неопределено=1 Тогда // нашли по виду
Основа=Лев(Имя,СтрДлина(Имя)-стро.КолвоСрез);
новИмя=Основа+СокрЛП(стро[пад]);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
новИмя="";
КонецЕсли;
// ======== обработаем отчество, тут проще ==========
ток.Очистить();
Если Пол="М" Тогда
строток=ток.Добавить();
строток.р="а"; строток.д="у"; строток.в="а"; строток.т="ем"; строток.п="е";
строток.колвосрез=0;
ИначеЕсли Пол="Ж" Тогда
строток=ток.Добавить();
строток.р="ы"; строток.д="е"; строток.в="у"; строток.т="ой"; строток.п="е";
строток.колвосрез=1;
КонецЕсли;
Если не ПустаяСтрока(Отчество) Тогда
Основа=Лев(Отчество,СтрДлина(Отчество)-ток.КолвоСрез);
новОтчество=Основа+СокрЛП(ток[пад]);
Иначе
новОтчество="";
КонецЕсли;
Если ТолькоИнициалы Тогда
новИмя=Лев(новИмя,1); новОтчество=Лев(новОтчество,1);
КонецЕсли;
// установим первые буквы верхним регистром
новФамилия=ВРег(Лев(новФамилия,1))+Сред(новФамилия,2);
новИмя=ВРег(Лев(новИмя,1))+Сред(новИмя,2);
новОтчество=ВРег(Лев(новОтчество,1))+Сред(новОтчество,2);
// и теперь всё вместе
Если ТолькоИнициалы Тогда // если задан формат инициалов
новФИО=новФамилия+" "+новИмя+пРазделитель+новОтчество+пРазделитель;
Иначе
новФИО=новФамилия+" "+новИмя+" "+новОтчество;
КонецЕсли;
Если Найти(ФИО, ".") Тогда // На тот случай, если входной параметр Фамилию с инициалами. Инициалы не трогаем
новФИО = новФамилия + " " + ТРег(Имя) + Трег(Отчество);
КонецЕсли;
Возврат СокрЛП(новФИО);
КонецФункции