gifts2017

Склонение ФИО и должностей через веб-сервис – 1С 8.2

Опубликовал Лингвист в раздел Программирование - Практика программирования

Предлагаемая разработка предоставляет программистам 1С функцию склонения по падежам слов и словосочетаний на русском и украинском языках, а также функцию формирования прописи чисел в заданном падеже. Программа умеет склонять фамилии, имена и отчества, а также должности, названия отделов и юридических лиц (на украинском пока только ФИО). Указание пола не требуется.  Наоборот, программа автоматически определяет и выдает грамматический род словосочетания, по которому определяется пол лица.  Алгоритм демонстрирует высокое качество склонения, а для случаев, когда программа все же ошибается, предусмотрен сервис оперативного исправления ошибок.  Программа реализована в виде веб-сервиса, доступного бесплатно всем желающим (до 1000 запросов в сутки). Для вызова функции склонения из 1С 8.2 достаточно 3 строчек кода, при этом не нужно включать в конфигурацию никаких дополнительных DLL. Пример обработки на языке 1С прилагается.

Реализуемые функции

Веб-сервис «Морфер» предназначен для склонения по падежам слов и словосочетаний на русском и украинском языках.  Входное словосочетание может быть в единственном или множественном числе, но обязательно в именительном падеже.  На выходе генерируется единственное и множественное число во всех падежах и автоматически определяется род.

Например, на входе:

ведущий инженер-программист III категории

На выходе: 

И. ведущий инженер-программист III категории ведущие инженеры-программисты III категории
Р. ведущего инженера-программиста III категории ведущих инженеров-программистов III категории
Д. ведущему инженеру-программисту III категории ведущим инженерам-программистам III категории
В. ведущего инженера-программиста III категории ведущих инженеров-программистов III категории
Т. ведущим инженером-программистом III категории ведущими инженерами-программистами III категории
П. о ведущем инженере-программисте III категории о ведущих инженерах-программистах III категории
Род: мужской

Число поддерживаемых типов словосочетаний не ограничено фамилиями и должностями.  Программа умеет склонять также названия подразделений, юридических лиц, географические названия и многое другое.  Высокое качество склонения обеспечивается использованием словарей, в частности, «Словаря имен собственных» Ф.Л. Агеенко на 38 000 единиц.  За 9 лет работы над «Морфером» было составлено более 27 000 примеров склонения для русского и более 11 000 для украинского языка.  База примеров постоянно пополняется и используется для контроля качества продукта.

Веб-сервис также реализует функцию прописи чисел и денежных сумм в произвольном падеже, позволяющую формировать такие фразы как: «в течение 7 (Семи) календарных дней» («21 календарного дня»), «в размере 1000 (Одной тысячи) рублей» («десяти тысяч рублей») и т.п.  Склонение единицы измерения также осуществляется автоматически.  Нет необходимости указывать заранее все падежные формы ("рубль", "рубля", "рублей").

Быстрый старт: склонение должности

Программа для склонения должности будет выглядеть так:

ОпределениеМорфер=Новый WSОпределения("http://api.morpher.ru/WebService.asmx?WSDL");
Морфер=Новый WSПрокси(ОпределениеМорфер,"http://morpher.ru/","WebService","WebServiceSoap");
	
результат = Морфер.GetXml("Генеральный директор");
	
Сообщить("Родительный (кого?): " + результат.Р);
Сообщить("Дательный   (кому?): " + результат.Д);
Сообщить("Винительный (кого?): " + результат.В);
Сообщить("Творительный (кем?): " + результат.Т);
Сообщить("Предложный (о ком?): " + результат.П_о);

Чтобы проверить, как работает этот код, скопируйте его в Конфигуратор (Конфигурация, правый клик, «Открыть модуль обычного приложения», Вставить) и вставьте, например, в процедуру ПриНачалеРаботыСистемы.  После запуска программы (F5) в окне сообщений появится директор во всех падежах:

Родительный (кого?): Генерального директора
Дательный   (кому?): Генеральному директору
Винительный (кого?): Генерального директора
Творительный (кем?): Генеральным директором
Предложный (о ком?): о Генеральном директоре

Для украинского языка функция склонения называется GetXmlUkr:

результат = Морфер.GetXmlUkr("Лук'янченко Леонід Аркадійович");
	
Сообщить("Родовий     (кого?): " + результат.Р);
Сообщить("Давальний   (кому?): " + результат.Д);
Сообщить("Знахідний   (кого?): " + результат.З);
Сообщить("Орудний      (ким?): " + результат.О);
Сообщить("Місцевий (на кому?): " + результат.М);
Сообщить("Кличний:             " + результат.К);

Результат:

Родовий     (кого?): Лук'янченка Леоніда Аркадійовича
Давальний   (кому?): Лук'янченку Леоніду Аркадійовичу
Знахідний   (кого?): Лук'янченка Леоніда Аркадійовича
Орудний      (ким?): Лук'янченком Леонідом Аркадійовичем
Місцевий (на кому?): Лук'янченку Леоніді Аркадійовичі
Кличний:             Лук'янченко Леоніде Аркадійовичу

Украинская версия пока лучше всего справляется с фамилиями, именами и отчествами.  Работа над другими типами словосочетаний ведется.

Функция построения прописи числа в любом падеже

Функция Propis (PropisUkr) решает две родственные задачи: получение прописи числа (тысяча сто двадцать пять) и согласование единицы измерения с предшествующим числом (1 попугай, 2 попугая, 5 попугаев). Пример:

// Пример написания денежной суммы прописью в родительном падеже:
пропись = Морфер.Propis(235, "рубль");
Сообщить(пропись.n.И + " " + пропись.unit.И);
Сообщить("в размере " + пропись.n.Р + " " + пропись.unit.Р);

Результат:

двести тридцать пять рублей
в размере двухсот тридцати пяти рублей

Функция принимает два аргумента:

n – целое положительное число.

unit – единица измерения – слово или словосочетание в именительном падеже единственного числа: «рубль», «доллар США», «календарный день», «новое письмо» и т.п. Если слово употребляется только во множественном числе, то указывается форма именительного падежа множественного числа: «сутки», «брюки», «ножницы».

Результат, возвращаемый функцией Propis, содержит два набора падежных форм: один для числа (n), другой для единицы измерения (unit).  Комбинируя соответствующие падежные формы n и unit, можно получить вывод «суммы прописью» на любой вкус:

235 рублей
Двести тридцать пять рублей
235 (двести тридцать пять) рублей и т.п.

Комбинировать имеет смысл только соответствующие падежные формы n и unit – именительный с именительным, родительный с родительным и т.д. Например, для получения фразы "в размере N рублей (долларов, евро...)", берем родительный падеж (Р): в размере + двухсот тридцати пяти + рублей.

Обработка ошибок

Вызовы функций веб-сервиса рекомендуется обернуть в блок Попытка / Исключение на случай отсутствия связи с веб-сервисом или других непредвиденных ситуаций.  Сообщение об ошибке будет при этом выглядеть примерно так:

{МодульОбычногоПриложения(22)}: Ошибка при вызове метода контекста (GetXml)
                результат = Морфер.GetXml("asdf");
по причине:
Ошибка вызова операции сервиса:  {http://morpher.ru/}:WebService:GetXml()
по причине:
Ошибка SOAP сервера:  Не найдено русских слов.

В данном случае ошибка возникла из-за того, что склоняемая строка не содержит ни одного русского слова.  Другой возможный случай – когда склоняемая строка содержит количественное числительное («тридцать три коровы»).  Такие словосочетания программа не обрабатывает, выдается ошибка. 

Совместимость и устранение неполадок

По невыясненным пока причинам вызов веб-сервиса не работает в отдельных версиях платформы:

ВерсияРезультат тестированияКем протестированоДата
8.2.9.365 Не работает Лингвист 14.08.2012
8.2.15.300 Работает Лингвист 27.04.2014
8.3.1 Работает Стил 27.04.2014
8.3.3 Не работает в подключаемых внешних печатных формах. Выдает: "Ошибка при вызове конструктора (WSОпределения)". Подробнее см. комментарий №41 ниже. Стил 27.04.2014
8.3.4

Если вы используете версию, не указанную выше, пожалуйста, отпишитесь в комментариях, указав версию 1С и работоспособность обработки (интересует как отрицательный, так и положительный результат).

Если вы получаете сообщение "Ошибка при вызове конструктора (WSОпределения)", проверьте, что Windows Firewall не блокирует процесс 1С:Предприятия (1cv8.exe).

Оперативное исправление ошибок склонения

Склонение как языковой феномен изобилует неоднозначностями, особенно в области имен собственных.  В городе Москва или в городе Москве?  В республике Корея или в республике Корее?  В Тушино или в Тушине?  Обладатели «диковинных» фамилий часто не любят, чтобы их склоняли.  Скажем, если у человека фамилия Груздь, он будет требовать, чтобы его фамилию не склоняли, часто вопреки правилам русского языка и всеобщему мнению.  Но если он ваш начальник, то неизвестно еще, кто останется Груздём, если вы позволите себе просклонять его в договоре.

Не секрет, что алгоритм автоматического склонения тоже может ошибаться – не знать какого-либо слова или запутаться в сложной синтаксической структуре.  Что делать, если машина склоняет не так, как надо, а документ должен быть на столе у начальника через 10 минут?  Хорошо, если система позволяет вручную исправлять документ после его выдачи.  Но исправлять фамилию начальника в каждом приказе тоже не дело.  Традиционное решение этой проблемы (если руки дойдут до его реализации) – хранение падежных форм в таблице-справочнике, которая заполняется вручную.

Веб-сервис склонения предоставляет как раз такое «табличное» решение проблемы ошибок в склонении – только вам для этого ничего не нужно делать, все уже реализовано за вас – и база данных, и интерфейс для ее редактирования для двух языков, и проверка введенных вами данных профессиональным лингвистом.  Достаточно зайти на страничку исправления ошибок и ввести нужные вам падежные формы (или исправить результат автоматического склонения).  После этого веб-сервис сразу же будет склонять так, как вы указали – но только для вас.  После проверки введенного вами примера администратором он станет доступен остальным пользователям веб-сервиса.  Введеные исправления также используются для совершенствования алгортима склонения. Таким образом качество склонения улучшается самими пользователями.

Страничка исправления ошибок

Установка веб-сервиса в вашей локальной сети

Многие пользователи веб-сервиса высказывали желание иметь «такой же сервис, только у себя», т.е. иметь возможность развернуть веб-сервис в своей локальной сети.  Это решило бы проблему с использованием веб-сервиса на рабочих местах, где нет доступа к Интернету, а также проблему с законом «О защите персональных данных», требующим обеспечения конфиденциальности таких данных.

В ответ на эти пожелания был создан вариант веб-сервиса, допускающий установку на сервере в локальной сети предприятия или непосредственно на машине пользователя, если пользователь один.  Новый продукт получил название «Морфер.Сервер». Он реализует те же функции, что и общедоступный веб-сервис, включая функцию поддержания пользовательского словаря, и работает в сотни раз быстрее из-за того, что локальная сеть быстрее Интернета. 

Для переключения с «глобального» на «локальный» сервис достаточно изменить код следующим образом:

ОпределениеМорфер=Новый WSОпределения("http://comp001/morpher/WebService.asmx?WSDL");
Морфер=Новый WSПрокси(ОпределениеМорфер,"http://morpher.ru/","WebService","WebServiceSoap");

Здесь comp001 – это сетевое имя компьютера, где установлен веб-сервис. Во второй строчке изменять ничего не нужно.  

Как приобрести и установить у себя локальный веб-сервис, описано на странице продукта: «Морфер.Сервер».

Резервирование

В данный момент работают две копии веб-сервиса на двух доменах, morpher.ru и api.morpher.ru. Функционально обе копии сервиса полностью идентичны. Зарегистрированный пользователь является зарегистрированным на обоих доменах и приобретенные подписки также действуют на обоих доменах. Это сделано с целью резервирования: если один из сервисов перестанет работать, можно переключиться на другой.  Для этого нужно изменить имя домена в коде следующим образом:

ОпределениеМорфер=Новый WSОпределения("http://morpher.ru/WebService.asmx?WSDL");
Морфер=Новый WSПрокси(ОпределениеМорфер,"http://morpher.ru/","WebService","WebServiceSoap");
Во второй строке изменять ничего не нужно. Предпочтительным является домен morpherapi.ru и со временем, когда резервирование будет сделано на стороне сервера, сервис на домене morpher.ru завершит работу, о чем будет сообщено заранее в комментариях к данной статье.

Альтернативы

Автор «Морфера» занимается вопросом автоматического склонения профессионально с 2003 года и постоянно следит за аналогичными разработками. Одним из заметных аналогов является веб-сервис Яндекс.Склонятор, но он склоняет только «имена, фамилии и ники». Вот список еще нескольких решений, разработанных для платформы 1С:

Дата публикацииНазваниеАвторТипЯзык+/-
2002 Падеж. Версия "Крохотулька" Юрия Железнякова SuperJur рус  
01.10.2008 Склонение ФИО e.kogan рус +142/-0
27.02.2007 V7NDS: Сервис поддержки склонений ФИО для 1С NDeclin ВК рус +59/-0
21.11.2010 Учим внешнюю компоненту правильному склонению не только ФИО, но и должностей, и подразделений (ЗУП 2.5) director04 ВК + 1С рус +53/-0
06.02.2012 Склонение ФИО и должностей fixin рус +16/-0
16.06.2009 ФИО и должности в винительном и дательном падеже (укр) (Ivon) Ivon укр +16/-0
08.11.2007 Склонение украинских ФИО, должностей и подразделений в семи падежах. DLL с поддержкой OLE. tarasenkov ВК укр +15/-3

 * Количество плюсов и минусов дано на момент публикации.

 

В «Морфере» учтены многие пожелания к системам подобного рода, а именно:

  1. Возможность бесплатного использования функций склонения – имеется, до 1000 запросов в сутки. Этого количества более чем достаточно для частных лиц и малого бизнеса.  Для более крупных клиентов имеется платный доступ.
  2. Простота развертывания. Не нужно включать в конфигурацию никаких дополнительных библиотек, регистрировать их в реестре и поставлять пользователям. Не нужны права администратора на пользовательских машинах.
  3. Возможность оперативного исправления ошибок. Многие пользователи отмечали как недостаток DLL невозможность оперативного исправления ошибок склонения. Даже в случае с «открытым кодом» на языке 1С, чтобы исправить одну фамилию, разбираться в этом коде (сразу вспоминается «Крохотулька») не у всех программистов найдется время и желание. Веб-сервис решает эту проблему, предоставляя пользователям веб-страницу для оперативного изменения склонения отдельных словосочетаний. Для этого не требуется вмешательства программиста – исправить ошибку сможет любой грамотный пользователь компьютера.
  4. Изменение по числам (просьба). Реализовано.

Кроме того, отличительными особенностями «Морфера» являются:

  1. Простой API: склонение всех типов словосочетаний производится одной функцией. Нет необходимости указывать тип словосочетания (ФИО, должность, подразделение...)
  2. Не требуется указание пола. Наоборот, программа автоматически определяет и выдает грамматический род словосочетания, по которому однозначно определяется пол лица.
  3. Высокое качество склонения, достигаемое использованием комбинированного подхода – алгоритмы для кодирования правил и словари для учета исключений. «Морфер» вобрал в себя несколько многотысячных словарей, годы кропотливой работы, учета замечаний и пожеланий пользователей.

Огромное спасибо Андрею Склярову за первую версию обработки вызова веб-сервиса. Жду новых ваших пожеланий и замечаний. Именно они мотивируют меня развивать продукт дальше.

Скачать файлы

Наименование Файл Версия Размер
Пример склонения и суммы прописью 136
.epf 6,84Kb
12.07.12
136
.epf 6,84Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Доржи Балбаров (Angeros) 14.08.12 09:49
Решение сомнительно, както не верится в надежность и 100% стабильность интернета... Как будет склоняться без инета?!
2. Лингвист 14.08.12 10:02
Может быть, еще и электричество отключим? :) Конечно, без интернета склоняться не будет. В этом ахиллесова пята сервис-ориентированной архитектуры. Но и положительных моментов много - простота (3 строчки кода на стороне клиента), бесплатные автоматические обновления кода и словарной базы, возможность оперативного исправления ошибок. Думайте, решайте, что вам больше подходит.
3. Сергей Сытько (8SiriuS8) 14.08.12 11:49
А какой аптайм сервера где идет склонение. Насколько я помню раньше он часто был не доступен. Как сейчас обстоят в этом дела.
И ещё нагрузочные тесты кто нить проводил с этим сервером. Не ляжет ли он если ему одновременно 1 000 запросов на склонение отправить с разных мест.
И ещё нигде не написано об условиях использования данного сервиса.

А так да склоняет неплохо.
4. Лингвист 14.08.12 13:21
Сервер (веб-ферма) находится в Москве, доступен круглосуточно. Изредка (раз в несколько месяцев) хостинг-провайдер проводит профилактику в 2:00 по московскому времени, что занимает несколько минут. С 2007 года сайт был недоступен продолжительное время (8 часов) только один раз, ночью 2.03.2012, в основном по моей вине. Наутро сотрудники провайдера помогли все починить.

Нагрузочное тестирование не проводилось, но у хостинга большой запас по всем параметрам - процессор, память, пропускная способность. При необходимости их можно оперативно увеличить. Будем решать проблемы по мере их поступления. За последние полгода зарегистрировано более 1 млн. запросов, проблем пока не видно.
5. nissal 14.08.12 13:28
В целом очень удачное решение. Ошибка в примере:

"Кличний: Лук'янченке Леоніде Аркадійовиче"

ошибочно, должно быть: Лук'янченко Леоніде Аркадійовичу
6. Лингвист 14.08.12 16:08
Спасибо за поправку! На украинском не говорю, изучаю в основном по учебникам.

Исправил через форму исправления ошибок: Лук'янченко Леонід Аркадійович.

При первой возможности исправлю остальные подобные. Спасибо!
7. Ирли Бёрд (EarlyBird) 15.08.12 07:47
К сожалению, данным решением пользоваться не буду, поскольку подключение через веб-сервис - это неоправданное "засвечивание" базы наружу (во внешний интернет).
Любой выход пользователей базы во внешний интернет - это потенциальная угроза информационной безопасности.
Необходимость просклонять чьё-то ФИО не представляется достаточно убедительным оправданием для выхода во внешку.

Однако, особое спасибо за список альтернативных решений!
Нашёл среди них подходящее для себя.
8. Лингвист 15.08.12 14:36
Интересное замечание! Да, проблема безопасности веб-сервисов не нова и имеет стандартное решение – защищенное соединение по HTTPS. Будем работать.

Хочу заметить, что для среднестатистической компании, где сотрудники пользуются бесплатными сервисами (например, почтой или другими сайтами, где требуется регистрация), степень риска от использования «Морфера» не сильно повысится.

Но соединение по HTTPS нужно реализовать, Вы правы.
9. Алексей Соловьев (Silenser) 15.08.12 21:22
Поставил +, но не обработке и веб сервису, а технологии склонения в целом. Узнал о Морфере еще пару месяцев назад, очень понравилась точность склонения, но вот выход в Интернет для этих целей считаю неоправданным, тут больше подойдет ваша dll, не подскажете, кстати, сколько стоит, на сайте ничего конкретно не указано.
10. Лингвист 16.08.12 01:37
(9) Silenser, спасибо за высокую оценку качества склонения. Я действительно прилагаю к этому много усилий.

Про оправданность "выхода в интернет" с Вами не согласны 149 пользователей, пославших от 50 до 111380 запросов за последний месяц.

Насчет DLL - пишите в личку (не хочу нарушать правила форума).
12. Лингвист 16.08.12 14:31
(11) electronik, денег не нужно. Все, что нужно - это 3 строчки кода:

ОпределениеМорфер=Новый WSОпределения("http://morpher.ru/WebService.asmx?WSDL");
Морфер=Новый WSПрокси(ОпределениеМорфер,"http://morpher.ru/","WebService","WebServiceSoap");
Сообщить("Дательный (кому?): " + Морфер.GetXml("Генеральный директор").Д);

Если удастся протестировать скорость (оберните последнюю строчку в цикл), напишите результат и в каком городе Вы находитесь.
13. Андрей Казанцев (ander_) 17.08.12 09:10
Блин. А ведь здорово. И совсем не обязательно иметь постоянное соединение. Можно сделать какое-нибудь регламентное задание, которое будет время от времени н.р. по ноывм юр.лицам заполнять табличку.
Автору спасибо!
Ушел думать куда прикрутить :).
14. Александр Серов (Itilive.ru) 21.08.12 15:18
А что со склонением должностей типа
"Руководитель юридической службы"
или
"Заместитель генерального директора по экономике и финансам"
?
К сожалению сам не могу проверить в моменте, т.к. IP клиента заблокирован.
Меня в свое время "уели" с данными формулировками.


Проверил. Все работает. Хитро -отсекать склонение после существительного. ) Круто.
16. Лингвист 24.08.12 02:58
Кстати, насчет «IP заблокирован». Проблема решается передачей веб-сервису логина и пароля. Дело в том, что некоторые излишне активные IP могут автоматически блокироваться и если ваш внешний IP совпадет с заблокированным, вам не повезет. Идентификация по логину и паролю гарантирует, что веб-сервис вас ни с кем не спутает. Для этого нужно зарегистрироваться и добавить в код две строчки:

Морфер.Пользователь = "user123";
Морфер.Пароль = "password123";

Кроме того, оперативное исправление ошибок работает только для зарегистрированных пользователей, т.к. иначе любой мог бы исправить склонение «Генеральный директор» на «Генеральный Козёл» (или еще что похлеще). Исправления, введенные на странице исправлений без предварительного входа, не влияют на веб-сервис. Рекомендуется зарегистрироваться заранее, т.к. если встретится ошибка, вам захочется поскорее ее исправить, а не править код (возможно, на нескольких рабочих станциях).

Поэтому если вы собираетесь всерьез пользоваться веб-сервисом, крайне рекомендую зарегистрироваться.
18. Карина -- (ponaroshku) 22.10.12 07:00
Спасибо за обработку!
Поставила плюс автору
В целом, склоняет неплохо, нареканий нет, кроме... одной фамилии - Горелик, которая не должна склоняться, но система все равно пытается её просклонять... Тут, пожалуй, ничего не поделаешь
Но в целом большой плюс
19. Лингвист 22.10.12 15:37
Ponaroshku, как раз в этом случае есть, что поделать: если вам не нравится, как склоняется какое-либо словосочетание, вы можете легко это исправить на странице оперативного исправления ошибок. Подробнее см. выше.

Кстати, по правилам русского языка фамилия Горелик склоняется для мужчин и не склоняется для женщин: Грамота.ру, п. 13.1.4. В данный момент в веб-сервиса нет возможности указывать род. Обойти это ограничение можно, указав полные ФИО, а затем сократив их до инициалов, если нужно:

Горелик Евгений - фамилия склоняется
Горелик Евгения - не склоняется
Горелик Е. - склоняется в предположении, что Е. - мужское имя.

Спасибо за плюс!
20. Ольга (_n26__) 15.01.13 15:12
21. Andrey Karetskiy (silberRus) 31.01.13 14:00
до конца не прочитал и радостно скачал

а вышло что работает через инет,
не подходит для спрятанных баз, а очень надо (
22. Алексей Гаврилов (Skromnyi) 04.06.13 09:03
Сервис 2-ой день недоступен. При заходе на сайт: "HTTP Error 503. The service is unavailable."
23. Лингвист 04.06.13 17:39
Всем добрый день!

На данный момент сервис восстановлен. Приношу извинения за доставленные неудобства. Проблему я увидел сразу - пришло письмо от службы мониторинга. Но диагностировать ее моими средствами оказалось невозможно. Сотрудники хостинга сами несколько часов разбирались. Причина оказалась в превышении лимитов оперативной памяти. Сейчас проблема полностью устранена и код, вызывавший превышение, исправлен.

Если для вас критична бесперебойная работа веб-сервиса, имеется возможность приобрести и установить у себя в локальной сети точно такой же веб-сервис. Работать будет на порядок быстрее и надежней. Подробности на сайте:

http://morpher.ru/webservice/local/
24. muha muhaha (fr.myha) 10.07.13 14:00
Спасибо. А если интернет не подключен?
Делюсь функцией, возвращающая инициалы в дательном падеже =)

// функция в зависимости от переданного параметра возвращает ФИО
//
// Параметры:
// ФИО - строка. Если Можно вводить только Фамилию или Фимилия Имя или полное ФИО,
// разделитель пробел.
// Пол - Перечисления.Пол
// ТипВывода - числа 1: полное ФИО
// 2: Фамилия И.О.
// 3: И.О. Фамилия
// Возвращаемое значение:
// строка - результат форматирования
Функция обДательныйПадежНаСервере(ФИО,Пол,ТипВывода=0) Экспорт

ФИО_Падеж="";
Фамилия="";
Имя="";
Отчество="";
ФамилияПадеж="";
ИмяПадеж="";
ОтчествоПадеж="";
ФИО=СокрЛП(ФИО);
Длина=0;

Если СтрЧислоВхождений(ФИО," ") = 0 Тогда
Фамилия = ФИО;
Длина = 1;
ИначеЕсли СтрЧислоВхождений(ФИО," ") = 1 Тогда
Фамилия = Лев(ФИО,Найти(ФИО," ")-1);
Имя = СтрЗаменить(ФИО,Фамилия+" ","");
Длина = 2;
ИначеЕсли СтрЧислоВхождений(ФИО," ") = 2 Тогда
Фамилия = Лев(ФИО,Найти(ФИО," ")-1);
Имя = Лев(СтрЗаменить(ФИО,Фамилия+" ",""),Найти(СтрЗаменить(ФИО,Фамилия+" ","")," ")-1);
Отчество = СтрЗаменить(СтрЗаменить(ФИО,Фамилия+" ",""),Имя+" ","");
Длина = 3;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Неправильно записано ФИО. Проверьте пробелы!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;

Если (Нрег(Прав(Отчество,1))="ч") Тогда
ТекПол = Перечисления.Пол.Муж;
ИначеЕсли (Нрег(Прав(Отчество,1))="а") Тогда
ТекПол = Перечисления.Пол.Жен;
КонецЕсли;

Если ТекПол = Перечисления.Пол.Муж Тогда
КонецФамилии = Прав(Фамилия,1);
Если Нрег(КонецФамилии)="е"
ИЛИ Нрег(КонецФамилии) = "и"
ИЛИ Нрег(КонецФамилии) = "о"
ИЛИ Нрег(КонецФамилии) = "у"
ИЛИ Нрег(КонецФамилии) = "э"
ИЛИ Нрег(КонецФамилии) = "ю"
Тогда
ФамилияПадеж = Фамилия;
ИначеЕсли Нрег(КонецФамилии) = "я" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
ИначеЕсли Нрег(КонецФамилии) = "а" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
ИначеЕсли Нрег(КонецФамилии) = "й"
ИЛИ Нрег(КонецФамилии) = "ь"
Тогда
Если Нрег(Прав(Фамилия,2)) = "ий"
ИЛИ Нрег(Прав(Фамилия,2)) = "ый"
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "ому";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "ю";
КонецЕсли
Иначе
Если Нрег(Прав(Фамилия,2)) = "ец" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "цу";
Иначе
ФамилияПадеж = Фамилия + "у";
КонецЕсли
КонецЕсли;

Если Имя = "Лев" Тогда
ИмяПадеж = "Льву";
ИначеЕсли Имя="Павел" Тогда
ИмяПадеж = "Павлу";
ИначеЕсли Имя = "Пётр" Тогда
ИмяПадеж = "Петру";
ИначеЕсли Нрег(Прав(Имя,1)) = "й"
ИЛИ Нрег(Прав(Имя,1)) = "ь"
Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "ю";
ИначеЕсли Нрег(Прав(Имя,1)) = "и" Тогда
ИмяПадеж = Имя;
ИначеЕсли Нрег(Прав(Имя,1)) = "а" Тогда
ИмяПадеж = Лев(Имя,СтрДлина(Имя)-1) + "е";
Иначе
ИмяПадеж = Имя + "у";
КонецЕсли;
ОтчествоПадеж = Отчество + "у";
ИначеЕсли ТекПол = Перечисления.Пол.Жен Тогда
КонецФамилии = Прав(Фамилия,1);

Если Нрег(КонецФамилии) = "а" Тогда
Если Нрег(Прав(Фамилия,3)) = "ова"
ИЛИ Нрег(Прав(Фамилия,3))="ева"
Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "ой";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
КонецЕсли
ИначеЕсли Нрег(КонецФамилии) = "я" Тогда
Если Нрег(Прав(Фамилия,2)) = "ая" Тогда
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-2) + "ой";
Иначе
ФамилияПадеж = Лев(Фамилия,СтрДлина(Фамилия)-1) + "е";
КонецЕсли
Иначе
ФамилияПадеж = Фамилия;
КонецЕсли;

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

Если Длина = 1 Тогда
ФИО_Падеж = "" + ФамилияПадеж;
ИначеЕсли Длина = 2 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = "" + ИмяПадеж + " " + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = "" + ФамилияПадеж + " " + Лев(ИмяПадеж,1) + ".";
ИначеЕсли ТипВывода = 3 Тогда
ФИО_Падеж = "" + Лев(ИмяПадеж,1) + "." + " " + ФамилияПадеж;
Иначе
ФИО_Падеж = "" + ФамилияПадеж + " " + ИмяПадеж;
КонецЕсли
ИначеЕсли Длина = 3 Тогда
Если ТипВывода = 1 Тогда
ФИО_Падеж = "" + ИмяПадеж + " " + ОтчествоПадеж + " " + ФамилияПадеж;
ИначеЕсли ТипВывода = 2 Тогда
ФИО_Падеж = "" + ФамилияПадеж + " " + Лев(ИмяПадеж,1) + "." + " " + Лев(ОтчествоПадеж,1) + ".";
ИначеЕсли ТипВывода=3 Тогда
ФИО_Падеж = "" + Лев(ИмяПадеж,1) + "." + " " + Лев(ОтчествоПадеж,1) + "." + " " + ФамилияПадеж;
Иначе
ФИО_Падеж = "" + ФамилияПадеж + " " + ИмяПадеж + " " + ОтчествоПадеж;
КонецЕсли
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Предупреждение! Это не ФИО. Проверьте!" + Символы.ПС + "(обДательныйПадежНаСервере)";
Сообщение.Сообщить();
КонецЕсли;
Возврат ФИО_Падеж;
КонецФункции
25. Денис Шарабоков (zShamaNz) 23.07.13 11:05
что за ошибка?

по причине:
При создании описания сервиса произошла ошибка.
по причине:
Ошибка доступа к файлу 'http://morpher.ru/WebService.asmx?WSDL'
по причине:
Ошибка работы с Интернет: Couldn't connect to server
26. Лингвист 24.07.13 21:24
Сервис был сегодня недоступен в течение нескольких часов. Пул приложений самопроизвольно перешел в состояние "остановлен". Причину сейчас выясняем с сотрудниками хостинга. Сейчас сервис работает.
27. Лингвист 24.07.13 21:28
У всего есть и положительная сторона. Ни одно отключение сервиса не проходит незамеченным - значит, сервис востребован :)
28. Павел Милицкис (militskis) 14.10.13 17:19
Опять сервис недоступен....503 ошибка
29. Лингвист 15.10.13 22:26
Да, таинственные зависания пула приложений продолжаются. Внешний мониторинг у меня настроен, но на этот раз я был в длительном перелете, поэтому не сразу среагировал. Ответы поддержки хостинга неутешительны. Причину зависания они не знают, предполагают, что превышение лимита оперативной памяти. С моей точки зрения это не повод вешать IIS, но у них другое мнение. Настроить автоматический перезапуск пула "нет технической возможности". Увеличил в 2 раза лимит оперативки за 3-кратное повышение цены за хостинг. Если не поможет, будем искать другого провайдера. Держу руку на пульсе, а пальцы крестиком.
30. Лингвист 03.11.13 12:12
Проблема решилась, хотя и ценой трехкратного повышения платы за хостинг. С тех пор самопроизвольные отключения сервиса прекратились. Пользуйтесь на здоровье.
31. rasswet (rasswet) 06.11.13 09:06
когда на сайте вашем нажимаю "продукты" падает в http://morpher.ru/Error404.aspx?aspxerrorpath=/install.aspx#products "Страница не найдена"

32. Лингвист 06.11.13 12:22
Да, я в курсе этой проблемы. Слетели настройки IIS и я не могу их поправить извне. Решаем сейчас эту проблему с сотрудниками хостинга. Веб-сервис работает нормально.
33. Лингвист 07.11.13 16:20
Работоспособность сайта полностью восстановлена.
34. Art Fa (artfa) 13.03.14 10:46
для денежных сумм не годится,
на
пропись = Морфер.Propis(235.45, "рубль");
Сообщить(пропись.n.И + " " + пропись.unit.И);
Сообщить("в размере " + пропись.n.Р + " " + пропись.unit.Р);

выдал: в размере двухсот тридцати пяти целых сорока пяти сотых рубля
35. Дмитрий Матвеев (dimkateo) 13.03.14 14:59
прикрутил к печати коммерческих предложений из торговой базы (УТ 10.3)... через десяток-другой выданных КП сервер морфера начинает подолгу обрабатывать запросы... иногда секунд по 10-15 приходится ждать... а на следующий день с утра - опять всё нормально.
36. Алексей Чибышев (Lexaero) 16.04.14 12:49
При использовании вот с таким определением:
ОпределениеМорфер=Новый WSОпределения("http://morfer.ru/WebService.asmx?WSDL");
Морфер=Новый WSПрокси(ОпределениеМорфер,"http://morfer.ru/","WebService","WebServiceSoap");


Вылетает: Ошибка при вызове конструктора (WSПрокси): Сервис не найден. {http://morpher.ru/}:WebService: Сервис не найден. {http://morpher.ru/}:WebService

Снова сервис недоступен?
З.Ы. Сайт доступен
37. Лингвист 16.04.14 13:47
Да, ошибку воспроизвел. Очень странно. Не работают только SOAP-клиенты, в т.ч. 1С. Разбираюсь.
38. Лингвист 16.04.14 14:21
Работоспособность восстановлена путем отката последних изменений. Сейчас выясняю, какое из них было причиной. Вероятно, добавление к проекту ссылки на библиотеку BotDetect.dll.
39. Лингвист 16.04.14 14:25
(36) Кстати, у вас в коде два раза фигурирует morfer.ru. Должно быть morpher.ru.
40. Алексей Чибышев (Lexaero) 17.04.14 10:25
(39) Лингвист, да, я пробовал по разным адресам подключиться, привел тестовый код. В ошибке выскакивает morpher.ru.
Спасибо за оперативное исправление! Замечательный сервис!
41. Андрей Слаута (Стил) 27.04.14 11:38
Не работает во внешней печатной форме на платформах выше 8.3.3.
Выдает ошибку
Новый WSОпределения("http://morpher.ru/WebService.asmx?WSDL") {(1)}: Ошибка при вызове конструктора (WSОпределения)
42. Лингвист 27.04.14 13:23
А еще какие-нибудь подробности есть в сообщении об ошибке? Код ошибки? Ошибка возникает каждый раз или непостоянно? К сожалению, у меня сейчас под рукой нет 8.3.3, а в 8.2 все работает нормально - только что проверил. Если нужна помощь, пишите в личку на contact@morpher.ru.
43. Андрей Слаута (Стил) 01.05.14 08:59
(42) Лингвист, Всё это рабочее. Не работает только в подключаемых внешних печатный формах на платформе 8.3 (кроме 8.3.1).
Новый WSОпределения("http://morpher.ru/WebService.asmx?WSDL") в этом случае выдает ошибку. Считаю это ошибкой платформы.
http://morpher.ru точно не причем
44. Лингвист 02.05.14 19:57
Посмотрите, не блокирует ли Windows Firewall новую версию 1С?
45. Андрей Слаута (Стил) 04.05.14 22:06
(44) Лингвист, тогда бы не работало везде, а не работает именно во внешних печатных формах
46. Игорь Фелькер (Brawler) 05.05.14 22:00
(43) Стил, ошибка не такая случаем?

Ошибка при вызове конструктора (WSОпределения)
	ОпределениеМорфер=Новый WSОпределения("http://morpher.ru/WebService.asmx?WSDL");
по причине:
Установлен безопасный режим. Выполнение операции запрещено
...Показать Скрыть


Лечится отменой безопасного режима, ну примерно так.

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.1.3.1");
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "0.1";
	ПараметрыРегистрации.БезопасныйРежим = Ложь; // ВОТ ТУТА!!!
	ПараметрыРегистрации.Наименование = ЭтотОбъект.Метаданные().Представление();
	ПараметрыРегистрации.Информация = "<...>";
    
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = ЭтотОбъект.Метаданные().Представление();
	НоваяКоманда.Идентификатор = "1";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	НоваяКоманда.ПоказыватьОповещение = Истина;
    
	Возврат ПараметрыРегистрации;
	
КонецФункции
...Показать Скрыть


Проверено вот это
&НаСервере
Процедура Команда1НаСервере()
	ОпределениеМорфер=Новый WSОпределения("http://morpher.ru/WebService.asmx?WSDL");
	Морфер=Новый WSПрокси(ОпределениеМорфер,"http://morpher.ru/","WebService","WebServiceSoap");
		
	результат = Морфер.GetXml("Генеральный директор");
		
	Сообщить("Родительный (кого?): " + результат.Р);
	Сообщить("Дательный   (кому?): " + результат.Д);
	Сообщить("Винительный (кого?): " + результат.В);
	Сообщить("Творительный (кем?): " + результат.Т);
	Сообщить("Предложный (о ком?): " + результат.П_о);
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры
...Показать Скрыть


Подтверждаю работоспособность на 8.3.5, на версиях ниже тестировать не хочется.
47. Андрей Слаута (Стил) 10.05.14 04:44
(46) Brawler, Ошибка эта, только у меня не указывается причина.
Ваш вариант не помог.
По вашему коду видно, что эти процедуры находятся в модуле формы. В модуле формы то как раз всё нормально. Везде всё нормально, когда код исполняется на сервере, кроме внешней печатной формы, где все процедуры находятся в модуле объекта и нет никаких вызовов с клиента.
Прилагаю обработки:
Договор - закомментировал всё, кроме WS, для проверки лишнее не нужно.
Тестирование ВПФ - с ее помощью можно протестировать код, не создавая форму в обработке "Договор". Именно так код отрабатывает, когда стандартными средствами подключаешь обработку к базе.

Как только в обработке тестирования выберете договор сразу же выскочит ошибка. Пройдясь отладчиком убедитесь, что код исполняется на сервере, но всё равно выдает ошибку.
48. Алексей Чибышев (Lexaero) 22.05.14 11:53
49. Лингвист 22.05.14 16:26
Да, запросов уже больше миллиона в неделю, ресурсы текущего хостинга похоже исчерпаны. Сейчас работоспособность восстановлена. Скоро займусь созданием альтернативного веб-сервиса для платных пользователей.
50. Лингвист 29.05.14 12:35
Веб-сервис скопирован на новый домен, morphapi.ru. Чтобы начать пользоваться этой копией веб-сервиса, замените в коде домен morpher.ru на morphapi.ru (только в первой строчке, во второй не надо):

	ОпределениеМорфер=Новый WSОпределения("http://morphapi.ru/WebService.asmx?WSDL");
	Морфер=Новый WSПрокси(ОпределениеМорфер,"http://morpher.ru/","WebService","WebServiceSoap");


Новый домен доступен всем пользователям, не только платным. Все учетные записи и приобретенные подписки продолжают действовать.

Какое-то время (порядка месяца) доступны будут оба сервиса и в случае падения одного можно будет переключаться на другой. После обкатки нового сервиса старый, возможно, закроется, о чем предупрежу дополнительно.
51. Александр Федоров (Sasha255n) 11.07.14 11:54
Скажите а в 8.1 заработает?
52. Александр Федоров (Sasha255n) 11.07.14 11:55
53. Лингвист 11.07.14 12:15
(52) Sasha255n, попробуйте, пожалуйста, если у вас 8.1 под рукой.
54. Алексей Атрощик (atroxa) 17.06.15 10:15
Вчера выявили что не работает Сервис не найден.{http://morpher.ru/}:WebService
Ошибка при вызове конструктора (WSПрокси)

В чём может быть причина?
55. Лингвист 20.06.15 12:21
(54) atroxa, за последнюю неделю аптайм сервиса составил 99.92%, за последний месяц - 99.81, как видно из статистики: http://morpher.ru/WebServices/Stats.aspx Т.е. есть вероятность (0,2%), что вы просто попали на период даунтайма. Обычно он длится не около получаса и работоспособность восстанавливается сама (какие-то неполадки на хостинге). Если ошибка все еще повторяется, приведите ваш код.
56. Алексей С (1Стажер) 10.09.15 19:00
57. Лингвист 10.09.15 23:50
58. Михаил _ (mikele_bes) 08.12.15 15:07
сервис хорош, спасибо

p.s.:
попробуйте просклонять Уборщица Онищук Света
59. Лингвист 09.12.15 02:06
(58) mikele_bes, должности и ФИО нужно склонять отдельно, как сказано в разделе "Ограничения".
60. Михаил Андропов (daMaster) 10.12.15 15:40
опять не работает ваш сервис, причем уже долго ((
61. Лингвист 11.12.15 01:13
А как именно не работает? Что выдает? В логах мониторинга за последние сутки сбоев не зарегистрировано.
63. Алексей Чибышев (Lexaero) 08.02.16 13:49
А как сейчас обстоят дела с сервисом? живой?
64. Алексей Чибышев (Lexaero) 08.02.16 14:13
Ошибка при вызове метода контекста (GetXml): Ошибка вызова операции сервиса: {http://morpher.ru/}:WebService:GetXml(): Ошибка SOAP сервера: Server was unable to process request. ---> Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> The wait operation timed out
65. Лингвист 09.02.16 01:10
Живой. Сегодня штормило его, правда. Но теперь все в порядке.
66. Дмитрий Шмидт (e2_shmidt) 12.02.16 00:30
(65) Лингвист, Подскажите, что в Ваших словах значит "штормило"? Я сейчас с этим сервисом работаю. Возникли вопросы. Вообще, обращение к веб-сервису встроено в последние релизы 1С:Документооборот КОРП 2.0, но я оттуда переносил его в более ранний релиз. И получается так, что я сижу, вечером или ночью тестирую - всё работает. Прихожу к заказчику показывать - вылетает ошибка из сообщения 64. Весьма непрезентабельно. Это и есть "штормило"? Это временное явление? Просто неудачное время выбрал для показа, наверное.
Если кому интересно, то в том же ДО КОРП 2.0 есть классный механизм. Когда с сервиса получается структура склонения, то, если склоняются наименования объектов, то вся структура сразу сохраняется в регистр и потом уже тянется из регистра. Актуально для пользователей, физ.лиц, должностей и контактных лиц. Но вот как раз проблема в дневное время возникала при склонении должностей контактных лиц, а это просто строковые поля. Поэтому шло обращение и возникала ошибка. Сделал должность в Контактных лицах тоже ссылкой на справочник Должности, тогда и по этому полю достаточно будет всего один раз просклонять. Даже думал сделать такой запрос при создании объекта, а не когда идет подготовка важного документа в оперативном режиме.
Лингвист, подскажите, насколько эта ошибка серьезна? Стоит ли приобретать отдельную библиотеку для 1С?
Хотя, версия с прописью числительных довольно дорого стоит, поэтому придется, в любом случае, сервисом пользоваться. По прописи числительных тоже такие косяки в рабочее время возникают? Хотелось бы узнать, насколько стабильно работает.
67. Антон Паскаль (platon_) 16.08.16 16:25
68. Артём Артёмов (TeMochkiN) 21.09.16 13:55
Жаль, что определение рода по ФИО недоступно в бесплатном режиме. Мне только этот функционал и нужен был.
69. Михаил Андропов (daMaster) 19.10.16 12:54
(68) TeMochkiN, определение рода по ФИО есть в моем бесплатном алгоритме
http://infostart.ru/public/330103/