Опять склонения

05.04.18

Разработка - Инструментарий разработчика

Создание простого http-сервиса для склонения подразделений и должностей

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

Наименование Файл Версия Размер
Обработка
.epf 7,96Kb
0
.epf 7,96Kb Скачать
Скрипт
.py 2,47Kb
0
.py 2,47Kb Скачать

Ни для кого не секрет, что 1С склонять не умеет. Тем не менее, многие пытаются ее заставить это сделать с помощью внешних компонент, сторонних библиотек и написания собственных функций.

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

 Моей радости не было предела, когда я нашел библиотеку padeg.dll, но радость была недолгой, потому что после некоторого времени работы она намертво вешала сервер. Причину выяснить не удалось, поэтому пришлось от нее отказаться. Поиски продолжились.

Коллега шарпист подсказал библиотеку pymorphy2, написанную на python, и это больно, т.к. из скрипта dll не сделаешь. Сделали из него приложение с помощью py2exe, но пользоваться этим было мучительно.

Вся эта история кончилась тем, что мы купили-таки morpher и встроили его в конфигурацию, но руки продолжали чесаться, и я решил сделать локальный сервер склонения, благо, что в python уже встроен CGI-сервер. К нему удобнее обращаться и получать результат, да и небольшое изучение python не повредит.

Итак, потребовалась установка python 3.5 на сервер 1С. Процесс установки рассказывать не буду, это выходит за рамки статьи, да и материала в сети хватает. При установке проследите, чтобы была установлена галочка, добавляющая путь к python в переменную окружения PATH.

Далее, установим pymorphy2. Для этого необходимо запустить командную строку и выполнить следующую команду:

> pip install pymorphy2

Теперь напишем скрипт, запускающий сервер, принимающий параметры и возвращающий результат:

# Подключение необходимых модулей
import pymorphy2
from http.server import BaseHTTPRequestHandler, HTTPServer
import json

# Обработчики запросов
class HttpProcessor(BaseHTTPRequestHandler):
    def do_POST(self):

        result = list() # Сюда будет записываться результат
        # Чтение и разбор параметров
        postVars = self.rfile.read(int(self.headers['Content-Length']))
        parametrs = json.loads(postVars.decode())
        # Параметры - два массива, первый с данными, второй со значениями падежей
        data = parametrs.get('data')
        case = parametrs.get('case')
        # Склонение фраз
        i = 0
        while i < len(data):
            subres = ''
            for word in data[i].split():
                resword = morph.parse(word)[0]
                # Склоняем только то, что стоит в именительном или винительном падеже,
                # иначе библиотека все слова просклоняет и получится ерунда
                if case[i] == '' or not ('nomn' in resword.tag or 'accs' in resword.tag) or 'plur' in resword.tag:
                    subres += ' ' + word
                else:
                    # Попытка вернуть слова к тому регистру, в котором они изначально были
                    if word.isupper():
                        currentword = resword.inflect({'sing', case[i]}).word.upper()
                    elif word[0].isupper():
                        currentword = resword.inflect({'sing', case[i]}).word.capitalize()
                    else:
                        currentword = resword.inflect({'sing', case[i]}).word
                    subres += ' ' + currentword
            result.append(subres.lstrip())
            i += 1
        # Формирование и возврат результата
        self.send_response(200)
        self.send_header('content-type', 'text/html')
        self.end_headers()
        self.wfile.write(json.dumps(result, ensure_ascii=False).encode())

# Инициализация pymorphy2
morph = pymorphy2.MorphAnalyzer()

# Инициализация и старт сервера
serv = HTTPServer(('localhost', 8080), HttpProcessor)
serv.serve_forever()

Это всего лишь упрощенный пример, в котором не обрабатываются ситуации передачи некорретных данных в качестве параметров. По коду видно, что сервер слушает порт 8080, и используется метод POST. К нему и будем подключаться. Код подключения:

&НаСервере
Процедура ПросклонятьНаСервере()
	
	Соединение = Новый HTTPСоединение("localhost",8080);
	Запрос = Новый HTTPЗапрос("/");
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.ПроверятьСтруктуру = Ложь;
	ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON);
	
	ЗаписьJSON.ЗаписатьНачалоОбъекта();
	ЗаписьJSON.ЗаписатьИмяСвойства("data");
	ЗаписьJSON.ЗаписатьНачалоМассива();
	Для Каждого Стр Из ИсходныеДанные Цикл
		ЗаписьJSON.ЗаписатьЗначение(Стр.ИсходнаяСтрока);
	КонецЦикла;
	ЗаписьJSON.ЗаписатьКонецМассива();
	
	ЗаписьJSON.ЗаписатьИмяСвойства("case");
	ЗаписьJSON.ЗаписатьНачалоМассива();
	Для Каждого Стр Из ИсходныеДанные Цикл
		ЗаписьJSON.ЗаписатьЗначение(Стр.Падеж);
	КонецЦикла;
	ЗаписьJSON.ЗаписатьКонецМассива();
	ЗаписьJSON.ЗаписатьКонецОбъекта();
	Запрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
	
	РезультатЗапросаКСервису = Неопределено;
	Попытка
		РезультатЗапросаКСервису = Соединение.ОтправитьДляОбработки(Запрос);
	Исключение
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Не удалось выполнить склонение с помощью сервиса..'"));
		Для Каждого Стр Из ИсходныеДанные Цикл
			Стр.РезультатСклонения = "";
		КонецЦикла;
		Возврат;
	КонецПопытки;
	
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(РезультатЗапросаКСервису.ПолучитьТелоКакСтроку("UTF-8"));
	
	РезультатЧтения = ПрочитатьJSON(Чтение);
	Если ТипЗнч(РезультатЧтения) = Тип("Массив") Тогда
		Сч = 0;
		Для Каждого Эл Из РезультатЧтения Цикл
			ИсходныеДанные[Сч].РезультатСклонения = Эл;
			Сч = Сч + 1;
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

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

nomn именительный Кто? Что? хомяк ест
gent родительный Кого? Чего? у нас нет хомяка
datv дательный Кому? Чему? сказать хомяку спасибо
accs винительный Кого? Что? хомяк читает книгу
ablt творительный Кем? Чем? зерно съедено хомяком
loct предложный О ком? О чём? и т.п. хомяка несут в корзинке
voct звательный Его формы используются при обращении к человеку. Саш, пойдем в кино.
gen2 второй родительный (частичный)   ложка сахару (gent - производство сахара); стакан яду (gent - нет яда)
acc2 второй винительный   записался в солдаты
loc2 второй предложный (местный)   я у него в долгу (loct - напоминать о долге); висит в шкафу (loct - монолог о шкафе); весь в снегу (loct - писать о снеге)

Следующий шаг - запуск сервера командой:

> py "<Путь к файлу>\morph.py"

Предванительно необходимо добавить путь к интерпретатору python в переменную окружения PATH, если это не было сделано при установке, и сохранить текст скрипта в файл 'morph.py' на диск.

Все, теперь можно обращаться к сервису и смотреть результат.

При использовании сервиса в печатных формах идея алгоритма следующая:

  1. Получить из системы данные для заполнения печатной формы.
  2. Сформировать массив из тех строк, которые необходимо просклонять.
  3. Сформировать массив такой же длины с указанием падежей, к которым необходимо привести строки.
  4. Преобразовать массивы в JSON вида:
    {
        "data": ["str1",...,"strN"],
        "case": ["case1",...,"caseN"]
    }

     

  5. Отправить полученную строку на сервер.
  6. Получить и обработать результат работы сервера (массив в формате JSON)

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

Была написана небольшая обработка, демонстрирующая работу с сервисом, которую приложил в файлы, как и скрипт (жаль, не получается выложить их бесплатно, буду благодарен, если кто-нибудь подскажет как это сделать). Проверял ее в ERP 2. Возможно, заработает в ЗУП 3.0. Если не использовать автоазполнение, то будет работать в типовых конфигурациях на БСП. Результат работы обработки на скриншоте в начале статьи.

На этом все. Хочется сказать огромное спасибо автору библиотеки pymorphy2. Это мощнейший инструмент, на который автор не пожалел своего собственного времени и сил, и который теперь обычные смертные могут использовать совершенно безвозмездно.

pymorphy2 http-сервис интеграция склонения

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122171    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 15300 руб.

06.10.2023    7294    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3541    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177753    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99347    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18116    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28110    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23604    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. pallid 270 04.01.17 16:08 Сейчас в теме
Класс, как раз недавно искал альтернативу morpherу без интернета.
2. pallid 270 04.01.17 16:10 Сейчас в теме

жаль, не получается выложить их бесплатно, буду благодарен, если кто-нибудь подскажет как это сделать,

github, bitbucket
3. ice-net 19 04.01.17 17:03 Сейчас в теме
жаль, не получается выложить их бесплатно, буду благодарен, если кто-нибудь подскажет как это сделать,


можешь еще файлом в комментарий прикрепить, яндекс/гугл диск и тд..
корум; +1 Ответить
4. unmensch 24 04.01.17 17:22 Сейчас в теме
(3) Архив с обработкой и скриптом
Прикрепленные файлы:
Склонения.zip
5. BigClock 09.01.17 10:59 Сейчас в теме
Перед новым годом делал несколько проектов, где требовалось склонение ФИО.
Использовал daСклонение: http://infostart.ru/public/330103/
Результатом доволен, необходимость ручной корректировки возникает редко.
daMaster; Automatik; +2 Ответить
6. pallid 270 07.02.17 18:23 Сейчас в теме
(5) а какой результат склонения "Заместитель директора" в дательном падеже? У pymorphy2 результат "Заместителю директору"
https://github.com/kmike/pymorphy2/issues/87
7. unmensch 24 08.02.17 07:03 Сейчас в теме
(6) Спасибо за замечание. Слово "директора" pymorphy2 определил как слово во множественном числе. Исправил багу в скрипте.
8. pallid 270 08.02.17 12:49 Сейчас в теме
9. BigClock 13.02.17 15:51 Сейчас в теме
(6)
Должность = daСклонение("Заместитель директора", "Д", , "Д");

Результат - "Заместителю директора".
У этой функции есть режим склонения профессий. Для получения корректного результата необходимо четвертым параметром передавать "Д".
japopov; pallid; +2 Ответить
10. ltfriend 954 14.02.17 11:40 Сейчас в теме
Позанудствую немного.
1. Почему ответ сервиса строка JSON, а устанавливается заголовок Content-Type - "text/html"?
2. ИМХО, сервису логичней передавать не 2 массива, а 1 массив с объектами JSON типа:
[{"data": "str1", "case": "case1"},...,{"data": "strN", "case": "caseN"}]
В вашей реализации, что будет, если передать массив слов и падежей разной длины (т.е., например, 5 слов и 4 падежа)?
3. И почему сервис доступен только на сервере 1С? Что мешает вызвать его с другого компьютера локальной сети по адресу "http://<ip_адрес_сервера>:8080/ ?
11. japopov 68 14.02.17 12:01 Сейчас в теме
(10)
И почему сервис доступен только на сервере 1С?

сравните с этим:
Это всего лишь упрощенный пример, в котором не обрабатываются ситуации передачи некорретных данных в качестве параметров.


Я бы сказал, этому хозяйству ещё правила в iptables нужны, дабы ТОЛЬКО с localhost подключалось!
12. unmensch 24 14.02.17 12:09 Сейчас в теме
(10)
1. "И так сойдет" © )). Конечно же вы правы. Это ошибка, хотя все равно работает.
2. Логичнее, но так нужно передавать больше символов. Если передать массивы разной длины, то все сломается, т.к. передача некорректных параметров в скрипте не обрабатывается. Демонстрируется сам принцип.
3. Можно, но я не запускал и не проверял, будет ли работать также.
Оставьте свое сообщение