Каталог решений - Прокси хранилища 1С (IIS, OneScript)

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

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

В наличии

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

Категория:

Описание

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

Во всех командах разработки рано или поздно возникает потребность привязки изменений кода к номерам задач. В итоге команды приходят к решению в виде комментариев в хранилище 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С, допишем всего пару строк:

 

has been added to your cart:
Оформление заказа