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

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

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

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

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

 

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

См. также

Онлайн-интенсив "DevOps для 1С". с 5 февраля по 19 марта 2024 г.

DevOps для 1С DevOps и автоматизация разработки Программист Стажер Платные (руб)

Данный онлайн-курс (интенсив) предусматривает изучение процессов, инструментов и методик DevOps, их применение при разработке на платформе 1С. 

9000 руб.

20.06.2023    16774    2    3    

250

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

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

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

2220 руб.

04.07.2022    7206    32    1    

25

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

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    11132    8    5    

31

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

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

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

4900 руб.

29.06.2022    9812    80    4    

113

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

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

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

2 стартмани

08.05.2019    24712    58    VPanin56    26    

28

Автотесты 1С для типовых конфигураций Бухгалтерия предприятия КОРП 3.0 и Бухгалтерия предприятия 3.0 (vanessa automation)

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

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.144.49.

1728 руб.

20.01.2022    6908    11    0    

10

DevOps на проектах 1С: для кого, зачем, с чего начать

DevOps и автоматизация разработки 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)

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

27.05.2024    1594    PROSTO-1C    25    

23

Интерактивные TUI элементы в OneScript

OneScript Программист Стажер Бесплатно (free)

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

20.05.2024    2144    bayselonarrend    18    

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

хочется заюзать для нашей типовой конфигурации, работающей через хранилище.
Serg O.; ardn; kamisov; +3 Ответить
2. artbear 1555 17.01.24 13:20 Сейчас в теме
За автотесты отдельное большое спасибо!
Serg O.; kamisov; +2 Ответить
3. artbear 1555 17.01.24 13:21 Сейчас в теме
Мелкая опечатка - и долго муился?
4. kamisov 192 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 192 17.01.24 21:06 Сейчас в теме
(5) жду обратной связи. Очень интересно как и где упадет. Я мучил этот прокси несколькими ERP одновременно - не положил. Даже память не очень поднялась.
13. kamisov 192 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 192 17.01.24 20:57 Сейчас в теме
(6) для отдельного сервера хранилищ, для двух функций. Нужны будут другие функции - готов обсуждать в ишузах
10. user612295_death4321 17.01.24 21:21 Сейчас в теме
(8) Я уже генернул ишуз из тех потребностей, которые использую у себя )
11. kamisov 192 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 192 10.02.24 23:13 Сейчас в теме
(15) я так сам и не понял, почему когда-то так, а когда-то так. Явной зависимости не увидел и никто из коллег зависимость пока не приметил. Будем ждать когда заметят :)

Главное что захват в этом случае ре освобождается и помещение не происходит. То есть функция выполняется. А бантики уже не так важны.
17. BomjBandit 12.02.24 10:59 Сейчас в теме
(16) Да, помещение отменяется. Просто думал мб какая-то настройка есть. Спасибо.
18. skillman 5 13.05.24 07:30 Сейчас в теме
Добрый день.
В примере указано код
Если ПараметрыЗапроса.ИмяБазы = "baza1" Тогда

в описании такого параметра нет, а есть
ИмяСистемы

Можете пояснить оба параметра запроса существуют или только один и в примере неактуальная версия?
Возможно ИмяБазы это доп параметр для проверки имени базы?
19. skillman 5 13.05.24 08:20 Сейчас в теме
Еще вопрос.
При добавлении в хранилище у меня не появляются модальных окон с ошибками, как у вас указано на скрине. Я
У меня так первый скрин.
Ответ увидел выше в теме :)
Прикрепленные файлы:
Оставьте свое сообщение