TCP прокси-сервер хранилища конфигурации 1С

17.01.24

Разработка - DevOps и автоматизация разработки

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

Кстати, вот и он -> oproxy

Оглавление:

  1. Что это такое и почему вам это нужно
  2. Небольшой экскурс в историю
  3. Краткая инструкция по установке и использованию
  4. Рассказ для гиков на тему, как это работает
  5. Эпилог

 

Что это такое и почему вам это нужно

Копия текста из предыдущей статьи:

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

Плюс есть, например у меня, потребность начать синхронизацию с git-репозиторием по факту помещения очередной версии в хранилище. Прилепим вызов синхронизации? Запросто!

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

 

Небольшой экскурс в историю

Ранее была статья Прокси хранилища 1С (IIS, OneScript)

Там прокси встраивался в общение конфигуратора и хранилища по HTTP. Оно работало на маленьких конфигурациях, а на больших не работало. Не работало потому что IIS не мог поместить в память больше 4ГБ данных (а такое могло быть на Бухгалтерии или ERP). Догадливые разработчики возразят "А как же тогда нативная HTTP публикация работает с хранилищем?". Мой ответ: в используемом решении HTTP-сервисов OneScript, как сказали в комментариях к статье старожилы односкрипта, все устарело и не поддерживается. Каждый HTTP запрос получается целиком и полностью, а запрос конфигуратора может быть очень большим. Бить на порции не получилось бы.

Пришлось бы дорабатывать OneScript или писать свой веб-сервер на нем, а я не умею.

 
 В C# в смысле не умею.

 

Краткая инструкция

Буквально 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
Комментарий - Строка - текст, который пользователь указал при помещении или изменении версии хранилища в поле "Комментарий" (может быть пустым, даже если комментарий не был изменен)
Проверять - Булево - всегда Истина (ну вот так)
ИмяПользователя - Строка - имя пользователя хранилища, под которым произошло обращение. В том регистре, в котором указано в настройках хранилища.

 
 Для тех, у кого не Windows

7. Все! Подключайтесь например (например!) по пути tcp://myserver.local:2544/My_Baza (с новым портом уже, который теперь порт прокси) и кодите как обычно в конфигураторе. Проверочки будут работать. Разработчик захочет написать пустой коммент, а вам надо было 5 циферок или задачу Jira? Нет проблем! Регулярные выражения OneScript вам помогут. Хотите запустить синхронизацию gitsync сразу по факту помещения в хранилище? Да без проблем. Пишите все что хотите в файлик с проверками, он все стерпит.

Конфигуратор может ждать ответа бесконечно долго. Но если у вас прокси-сервер будет работать с большими ожиданиями, то это уже можно расценить как преступление средней тяжести.

 

Рассказ для гиков на тему, как это работает

Внимание! Может быть неинтересным, скучным и, самое страшное - вызвать привыкание!

Работает, во-первых, с помощью желудей (авторам спасибо!). И это не самая тяжелая наркомания в разработке, которую можно увидеть.

 
 Вопрос №1: как удалось понять как общается конфигуратор и хранилище по tcp?
 
 Вопрос №2: и долго мучился?

 

Вопрос №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, без вас бы ничего этого не получилось.

Кто установил прокси и пользуется - спасибо!

Кто нашел ошибку и сообщил о ней в ишузы - двойное спасибо!

Кто еще и исправил ошибку - тройное спасибо, крепкое дружеское рукопожатие и одобрительное похлопывание по плечу с улыбкой :)

Если захотите дополнить тесты - упаду в обморок от счастья.

 

Благодарю за прочтение статьи. Буду рад общению в комментариях.

См. также

Автотесты для типовых конфигураций ERP Управление предприятием 2 и Комплексная автоматизация 2 (для vanessa automation)

Тестирование QA DevOps и автоматизация разработки Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.15.111.

2220 руб.

04.07.2022    6990    26    1    

24

Системы контроля версий для 1С-разработчиков.

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Платформа 1С v8.3 Платные (руб)

Основы командной разработки на 1С. Использование систем контроля версий при разработке на платформе 1С:Предприятие 8

4900 руб.

29.06.2022    9471    78    4    

112

Управление сборкой. Расширение для конфигурации СППР

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

Подсистема «Управление сборкой GLI» предназначена для динамического формирования сборочных линий Gitlab и отслеживания процесса доработок систем на базе1С:Предприятия Позволяет упростить выпуск новых релизов системы, подготовить описание доработок системы. Интегрируется с GitLab API по событиям Push, Merge-request, Pipeline. Уведомляет пользователей о результатах сборки/тестирования сборочных конвейеров через СВ, либо при её недоступности или отсутствию по E-Mail. Поможет при отправке исправлений ошибок в общую базу тестирования, сформирует запросы на слияние в ветку версии только по протестированному и подтверждённому функционалу. Подсистема рассчитана исключительно на клиент - серверную архитектуру тестовых ИБ. Поддерживаемая версии СППР 2.0.4.15, платформа не ниже 8.3.17.1549, 2.0.7.3 / не ниже 8.3.21.1664, начиная с релиза 1.0.4.30 требуется платформа не ниже 8.3.23 рекомендуемый релиз 8.3.23.1997

7000 руб.

26.08.2022    10844    7    5    

30

Автоматическое подтверждение легальности обновления базы или как обновить 100 типовых баз 1С за 5 часов

DevOps и автоматизация разработки Обновление 1С Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Расширение для конфигураций 1С для автоматического подтверждения легальности обновления и выполнения обработчиков обновления при пакетном автоматическом обновлении большого числа баз 1С. А также сам модуль обработки по автоматическому обновлению баз.

2 стартмани

08.05.2019    24498    56    VPanin56    26    

28

Обновляемый список последних статей Инфостарт для профиля Github

Групповая разработка (Git, хранилище) Бесплатно (free)

Не знаете, чем бы таким заполнить свой профиль Github? Заполните его своими статьями на Инфостарт! Этот простой workflow сам соберет список ваших последних статей и будет периодически обновлять его для актуализации данных.

08.04.2024    947    bayselonarrend    2    

31

Процесс разработки с использованием GIT и расширений для 1С:ERP. Без EDT

Групповая разработка (Git, хранилище) Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Доработки 1С:ERP на крупных проектах можно организовать, не внося изменения в саму типовую конфигурацию, а используя только расширения и отдельные «микроконфигурации». Расскажем о том, как это сделать без EDT, используя процесс разработки GitHub Flow.

02.04.2024    5034    Begemoth80    24    

45

Особенности национального Workflow: Github Actions и OneScript

Групповая разработка (Git, хранилище) OneScript Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    1619    bayselonarrend    3    

38

Автоматизация процесса разработки с помощью сервиса GitFlic

Групповая разработка (Git, хранилище) Бесплатно (free)

GitFlic – первая в России полностью самостоятельная реализация сервиса для хранения репозиториев с исходным кодом. За три года разработки сервис GitFlic стал полноценным инструментом, которым можно заменить GitLab, GitHub и BitBucket. Расскажем о том, как выстроить в GitFlic процесс автоматического тестирования, статического анализа кода и сборки приложений.

05.03.2024    2135    user1989937    6    

16
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1530 17.01.24 13:18 Сейчас в теме
Отличная работа, большое спасибо!

хочется заюзать для нашей типовой конфигурации, работающей через хранилище.
Serg O.; ardn; kamisov; +3 Ответить
2. artbear 1530 17.01.24 13:20 Сейчас в теме
За автотесты отдельное большое спасибо!
Serg O.; kamisov; +2 Ответить
3. artbear 1530 17.01.24 13:21 Сейчас в теме
Мелкая опечатка - и долго муился?
4. kamisov 153 17.01.24 13:55 Сейчас в теме
5. user612295_death4321 17.01.24 19:17 Сейчас в теме
Мужик, если это действительно работает, то я просто снимаю шляпу перед тобой. В моей команде это очень актуальный инструмент (мы уже на придумывали разных сценариев как использовать прокси).

Мой путь:

1. Началось все с великого open-resty (т.к. он был гораздо раньше описанной штуки на IISe + OScript). Т.к. работаем с большими конфигурациями, на первых же ERP начались приколы. Раскопали, что это великолепная связка NGINX + LUA тоже имеет фундаментальные ограничение на размер HTTP запроса, после чего оно падает в ошибку. Причем что мы только не делали, каких только иностранных форумов с ироглефами не перечитали, мы даже пробовали пересобрать этот open-resty из исходников с какими то особенностями (которые вычитали на этих же форумах), но ничего не произошло, я в печали, сидели с моим инженером до 5 утра)

2. Дальше выходит инструмент описанный в статье. Я думаю УРА! Теперь мы это запустим на родном OSript'e! Запустили, что-то даже заработало, но начались разного рода сложности в эксплуатации и в стабильности. Помню что были приколы с URL rewrite и стабильностью веб-сервера в принципе. Ни в коем случае не является камнем в огород этого решения, возьмем за константу, что мы криворукие и не смогли настроить. (к слову у меня огромнейший парк хранилищ конфигурации, с разными версиями начиная от 8.3.9).

3. И наступил новый шаг (на котором я сейчас нахожусь). Я не помню, как я до этого дошел, но мне захотелось написать свой веб-сервер, который стабильный и прост в эксплуатации, не имеет явных фундаментальных ограничений и чтоб он разворачивался "на изи" и работал как из коробки максимально просто. Почему-то на тот момент я решил выбрать golang. Оказалось, что написать веб-сервер на go, это пару строк кода и вообще весь мой реверс-прокси получился порядка 100 строк кода (это уже с фичами). Отдал своим SRE-инженерам, они тут же обернули это в свои службы, YAML и тому подобное - Вот я думаю, наступило счастье! Теперь мы заживем! Все работает стабильно, шустро, есть пить не просит, мое спокойствие наступило... НО НЕТ!!! Мы обновляем очередной релиз отраслевой ERP и конфигурация становится настолько большой, что она в принципе нативно теперь не работает с веб-сервером IIS, не важно с моим реверс-прокси или без, я столкнулся ровно с тем же ограничением о котором пишет автор в 4 ГБ памяти (свой гражданский долг я выполнил, через РКЛ мы оформили тикет в 1С, но сомневаюсь что будет там счастье).

Я все задумывался, а найдется ли какой ни будь мозговитый инженер, который бы осилил реверс прокси TCP..., да чтоб со всеми версиями 1С. В общем я попробую на досуге этот инструмент, как будто это лучшая новость января, у меня очень сильно поднялось настроение!
JohnyDeath; NikitaIvanchenko; kamisov; +3 Ответить
9. kamisov 153 17.01.24 21:06 Сейчас в теме
(5) жду обратной связи. Очень интересно как и где упадет. Я мучил этот прокси несколькими ERP одновременно - не положил. Даже память не очень поднялась.
13. kamisov 153 18.01.24 00:29 Сейчас в теме
(5) только если у вас конфигурация не будет работать даже напрямую по TCP, то, как говорится, претензий к пуговицам не предъявлять. Но если сообщите - буду рад :)
6. lekot 17.01.24 19:45 Сейчас в теме
Приветствую, коллега :) Тут принципиальное отличие менеджера хранилищ от предложенного решения не в стеке, а в интерфейсе ) У вас он программный для отдельного хранилища и отдельной функции. У нас пользовательский для зоопарка хранилищ) Ну и кроме контроля коммитов и запуска гитсинков - контроль пользователей ) Но в целом - респект :)
Про TCP почему-то не подумали при реализации, опирались на опыт Овсянкина с http)
7. lekot 17.01.24 20:35 Сейчас в теме
(6)
для отдельного хранилища и отдельной функции. У нас пользовательский для зоопарка хранилищ) Ну и кроме контроля коммитов и запуска гитсинков - контроль пользователей ) Но в целом - респект :)

Блин, отвечал в контексте чатика, здесь сообщение оторванным выглядит) У нас похожий есть инструмент, но на Http и с другими акцентами) Будем думать про TCP )
8. kamisov 153 17.01.24 20:57 Сейчас в теме
(6) для отдельного сервера хранилищ, для двух функций. Нужны будут другие функции - готов обсуждать в ишузах
10. user612295_death4321 17.01.24 21:21 Сейчас в теме
(8) Я уже генернул ишуз из тех потребностей, которые использую у себя )
11. kamisov 153 17.01.24 23:16 Сейчас в теме
(6) если нужен зоопарк хранилищ - можно запустить на нескольких портах. Если неудобно - можно дописать чтобы сам прокси слушал несколько портов в несколько потоков. Крч думать надо. Про какой менеджер хранилищ речь?
12. lekot 17.01.24 23:19 Сейчас в теме
(11) Статьи на ИС пока нет, как на внешнюю ссылку отреагирует модератор - не совсем понятно) Речь про менеджер альтернативный вашему) Как доклады с прошедшего тех. ивента доцифруют - расскажу подробнее)
14. minotavr_x86 8 05.02.24 10:45 Сейчас в теме
Большое спасибо, это именно то что нужно было.
15. BomjBandit 05.02.24 17:00 Сейчас в теме
Добрый день, подскажите что может быть не так. Настройку написал, прокси подняли, работает, но сообщение об ошибке выходит в окне служебных сообщений, без блокирующего окна.
Первая картинка это как сейчас, вторая - как хочется (взял из инструкции на гитхабе).
Прикрепленные файлы:
16. kamisov 153 10.02.24 23:13 Сейчас в теме
(15) я так сам и не понял, почему когда-то так, а когда-то так. Явной зависимости не увидел и никто из коллег зависимость пока не приметил. Будем ждать когда заметят :)

Главное что захват в этом случае ре освобождается и помещение не происходит. То есть функция выполняется. А бантики уже не так важны.
17. BomjBandit 12.02.24 10:59 Сейчас в теме
(16) Да, помещение отменяется. Просто думал мб какая-то настройка есть. Спасибо.
Оставьте свое сообщение