Кстати, вот и он -> oproxy
Оглавление:
- Что это такое и почему вам это нужно
- Небольшой экскурс в историю
- Краткая инструкция по установке и использованию
- Рассказ для гиков на тему, как это работает
- Эпилог
Что это такое и почему вам это нужно
Копия текста из предыдущей статьи:
Во всех командах разработки рано или поздно возникает потребность привязки изменений кода к номерам задач. В итоге команды приходят к решению в виде комментариев в хранилище 1С. Но часто ли разработчики соблюдают это правило? Также может срабатывать человеческий фактор: можно ошибиться буквой, цифрой, задачей, ее статусом, исполнителем, системой, местом работы. Приходится перевыкладывать хранилище через gitsync, переделывать связи, тратить лишнее время и силы.
Плюс есть, например у меня, потребность начать синхронизацию с git-репозиторием по факту помещения очередной версии в хранилище. Прилепим вызов синхронизации? Запросто!
Появилась еще одна возможность встроиться в механизм транспорта между конфигуратором и хранилищем 1С, а по пути проверять комментарии, вызывать сторонние сервисы и делать прочие полезности. И все это на знакомом нам, одинэсникам, языке программирования и веб-сервере.
Небольшой экскурс в историю
Ранее была статья Прокси хранилища 1С (IIS, OneScript)
Там прокси встраивался в общение конфигуратора и хранилища по HTTP. Оно работало на маленьких конфигурациях, а на больших не работало. Не работало потому что IIS не мог поместить в память больше 4ГБ данных (а такое могло быть на Бухгалтерии или ERP). Догадливые разработчики возразят "А как же тогда нативная HTTP публикация работает с хранилищем?". Мой ответ: в используемом решении HTTP-сервисов OneScript, как сказали в комментариях к статье старожилы односкрипта, все устарело и не поддерживается. Каждый HTTP запрос получается целиком и полностью, а запрос конфигуратора может быть очень большим. Бить на порции не получилось бы.
Пришлось бы дорабатывать OneScript или писать свой веб-сервер на нем, а я не умею.
Краткая инструкция
Буквально 2 экрана (я старался)
Кстати еще подробное и актуальное описание есть в ридми на гитхабе.
Это библиотека (программа, консольное приложение), работающая и написанная на OneScript, которая позволяет встроиться между конфигуратором 1С и TCP хранилищем конфигураций 1С (crserver.exe) с целью контроля изменения хранилища. Вы ее можете запустить на своем сервере и пользоваться, это очень просто. Находясь между конфигуратором и хранилищем, она принимает запросы от конфигуратора и передает их в хранилище, ответы хранилища отдает обратно конфигуратору. Но для определенных действий с хранилищем (помещение объектов в хранилище и изменение версии хранилища) она дает возможность проанализировать комментарий, имя базы, имя пользователя, версию платформы и прочее и принять решение: помещать или не помещать, изменять или не изменять. Если решение будет отрицательным, может отправить ошибку с текстом, который вы составите. Например:
И все такие свои проверки вы можете делать прямо на языке 1С в файле *.os (OneScript). Если вы не умеете программировать на 1С/OneScript - научитесь попросите знакомого 1Сника в вашей конторе, он поможет. Это легко, доступно и дешево.
Быстрый старт
0. Очень рекомендую запускать прокси на том же сервере, где запущен сервер хранилища. Это вам поможет избежать просадок по дополнительным сетевым затратам.
1. Установите OneScript
2. Зайдите в командную строку (cmd.exe) под администратором
3. Введите opm install oproxy, прокси сервер установится со всеми необходимыми зависимостями
4. Выберите папку, в которой прокси создаст шаблон файла проверок. Там будет 2 функции с описанием что можно делать. Пусть это будет например (например!) каталог D:\oproxy_cat. Создайте его и перейдите в командной строке в этот каталог (cd /D D:\oproxy_cat).
5. Введите в командной строке oproxy init
6. Отлично, у вас в этой папке (D:\oproxy_cat) появился файл ПроверкиПроксиСервера.os с двумя функциями, в которых вы можете писать свои проверки
5. Тут надо понять какой порт выбрать для прокси. Например (например!) вы подключаетесь к хранилищу из конфигуратора по строке tcp://myserver.local:1544/My_Baza. Раз у вас открыт порт 1544, откройте на сервере порт 2544
6. Пишем в командной строке oproxy create-daemon --proxy-port 2544 --storage-server myserver.local --storage-port 1544 --check-file D:\oproxy-cat\ПроверкиПроксиСервера.os
Создастся служба Windows с нашим дорогим прокси хранилища. Можете заходить в файл D:\oproxy-cat\ПроверкиПроксиСервера.os и писать свои проверки. Например:
В файле проверок всегда обязательно должны присутствовать 2 экспортные функции с теми именами, как были при инициализации.
ПараметрыЗапроса - это структура, в которой всегда есть поля:
ИмяСистемы - Строка - название хранилища в нижнем регистре. Название такое же, как при подключении конфигуратора к хранилищу. Например для подключения tcp://server.local:1544/BAZA ИмяСистемы будет baza
ИмяМетода - Строка - DevDepot_commitObjects (для помещения в хранилище) или DevDepot_changeVersion (для изменения версии хранилища)
ВерсияПлатформы - Строка - версия платформы, с которой обращается конфигуратор, например 8.3.22.2143
Комментарий - Строка - текст, который пользователь указал при помещении или изменении версии хранилища в поле "Комментарий" (может быть пустым, даже если комментарий не был изменен)
Проверять - Булево - всегда Истина (ну вот так)
ИмяПользователя - Строка - имя пользователя хранилища, под которым произошло обращение. В том регистре, в котором указано в настройках хранилища.
7. Все! Подключайтесь например (например!) по пути tcp://myserver.local:2544/My_Baza (с новым портом уже, который теперь порт прокси) и кодите как обычно в конфигураторе. Проверочки будут работать. Разработчик захочет написать пустой коммент, а вам надо было 5 циферок или задачу Jira? Нет проблем! Регулярные выражения OneScript вам помогут. Хотите запустить синхронизацию gitsync сразу по факту помещения в хранилище? Да без проблем. Пишите все что хотите в файлик с проверками, он все стерпит.
Конфигуратор может ждать ответа бесконечно долго. Но если у вас прокси-сервер будет работать с большими ожиданиями, то это уже можно расценить как преступление средней тяжести.
Рассказ для гиков на тему, как это работает
Внимание! Может быть неинтересным, скучным и, самое страшное - вызвать привыкание!
Работает, во-первых, с помощью желудей (авторам спасибо!). И это не самая тяжелая наркомания в разработке, которую можно увидеть.
Вопрос №3: и как же это работает?
Ответ: запускается TCP-сервер, слушающий порт. К нему начинает обращаться очередной конфигуратор с очередным новым соединением. Как только новое соединение появилось, оно отдается в отдельный поток (фоновое задание) и тут же начинается ожидание нового соединения:
Особенности заключаются в сигнатурах, которыми конфигуратор и хранилище обозначают приветствия, конец сообщения, как конфигуратор пингует хранилище (понятия не имею зачем) и т.д.
Весь сок на эту тему собран в модуле ОбработкаДанных.os
Например установка соединения происходит неким рукопожатием:
То есть конфигуратору сначала посылается ответ, будто это ему ответило хранилище, потом происходит вычитка пустых двоичных данных из конфигуратора, потом вычитка пустых двоичных данных из хранилища. Соединение с хранилищем установлено.
Потом нужно начинать вычитывать данные, которые отправляет конфигуратор, и все эти пакеты последовательно отправлять в хранилище. При этом стоит учесть, что нам самим запрос может не понравиться (ОбработатьПроверяемыйЗапрос) и мы не заходим посылать его в хранилище, а вместо этого предпочтем отдать свой ответ в конфигуратор:
Теперь нужно вычитать ответ хранилища и отдать его, это куда проще:
В последних двух функциях вы увидели возможно странные понятия пинга и конца сообщения.
Конфигуратор в некоторые моменты может держать соединение активным, при этом не передавая данных. По каким-то причинам в такие моменты он посылает одну и ту же сигнатуру хранилищу, а хранилище на это отвечает пустыми двоичными данными.
При этом мы с конфигуратором можем не совпасть по времени. Пока наш код занимался другими делами, конфигуратор мог успеть отправить в сокет несколько пингов. Поэтому функция должна определять как пинг данные 214754B3 и данные 214754B3214754B3214754B3 (3 раза) и данные 214754B3214754B3214754B3214754B3214754B3 (5 раз).
Что делать когда пришел пинг? Ничего!) Отдать в конфигуратор пустые двоичные данные, пусть думает что все хорошо.
Определение конца сообщения получается таким:
Здесь определяется, что в самом конце TCP пакета содержится сигнатура 6653B2A6. Если она есть, значит конфигуратор отдал все что хотел и теперь ожидает ответа от хранилища.
Все остальное - точно так же, как в HTTP. Конфигуратор формирует одинаковые запросы и для HTTP и для TCP. Мало того, в tcp-пакетах даже содержатся HTTP-заголовки. Так же берется XML запроса, так же разбирается на параметры, так же ищется необходимая информация. Просто теперь все это упаковано в более-менее удобную модель, плюс поддерживает большие конфигурации и не падает по памяти. Потенциально можно заставить прокси принимать от конфигуратора HTTP запросы в TCP соединение, немного сконвертировать переводы строк и отправлять по частям такие запросы в хранилище. Кстати, на это даже уже заготовлен ишуз.
Эпилог
Протестировано на Windows Server с 1С 8.3.22.2143 и OneScript 1.8.4.5. Потребление ОЗУ ~50-100 МБ, иногда может вырастать чуть больше на тяжелых операциях, но вскоре сборщик мусора эту память освободит. ERP и бухгалтерия работают с той же скоростью, как и напрямую по tcp. Проверено создание хранилища, подключение, отключение, сравнение версий в разных вариациях, выгрузка файла CF из версии хранилища, захват и помещение объектов конфигурации, в том числе и глобальные, и прочее-прочее-прочее...
Про Linux и MacOS не знаю - буду рад отзывам!
Благодарю всех контрибьюторов OneScript, oscript-library и autumn-library, без вас бы ничего этого не получилось.
Кто установил прокси и пользуется - спасибо!
Кто нашел ошибку и сообщил о ней в ишузы - двойное спасибо!
Кто еще и исправил ошибку - тройное спасибо, крепкое дружеское рукопожатие и одобрительное похлопывание по плечу с улыбкой :)
Если захотите дополнить тесты - упаду в обморок от счастья.
Благодарю за прочтение статьи. Буду рад общению в комментариях.