Прокси хранилища 1С (IIS, OneScript)

17.01.24

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

Избавляемся от версионной зависимости, проверяем комментарии, вызываем веб-хуки, делаем красивые пути. И все это на привычном IIS и понятном OneScript.

Внимание! Статья и ее содержимое кануло в историю. Не рекомендуется использовать данный функционал. Диприкейтед!

Но все же ее будет очень интересно почитать :)

Все дело в том, что на больших конфигурациях (ERP, Бухгалтерия) это работать не будет по причине ограничения памяти в 4ГБ в IIS для процесса w3wp.exe. На маленьких конфигурациях работать будет (и долго работает по правде говоря).

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

 

Для чего, зачем и почему

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

Так же хочется в работу добавить эстетики. Например, при подключении к хранилищу через HTTP почему бы не убрать уродливые "*.1ccr" и не сделать красивый адрес хранилища?

При подключении через tcp на разных версиях 1С надоело угадывать, на каком порту какая версия находится.

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

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

 

Краткое описание

На Windows сервере располагаются файловые хранилища конфигураций 1С. Для доступа к ним на том же сервере настроен tcp-сервер хранилища 1С (crserver.exe). Так же настроен доступ к хранилищу по HTTP на IIS. Предполагаем, что после внедрения, доступ к хранилищам остается только по HTTP. Хранилища более не будут доступны по tcp или файловым шарам.

В IIS добавляется расширение от Microsoft "URL Rewrite" для запрета доступа к оригинальной публикации хранилища (чтобы нельзя было действовать в обход "прокси"), а так же для красивых адресов хранилищ.

На сервер устанавливается OneScript. Будем использовать его механизм HTTP-сервисов. В IIS добавляется публикация на OneScript. Внутри публикации создается файл .os, в нем на OneScript происходит обработка запросов конфигуратора. Запросы можно парсить, проверять комментарии, возвращать нативную для конфигуратора ошибку, во время запроса вызывать сторонние сервисы (например gitsync), осуществлять маршрутизацию между версиями 1С и т.д.

Не все так страшно, как кажется!

 

Длинное описание

 

Настройка доступа tcp

Справка на ИТС тут, статья от WiseAdvice здесь.

Допустим, все наши хранилища лежат на сервере в D:\Confstores\

1С рекомендует настраивать следующим образом:

crserver.exe -instsrvc | -rmsrvc -usr <пользователь> -pwd <пароль>
                    -start | -stop
                    -port <порт> -d <каталог>

Этот метод нам не подходит.

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

sc.exe create <имя сервиса, например "1c_storage_8_3_21_1624"> binPath="C:\Program Files\1cv8\8.3.21.1624\bin\crserver.exe -srvc -port 1542 -d D:\ConfStores"

Например, так:

 

 

Отлично! Теперь мы можем подключаться из любой используемой версии 1С по соответствующему порту:

tcp://<имя_сервера>:<порт>/<имя_хранилища>

Например tcp://server:1542/erp

 

Доступ по HTTP

Справка ИТС по ссылке.

Создадим несколько публикаций на IIS, каждая их которых смотрит на свои tcp-порты в соответствии с версиями.

Для каждой версии должно быть по 2 файла:

 

 

Содержание web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<system.web>
	  <httpRuntime maxRequestLength="102400" />
   </system.web>
    <system.webServer>
        <handlers>
            <add name="8_3_21_1484" path="storage.1ccr" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\1cv8\8.3.21.1484\bin\wsisapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="bitness64" />
        </handlers>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="4294967295" />
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

maxAllowedContentLength="4294967295" - запросы конфигуратора и ответы ему могут быть довольно большими, поэтому увеличиваем допустимый размер передаваемых данных до максимального

Каждый файл должен быть под "свою" версию. Внутри 2 места для исправления: "add name="8_3_21_1484"" и путь к wsisapi.dll

Содержание storage.1ccr:

<?xml version="1.0" encoding="UTF-8"?>
<storage connectString="tcp://localhost:2543"/>

Ссылается на текущий сервер, на порт 2543. Не забудьте поменять порт на тот, который вы указали для текущей версии при настройке доступа по tcp.

Добавим под каждую версию свой пул приложения (Application pool) в IIS:

 

 

Далее в Sites -> Default Web Site надо найти папки, которые мы создавали ранее, через контекстное меню нажать "Convert to application". Не забудьте выбрать нужный Application pool, иначе по умолчанию установится DefaultAppPool:

 

 

Теперь можно пробовать подключаться к хранилищу по http:

http://<имя_сервера>/<имя_публикации>/storage.1ccr/<имя_хранилища>

Например http://server/pool_8_3_21_1484/storage.1ccr/erp

 

Учим IIS понимать OneScript

Для начала его нужно установить. Проверка: в cmd набрать слово oscript:

 

 

Для управления обменом с хранилищем будем использовать механизм http-сервисов OneScript.

Как это работает в двух словах: при обращении по адресу http://<имя_сервера>/<имя_публикации>/<имя_файла>.os после всех настроек будет вызываться указанный нами далее файл *.os, в котором обязательно должна быть экспортная функция ОбработкаВызоваHTTPСервиса(Запрос).

Эта функция должна возвращать ответ типа HTTPСервисОтвет (например, Новый HTTPСервисОтвет(200), где 200 - код состояния HTTP).

Между запросом и ответом и будет выстроена вся наша деятельность: анализ тела запроса, вызов сервисов, подмена ответа либо отправка оригинального ответа конфигуратора.

 

Чтобы сделать публикацию HTTP-сервиса OneScript, нам понадобится сделать:

 

1. Новую папку в "C:\inetpub\wwwroot". В нашем примере предлагаю называть ее storage. Внутри структура будет следующая:

2. В папку bin нужно поместить файлы, которые можно взять из bin установленного OneScript:

ASPNETHandler.dll            
DotNetZip.dll                
ICSharpCode.AvalonEdit.dll   
Newtonsoft.Json.dll          
OneScript.DebugProtocol.dll  
OneScript.DebugServices.dll  
OneScript.Language.dll       
ScriptEngine.dll             
ScriptEngine.HostedScript.dll
ScriptEngine.NativeApi.dll   
ScriptEngine.NativeApi32.so  
ScriptEngine.NativeApi64.dll
ScriptEngine.NativeApi64.so

3. Файл web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<system.web>
      <httpHandlers>
         <add verb="*" path="*.os" type="OneScript.ASPNETHandler.ASPNETHandler, ASPNETHandler" />
      </httpHandlers>
	  <customErrors mode="Off" />
	  <httpRuntime maxRequestLength="102400" />
   </system.web>
    <system.webServer>
        <handlers>
			<add name="OneScript" path="*.os" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="File" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
			<add name="OneScript32" path="*.os" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="File" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
        </handlers>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="4294967295" />
            </requestFiltering>
        </security>
    </system.webServer>
	<appSettings>
		<add key="CachingEnabled" value="true" />
		<add key="handlerLoadingPolicy" value="strict" />
	</appSettings>
</configuration>

Здесь, грубо говоря, описано, какими dll обрабатывать файлы с расширением .os, допустымые размеры данных, а так же пара настроек для движка OneScript в конце.

4. Под описание storage.os выделяю отдельный следующий раздел.

5. В IIS конвертировать публикацию storage в приложение, определить для него отдельный Application pool с pipeline mode - classic и .NET CLR Version v4.0

 

Создание скрипта .os

В общем случае скрипт выглядит так:

Функция ОбработкаВызоваHTTPСервиса(Запрос) Экспорт
    Возврат Новый HTTPСервисОтвет(200);
КонецФункции

При вызове http-сервиса, например через браузер, IIS будет искать какие dll запускать для файла с расширением .os, dll будут искать функцию ОбработкаВызоваHTTPСервиса и на возврате ожидать HTTPСервисОтвет.

Отсюда и далее буду сворачивать код в спойлеры, иначе будет занимать слишком много места.

Чтобы из файла сделать прокси хралища 1С, допишем всего пару строк:

 
 Самый простой прокси

Здесь все тривиально: получили запрос, отдали в хранилище, получили ответ, отправили конфигуратору.

Пространство для маневра открывается невообразимое :)

Моей изначальной целью был контроль комментариев. Конфигуратор при помещении версии в хранилище использует метод "DevDepot_commitObjects", а при изменении старой версии "DevDepot_changeVersion". Допишу функцию разбора запроса конфигуратора для извлечения интересующих меня атрибутов. Так же сразу произведу задел на маршрутизацию по версиям 1С:

 
 Прокси немного посложнее

Здесь чуть сложнее: запрос конфигуратора парсится на предмет вызываемого метода хранилища, версии платформы, комментария и имени хранилища. Если у нас настроена обрабатываемая версия 1С, отправим запрос конфигуратора по адресу именно этой версии. Можем, кстати, например, заблокировать помещение/изменение версий для всех версий 1С, кроме последней, а из прошлых версий 1С оставить только чтение. Это актуально, когда на dev контуре последний релиз, а на prod еще старый (и мы не понимаем как работает этот черный ящик хранилища и пишем в него только последней версией 1С, а читаем любыми версиями, в конце концов файловый доступ к хранилищу позволяет делать так).

По поводу нативного ответа. Понятия не имею что означает вся эта требуха из гуидов и DLL. Я ее как-то распарсил, догадался как завернуть, и оно работает в таком виде на десятке хранилищ. Подозреваю, что от версии к версии может меняться.

Выглядит нативный ответ например так:

 

 

Итоговое решение со всеми проверками будет выглядеть примерно следующим образом:

 
 Финальное решение

Далее вы самостоятельно можете исправить/добавить код по вашим требованиям. Например не только проверять номер задачи на принадлежность системе, а еще и статус задачи. Или исполнителя. При долгих операциях, не требующих их ожидания, можно воспользоваться механизмом фоновых заданий OneScript (мы же не хотим чтобы разработчик ждал по 10 минут помещения в хранилище?).

Но, пока что вы не сможете этим воспользоваться... Потому что надо сделать перенаправление запроса (далее).

 

Перенаправление запросов

В чем проблема:

На этом этапе у нас уже есть несколько публикаций в IIS:

https://<имя_сервера>/storage_8_3_20_1789/storage.1ccr
https://<имя_сервера>/storage_8_3_21_1484/storage.1ccr
https://<имя_сервера>/storage_8_3_21_1624/storage.1ccr
https://<имя_сервера>/storage/storage.os

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

https://<имя_сервера>/storage_8_3_20_1789/storage.1ccr/<имя хранилища>

Они будут работать напрямую с хранилищем, а нам это не интересно. Мы хотим чтобы запросы проходили через наш OneScript файл.

Но вот к скрипту мы пока что подключиться не сможем, конфигуратор не поймет такое:

https://<имя_сервера>/storage/storage.os/<имя_системы>

И выдаст ошибку "хранилище не вижу, работать не буду". Все дело в том как конфигуратор парсит строки подключения. Например если вы укажете через tcp:

tcp://server/base

То конфигуратор поймет, что нужно подключиться к хосту server и в XML-содержимое запроса поместить имя хранилища "base".

Для HTTP подключения конфигуратор ищет имя системы обязательно по паттерну ".1ccr". Поэтому попытка заменить ".1ccr" на ".os" не увенчается успехом. Конфигуратор не знает что такое ".os". Однако же есть третий вариант:

http://server/base

Конфигуратор понимает что подключаться нужно по протоколу http, а выясняет имя хранилища как для tcp.

Я решил сделать так, чтобы у меня были красивые имена

http://server/base

Которые транслировались бы в

https://server/storage/storage.os

И поможет нам в этом...

 

URL rewrite

Официальное расширение от Microsoft для работы со строками запросов внутри веб-сервера IIS. Загрузить можно здесь. Установка "далее-далее-готово" на сервере, где расположен веб-сервер.

После установки оно появится тут:

 

 

UPD от 19.12.2023: при установке URL Rewrite должен установиться компонент Application request routing (на картинке слева посередине). Если он не установился автоматически (такое бывает), необходимо его установить самостоятельно отсюда https://www.iis.net/downloads/microsoft/application-request-routing (ссылки на загрузку внизу страницы). После установки ARR нужно перезайти в IIS, зайти в ARR на уровне сервера, справа Server proxy settings, установить галочку Enable proxy, нажать ОК.

 

Теперь можно зайти на свой Default web site и начать создавать правила:

 

 

На скриншоте их 4:

1. Красивые имена указанных хранилищ перенаправляются к файлу .os

2. 3. 4. Запрет прямого обращения к оригинальным публикациям.

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

 

 

Дословно означает следующее: когда пришел запрос (например http://server/ERP), то:

- взять часть запроса после первого одиночного слэша

- сравнить ее с регулярным выражением ^ERP$|^BAZA1$|^UT$ (^ - начало строки, слово ERP или слово BAZA1 или слово UT, $ - конец строки) - красным добавил исправление 13.03.2023, без этого например база ERP_OLOLO тоже попадала в условие

- Ignore case - no comment

- Action type - Rewrite: подменить строку запроса на ту, которая указана в Rewrite URL (тело запроса при этом никуда не денется, просто поедет немного по другому пути)

Соответственно под такое правило у нас попадут строки подключения:

http://server/erp, http://server/baza1, http://server/ut - то есть имена ваших хранилищ. После добавления этого правила можно указывать строку в таком формате в конфигураторе.

Бинго! Запросы к хранилищу обрабатываются с помощью OneScript.

Напоследок осталось запретить подключаться напрямую к "настоящим" публикациям хранилищ. Добавить 3 правила под каждую версию 1С:

 

 

Здесь, в отличие от предыдущего правила, в Conditions добавляется {REMOTE_ADDR} Does not match the pattern 127.0.0.1. То есть правило должно работать всегда, кроме случая, когда сам сервер обращается к себе (чем перенаправление и является). Так же в Action type выбираем Custon Response со статусом кода 403 "Отказ доступа".

 

Заключение

Весь этот "троллейбус из буханки" работает уже полгода. За время работы были только проблемы с памятью в процессе IIS "w3wp.exe", обслуживающем Application pool для публикации прокси. Это вылечили функциями очистки мусора в скрипте. 15 разработчиков, ферма Bamboo, и много аналитиков каждый день обращаются через этот прокси к 10 хранилищам конфигураций. Разницы по скорости и ожиданиям запросов с tcp нет. В некоторых моментах даже быстрее tcp. Видимо, tcp-серверу легче держать подключение с одним хостом, чем со многими.

Обязательность указания комментариев очень помогает в сборке релизов. Огромный плюс от ухода с версионности: достаточно добавить версию на одном сервере, а работать будет у всех сразу. Вызов синхронизации с git - одно удовольствие :)

 

В этой статье я хотел описать не как правильно делать, а как можно.

Как правильно - вы решите для себя сами.

Буду рад обсудить материал в комментариях :)

См. также

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

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

2500 руб.

20.06.2023    22246    2    4    

309

SALE! 50%

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

Использования систем контроля версий — стандарт современной разработки. На курсе научимся использованию Хранилища 1С и GIT при разработке на 1С:Предприятие 8. Разберем подходы и приемы коллективной разработки, научимся самостоятельно настраивать системы и ориентироваться в них.

4900 2450 руб.

29.06.2022    11928    99    4    

131

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

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

2160 руб.

05.08.2024    1273    12    1    

7

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    12550    10    10    

35

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

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

2400 руб.

04.07.2022    8365    38    1    

29

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

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

1800 руб.

20.01.2022    7779    19    0    

13

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

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1401    Evil Beaver    11    

24

Групповая разработка (Git, хранилище) Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда в хранилище одновременно разрабатывают несколько команд, сортировка сделанного и несделанного при формировании релиза и проведение code review по задачам превращаются в непроходимый квест. В таких случаях нужен бранчинг. Расскажем об опыте перехода на новую схему хранения кода для ИТ-департамента.

23.09.2024    2826    kraynev-navi    2    

25
Отзывы
57. kamisov 216 30.12.23 12:17 Сейчас в теме
Данная статья более не актуальна, т.к. IIS через такой прокси не может переварить запросы к хранилищу от больших конфигураций (ERP, Бухлалтерия). Рекомендую ознакомиться с новым TCP прокси-сервером в котором этих ограничений нет https://github.com/infina15/oproxy
VyacheslavShilov; +1 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ardn 657 08.12.22 12:04 Сейчас в теме
Однозначный плюс!
Можно еще попробовать обойтись без IIS - осенью появился winow - веб-сервер на чистом oscript. Так порог входа будет еще ниже.
NikitaIvanchenko; AllexSoft; ktb; kamisov; +4 Ответить
2. nixel 1433 08.12.22 12:26 Сейчас в теме
> OneScript автоматически не чистит память.

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

Ну и да, рекомендую ознакомиться с winow и/или OneScript.Web. Механизм asp net handler для иис не развивается и заброшен автором. Чудо, что он все ещё работает в 1.8
NikitaIvanchenko; ktb; kamisov; +3 Ответить
3. Evil Beaver 8243 08.12.22 12:39 Сейчас в теме
(2) и да, автор - это не я, а Юрий Дешин. А вообще - вы видели то же самое, но на Apache+Nginx и без 1Скрипта?https://infostart.ru/1c/articles/1765324/ С одной стороны, Lua внутри nginx работает быстрее, с другой стороны - логику обработки запроса писать сложнее, на 1Скрипте-то оно попроще будет, проверить что номер задачи в коммите указали, что вообще текст коммита задали и пр..

Однозначно плюс и спасибо!
NikitaIvanchenko; salexdv; ktb; kamisov; +4 Ответить
5. kamisov 216 08.12.22 13:39 Сейчас в теме
(2) Поправлю, спасибо за уточнение!
OneScript.Web периодически разглядываю, вот все хочу какую-нибудь поделку сделать. Winow впервые слышу.

(3) Я как раз недавно прочитал эту статью и подумал что пора свой велосипед опубликовать. Посмотрим как зайдет... Попроще - да, все же у большинства 1С работает на Windows с IIS, а так же компетенции только на языке 1С.

Вам обоим спасибо за OneScript! Первую свою статью писал, совсем забыл поблагодарить тех, кто его сделал :)
6. nixel 1433 08.12.22 14:08 Сейчас в теме
8. nixel 1433 08.12.22 14:09 Сейчас в теме
(5)
да, все же у большинства 1С работает на Windows с IIS


видимо, от окружения зависит. большинство моих знакомых бросает попытки завести хоть что-то на иис и ставят простой как пробка апач :)
7OH; ovcharenko.di; mas_kot; AllexSoft; kamisov; +5 Ответить
4. Evil Beaver 8243 08.12.22 13:13 Сейчас в теме
@kamisov теперь бы все это обернуть в коробочн-библиотечный вид и придать продуктовый лоск, чтобы облегчить применение. Например:

* парсер RPC-вызовов конфигуратора и ответов ему - обернуть в удобную объектную модель (и библиотеку 1script)
* сделать неизменяемый мастер-обработчик, который обрабатывает запросы IIS и перенаправляет их на цепочку прикладных "пользовательских" плагинов
* плагины лежат в папочке и пишутся разработчиками на местах или в опенсорсе

Плагин - это некое действие над хранилищем: проверка заполненности, проверка корректности текста коммита, выполнение хука и пр.

тогда возможна будет такая история: Разворачиваем IIS и этот вот продукт "Умное Хранилище". Качаем с инфостарта/гитхаба/откуда-угодно плагин "Отправка в телеграм уведомления о коммите" и кладем в папочку plugins. Также качаем "Проверка корректности текста коммита" и "Синхронизатор git по коммиту". Мастер-обработчик просто передает по цепочке всем плагинам удобную объектную модель общения с конфигуратором, а те делают бизнес-логику и возвращают тексты ошибок, которые мастер-обработчкик превращаем опять в RPC-ответы Конфигуратору.

Все это упаковать красиво и подать общественности.
kuntashov; artbear; salexdv; AllexSoft; kamisov; +5 Ответить
7. nixel 1433 08.12.22 14:08 Сейчас в теме
(4)
* парсер RPC-вызовов конфигуратора и ответов ему - обернуть в удобную объектную модель (и библиотеку 1script)


а есть же crs-api, не?
9. Evil Beaver 8243 08.12.22 14:11 Сейчас в теме
(7) а, ну если есть, то еще лучше. Я просто не знал
10. json 3349 09.12.22 13:43 Сейчас в теме
Наблюдали при похожей схеме сильное замедление работы с хранилищем. Настолько сильное, что пришлось полностью от нее отказаться.
Видимо, в момент, когда происходит парсинг входящих пакетов из конфигуратора в http-сервер.
Пробовали делать прокси для хранилищ больших конфигураций типа ЕРП ?
11. kamisov 216 09.12.22 14:29 Сейчас в теме
(10) для ЕРП не пробовал, у нас только полностью нетиповые конфигурации.

Тут, как мне кажется, есть 2 возможных варианта проблемы:

1. Подвисало на больших запросах к хранилищу, из-за того что IIS приходилось держать в памяти двойной экземпляр данных в один момент времени. Больших запросов на самом деле не так много. Например полное обновление конфигурации. Обычные запросы захвата/помещения весят довольно мало.

2. (Более вероятно) Парсинг запроса происходил всегда полностью, в то время как нет смысла его читать до конца. Все необходимые данные лежат в начале запроса. В моем примере происходит поиск метода в запросе. И если метод не интересен (что-то кроме помещения и изменения версии), то чтение запроса прекращается. То есть по-настоящему парсинг происходит только на двух методах, на остальных парсится только начало запроса и сразу же запрос уходит по своему пути.

Самое большое хранилище у нас - 2 ГБ с копейками. GIT репозиторий от него 630 МБ.Отличий с tcp нет никаких.

Вы на каком веб-сервере делали это все? И чем парсили?
12. user1872182 10.12.22 16:50 Сейчас в теме
Спасибо за статью!

У меня возникла проблема с ASP.net, IIS выводит ошибку 500.23. Гугл привёл меня по путям решения:
1. при переключении на классический режим pool у IIS, но не видит репозиторий (404), а в браузере падает на строке 42 storage.os
2. пробовал вклинить validateIntegratedModeConfiguration="false" в system.webServer , но репозиторий не находит (404)

Может, кто-либо сталкивался с данной ситуацией и сможет мне помочь?
13. kamisov 216 10.12.22 18:33 Сейчас в теме
(12) по http хранилище работает напрямую без прокси?
На 42 строке что выполняется?

Можно попробовать сделать рядом какой-нибудь hello world на OneScript, проверить работает ли вообще. Докрутить чтобы работал и потом пробовать хранилище запустить.

Статья от автора сервисов: https://infostart.ru/1c/articles/727311/

Пишите больше подробностей, буду рад помочь.
user1872182; +1 Ответить
15. user1872182 12.12.22 10:40 Сейчас в теме
(13) Спасибо, разобрался. Необходимо было переключить IIS пул у прокси на режим Classic.
16. kamisov 216 12.12.22 11:38 Сейчас в теме
(15) Круто! Все работает? Хватило описания в статье или стоит что-то добавить?
17. user1872182 19.12.22 12:46 Сейчас в теме
(16) Добрый день!
К сожалению, не выходит настройка URL Rewrite по перенаправлению запросов на хран, даже в логах IIS ничего нет - 404.4 только в ответ.
Версия IIS 10.0.17763.1
Версия ASP.net 4.7
Версия .NET Framework 4.8

По Default page, кстати, тоже проблема. Указал документ по-умолчанию "storage.os", но выходит ошибка 405.

Пока решил вопрос как выделенный сайт для реверс прокси, там создаются отдельные application. В конце строки остаётся storage.os :(
18. user1872182 21.12.22 12:51 Сейчас в теме
(17) В связи с вышеописанными проблемами лично у меня, я остановился на таком варианте; в скрипте указывается проксирование:
- Функция ПутьДоХранилищаПоИмени(Имя)
Соответствие.Вставить("storage.os/kg/erp/cf-main", "http://127.0.0.1:81/8_3_20_1710/repository.1ccr");


Пункт "Запрет прямого обращения к оригинальным публикациям" сделал проще:
- создал отдельный http сайт с портом 81, где слушающий IP адресс - это localhost 127.0.0.1 (фото приложил)

storage.os разместил в корень сайта https, а путь до хранилища будет таким:
- https://АДРЕС_IIS/storage.os/kg/erp/cf-main

АВТОРУ я выражаю большое уважение и благодарность! Не только опубликовал свой труд и наработки, но и удалось пообщаться лично по данному проекту. СПАСИБО!
Прикрепленные файлы:
19. kamisov 216 22.12.22 15:53 Сейчас в теме
28. sergio_sconosciuto 5 22.04.23 19:25 Сейчас в теме
(17)
К сожалению, не выходит настройка URL Rewrite по перенаправлению запросов на хран, даже в логах IIS ничего нет - 404.4 только в ответ

404.4 это ошибка "Ресурсу, который вы ищете, не сопоставлен обработчик. "
Нужно в web.config поправить: изменить <action type="Rewrite" url="http://localhost/storage/storage.os" />
на <action type="Rewrite" url="storage/storage.os" />
14. blackhole321 1314 11.12.22 09:14 Сейчас в теме
Также, вместо url rewrite можно попробовать опцию default page. При таком подходе, для каждого хранилища создаётся отдельная подпапка (ut, erp etc.), Куда кладется os файл с именем, скажем default.os и в параметрах default page указывается os файл с соответствующими настройками проксирования.
20. user649357 15.03.23 10:01 Сейчас в теме
Спасибо за статью. В итоге удалось настроить аналогично. Однако, если для публикации скрипта storage создавать отдельный пул, то тоже повторялась ошибка 404 при переопределении адреса. Причем, если указывать полный адрес в правиле, то ошибка 404.4, если относительный, то 404.8.
Пришлось для Default Web Site устанавливать пул, созданный для storage. В таком варианте все заработало.
21. asipenka@gmail.com 23.03.23 20:34 Сейчас в теме
Спасибо! Работает. Настроили все практически по статье. Пока используем только для контроля комментариев.

Не получается только сообщение диалогом выводить при отсутствии комментария. Выводится в окне служебных сообщений. Причем не при всех запросах так. Но при DevDepot_commitObjects - в сообщениях. Как заставить выводить диалог, к сожалению, пока не нашел.
Прикрепленные файлы:
22. kamisov 216 23.03.23 21:04 Сейчас в теме
(21) можно попробовать сымитировать диалоговое окно и перехватить ответ, посмотреть в чем отличие. Какая версия платформы?
23. asipenka@gmail.com 24.03.23 08:23 Сейчас в теме
(22) Да, так делал, перехватывал. Абсолютно ничем ответ не отличался. Но все равно менял, на перехваченный, а результат такой же - выводит сообщением.
Платформа 8.3.18.1289.
24. asipenka@gmail.com 24.03.23 08:38 Сейчас в теме
(23) 8.3.20.2180 - такой же результат
25. sergio_sconosciuto 5 19.04.23 16:28 Сейчас в теме
При попытке какого - либо действия в хранилище (соединения например, подключения) из конфигуратора 1С, при выполнении процедуры ОбработкаВызоваHTTPСервиса(ЗапросКонфигуратора) из вашего примера (самый простой прокси)
выходит ошибка: Ошибка XML-протокола при работе с удаленным хранилищем конфигурации.
по причине:
Ошибка преобразования данных XML

Чтобы это могло значить?
26. kamisov 216 19.04.23 17:39 Сейчас в теме
(25) попробуйте записать в файл этот текст XML и посмотреть почему он не преобразуется. Здесь не инструкция, а руководство, могут быть неточности. Пытался донести основную мысль, она не маленькая :) Скорее всего первый символ из текста надо убрать.
27. sergio_sconosciuto 5 20.04.23 12:17 Сейчас в теме
(26)
В ответе HTTP приходит следующая информация:
<?xml version="1.0" encoding="UTF-8"?><exception xmlns="http://v8.1c.ru/8.2/virtual-resource-system" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Exception" clsid="580392e6-ba49-4280-ac67-fcd6f2180121" reason="-4">
<descr xmlns="http://v8.1c.ru/8.1/data/core">Ошибка при разборе дескриптора виртуальных ресурсов</descr>
<inner xmlns="http://v8.1c.ru/8.1/data/core" xsi:type="Exception" clsid="9db1fa37-b455-4f3f-b8dd-7de0ea7d6da3"><descr>Файл не обнаружен 'C:\inetpub\wwwroot\storage_8_3_20_1914\default.vrd'. 2(0x00000002):
Не удается найти указанный файл. </descr>

Зачем здесь понадобился файл vrd? В этой папке находится файл *.1ccr
В чем здесь может быть проблема?
29. sergio_sconosciuto 5 22.04.23 19:31 Сейчас в теме
(27)
.ru/8.1/data/core" xsi:type="Ex

Вопрос закрыт ))
30. kamisov 216 22.04.23 20:32 Сейчас в теме
(29) врд файл не нужен. Поясните пожалуйста для потомков каким образом вопрос закрыт?
31. sergio_sconosciuto 5 22.04.23 22:30 Сейчас в теме
(30)
врд файл не нужен.

Вообще у меня проблема была немного вне рамок данной задачи )) -
т.е. мне нужно было не используя настройку URL Rewrite, напрямую послать запрос серверу хранилища,
т.е. в хранилище я указывал путь: http://localhost/storage/storage.os/mybase (когда для tcp это tcp://localhost/mybase).
В процедуре ОбработкаВызоваHTTPСервиса(ЗапросКонфигуратора) файла storage.os я изменил строку АдресХранилища = "http://127.0.0.1/storage_8_3_20_1914/storage.1ccr";
на АдресХранилища = "http://127.0.0.1/storage_8_3_20_1914/storage.1ccr/mybase";
Я просто не знал куда засунуть имя хранилища mybase.
После этого вышла данная ошибка. Когда я вернул АдресХранилище в первоначальный вид и установил имя хранилища mybase в тело запроса (как значение алиаса),все заработало
(.<?xml version="1.0" encoding="UTF-8"?><crs:call xmlns:crs="http://v8.1c.ru/8.2/crs" alias="mybase" name="DevDepot_devObjectsStatistic" version="8.3.20.1914">
в запросе этой процедуры алиас изначально 1С-ом устанавливался в alias="storage/storage.os/mybase",
при указанном в статье перенаправлении URL Rewrite этого нет )
.
Проблем после этого с настройкой URL Rewrite не было.
32. bukva89 15.06.23 13:32 Сейчас в теме
Автору респект!
Бьюсь 3 дня, всё установил, настроил как описано) Читаю комментарии, у кого-то взлетело почти как из коробки, а у меня вообще ничего)
Скачал OneScript, установил.
Скачал URL-Rewriter, создал правила, но они не работают.

Поднимал хранилища http и раньше, а тут в другом pool не работает, только через default, да и это не проблема если платформа одна, проблема в том, что после переопределения адреса ничего не работает...
Прикрепленные файлы:
33. bukva89 16.06.23 09:14 Сейчас в теме
(32) Вопрос решен.
Проблема решилась благодаря ответу (28)

Спасибо автору, буду разбираться дальше :)
34. kamisov 216 16.06.23 10:10 Сейчас в теме
(32) спасибо
:)
Мне почему-то кажется что все проблемы из-за разности окружения. У кого-то винда другая, у кого-то IIS, у кого-то 1С старой версии, потому и разные настройки.

Надо уже как-то добраться да завернуть все в OneScript-демон какой-то, чтобы вся настройка ограничивалась настройкой http-хранилища...
35. bukva89 13.07.23 13:21 Сейчас в теме
(34) разобрался, запилил крутой сервис по проверкам комментариев, задач, метки и т.п.
Протестировал все на локальном компе, всё работает как надо, скорость выполнения кросс-запросов тоже достаточно быстрая и почти не заметная.

Перенес всё на отдельно выделенный сервер по "Прокси-хранилище" и тут началось...

Запрос отправляется по "красивому пути к хранилищу", переписывается для перенаправления в "storage.os", далее отправляется http-запрос и где-то зависает на пол-пути или раньше/позже (пока не выяснил где именно) и через длительное время падает с ошибкой:
---- Начало операции с хранилищем конфигурации ----
Неклассифицированная ошибка работы с хранилищем конфигурации.
Ошибка сервера в приложении '/storage'.

Время ожидания запроса истекло.

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

Сведения об исключении: System.Web.HttpException: Время ожидания запроса истекло.Ошибка источника:

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

Трассировка стека:

[HttpException (0x80004005): Время ожидания запроса истекло.]

Информация о версии: Платформа Microsoft .NET Framework, версия:4.0.30319; ASP.NET, версия:4.7.3930.0

---- Операция с хранилищем конфигурации отменена ----
Показать


Покурив гугл, включил трассировку запросов, а тут тома логов и вроде как все гуляет как надо, но вот ответ на http-запрос кажется не возвращается и зависает где-то...

Может кто-то сталкивался и может подсказать куда рыть?
P.S. на IIS длину тела запроса увеличил на максимум: maxRequestLenght - 2147483647
36. bukva89 13.07.23 13:29 Сейчас в теме
(35) но чаще падает с такой ошибкой:
Неклассифицированная ошибка работы с хранилищем конфигурации.
по причине:
Ошибка выполнения запроса
Ошибка при выполнении запроса POST к ресурсу :
по причине:
Ошибка НТТР при обращении к серверу: http://[ИмяСервераХранилища]
Failure when receiving data from the peer
37. bukva89 14.07.23 09:58 Сейчас в теме
(36) Решение найдено.
Глупо конечно, но когда я переносил все на боевой сервер, пропустил и забыл поменять адрес http-сервиса к которому производились обращения для обработки перехваченных запросов, все время ломился на localhost, когда нужно было указать адрес боевого сервера (на разных серверах находится прокси и http-сервис для обработки перехваченных запросов).
Спасибо что выслушали и будьте внимательны :)
38. kamisov 216 14.07.23 10:35 Сейчас в теме
(37) потому я и жду здесь несколько дней прежде чем ответить :) Рад, что у вас получилось! Спасибо что воспользовались идеей. Надеюсь, принесет пользу.
39. bukva89 17.08.23 13:43 Сейчас в теме
Добрый день всем :)
Вот уже месяц (почти) живем используя прокси-сервис хранилища.
Все отлично, все круто. Автору еще раз спасибо!

Столкнулся с такой проблемой и никак ее решить не могу.

Ругается на код:
HTTPЗапрос.УстановитьТелоИзСтроки(ТекстТелаВходящегоЗапроса, КодировкаТекста.UTF8)


Помогает только перезапуск пула или IIS целиком.
Может у кого есть идеи или с подобным сталкивались?
Прикрепленные файлы:
40. kamisov 216 17.08.23 14:24 Сейчас в теме
(39) можно полный код? Такого кода, как у вас, в статье нет
41. bukva89 18.08.23 10:35 Сейчас в теме
(40) у меня по аналогии с "ВызватьСинхронизациюБамбу()", во внешний сервис передается для обработки данные запроса.
При этом тело запроса содержит данные, все ок. По ощущениям что это баг OneScript.

Строка 139, в ней ошибка.
Прикрепленные файлы:
42. bukva89 23.08.23 13:04 Сейчас в теме
(41) никто не сталкивался с подобным? :)
43. kamisov 216 23.08.23 13:34 Сейчас в теме
(42) попробуйте из тела запроса убрать первый символ функцией Сред(). Конфигуратор шлет запросы с BOM, а ваш http-сервис по всей видимости не хочет с этим BOM принимать тексты запросов.
44. bukva89 25.08.23 15:01 Сейчас в теме
(43) Спасибо, пробовал, но все равно ошибка возникает.
Сейчас настроил перезапуск пула приложений каждые 15 минут - костыль, но какое-то решение.
45. kamisov 216 25.08.23 18:09 Сейчас в теме
(44) попробуйте понаблюдать за процессом w3wp.exe на сервере. Если сильно разбухает и отрубается - проблема со сбором мусора. Еще что-то похожее встречал, когда на одной публикации несколько версий 1С, они начинают использовать разные ApplicationPool и падают.
46. bukva89 29.08.23 08:06 Сейчас в теме
(45) Попробую, спасибо.
Но у меня один пул, одна платформа)
47. RomikMf 64 26.09.23 21:20 Сейчас в теме
Автору, спасибо! Работает.
Из проблем:
1. Завелось только после присвоения Default Web Site того же пула, что и для storage.
2. Для Управления Холдингом падало при подключении к хранилищу на конструкции ОтветХранилища.ПолучитьТелоКакДвоичныеДанные()
[ExternalSystemException: {Модуль C:\inetpub\wwwroot\os_storage\storage.os / Ошибка в строке: 40 / Внешнее исключение (System.OverflowException): Измерения массива превысили поддерживаемый диапазон.}    
  Ответ_ДвоичныеДанные = ОтветХранилища.ПолучитьТелоКакДвоичныеДанные();
]


я так понимаю, связано с этой ошибкой OneScript

Хранилище УХ возвращает ответ как XML размером 2,9 Gb.
Поменял на ПолучитьТелоКакСтроку(), УстановитьТелоИзСтроки(), заработало.
48. kamisov 216 26.09.23 22:00 Сейчас в теме
(47) у меня таких больших хранилищ нет, потому и не попал на эту ошибку. Но выкрутиться пытался бы) Это инициализация на 2.9 гб или какая-то другая операция?
49. RomikMf 64 26.09.23 23:43 Сейчас в теме
(48) Инициализация. Сейчас столкнулся с ошибкой Failure when receiving data from the peer при сравнении версий хранилища на примере ЗУПа. Видно, что w3wp резко жрет память, через какое-то время вылетает с такой ошибкой. Памяти на сервере при этом достаточно.
51. kamisov 216 27.09.23 00:41 Сейчас в теме
(49) без прокси, по хттп публикации эти операции нормально выполняются?
53. RomikMf 64 27.09.23 11:07 Сейчас в теме
(50) Без прокси всё нормально. С прокси есть таки есть нюансы. Для УХ если версию объекта попробовать получить, падает с ошибкой Недостаточно памяти для продолжения выполнения программы. Видимо, упирается в ограничение 4Gb.
55. kamisov 216 27.09.23 12:08 Сейчас в теме
(53) я не уверен, но вот тут можно попробовать https://learn.microsoft.com/ru-ru/dotnet/api/system.web.configuration.httpruntimesection.executiontimeout?view=netframework-4.8.1

Побольше поставить, возможно из-за времени выполнения валится
Прикрепленные файлы:
56. RomikMf 64 27.09.23 13:49 Сейчас в теме
(55)
Не помогает. Там ошибка именно в памяти, видно как w3wp вырастает примерно до 4.2 Gb и потом выдается ошибка.
Exception information: 
    Exception type: OutOfMemoryException 
    Exception message: Недостаточно памяти для продолжения выполнения программы.
   в System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
   в System.Text.StringBuilder.Append(Char* value, Int32 valueCount)
   в System.Text.StringBuilder.Append(Char[] value, Int32 startIndex, Int32 charCount)
   в System.IO.StreamReader.ReadToEnd()
   в ScriptEngine.HostedScript.Library.Http.HttpResponseContext.GetBodyAsString(IValue encoding)
   в lambda_method(Closure , HttpResponseContext , IValue[] )
   в ScriptEngine.Machine.Contexts.AutoContext`1.CallAsFunction(Int32 methodNumber, IValue[] arguments, IValue& retValue)
   в ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(Int32 arg)
   в ScriptEngine.Machine.MachineInstance.MainCommandLoop()

Показать

В общем такое только для одной операции DevDepot_devObjectsVersionEx, забанил её пока для УХ заглушкой. В остальном полет нормальный.
52. kamisov 216 27.09.23 10:29 Сейчас в теме
(49) а какая версия 1с? Вот такое нашел https://bugboard.v8.1c.ru/error/000061699
Пишут что в 8.3.17 исправили
54. RomikMf 64 27.09.23 11:07 Сейчас в теме
(52) На 8.3.23.1865 пробую.
50. kamisov 216 27.09.23 00:33 Сейчас в теме
(49) надо крутить iis на тему доступной памяти
57. kamisov 216 30.12.23 12:17 Сейчас в теме
Данная статья более не актуальна, т.к. IIS через такой прокси не может переварить запросы к хранилищу от больших конфигураций (ERP, Бухлалтерия). Рекомендую ознакомиться с новым TCP прокси-сервером в котором этих ограничений нет https://github.com/infina15/oproxy
VyacheslavShilov; +1 Ответить
Оставьте свое сообщение