1.Принцип работы.
Решение представляет из себя микросервис, работающий на базе net core 3.1 (https://gosha20777.github.io/code/2018/02/22/dotnetcore/).
При запуске рабочий процесс Решения ("Tram.exe") по умолчанию слушает порты 5010 (5011 -https).
В качестве web-сервера Решение настроено на использование собственного встроенного в платформу net core 3.1 сервера Kestrel (то, что 1С обещает сделать в релизе 8.4 платформы).
При получении http-запроса, процесс организует локальное com-соединение с платформой 1С 7.7, через которое и реализуется работа с базой данных.
2.Возможности.
1.1.Проверять наличие и доступность запрошенной базы данных (POST на точку входа "IsDataBaseAccessible").
1.2.Выполнять запуск произвольной обработки 7.7 (POST на точку входа "Exec").
1.3.Выполнять получение данных виде таблицы значений произвольной структуры (POST на точку входа "GetData").
Транспортным протоколом для возврата результата является простой текст с разделителями.
3.Ограничения.
3.1.Решение разработано под 64-разрядные системы. Это связано с тем, что net core 3.1 в принципе, не поддерживается на ОСях младше Windows Server 2012(r2) (Windows 7 (sp1)) (https://github.com/dotnet/core/blob/master/release-notes/3.1/3.1-supported-os.md).
3.2. 32-разрядные варианты данные операционных систем, поддерживающих net core 3.1 очень редки и
в этой связи разрабатывать 32 разрядную версию решения посчитал нецелесообразным.
3.3.Полноценная работа через https соединение не тестировалась.
3.4.Для работы требуется установка в ОС фреймворков: net core 3.1 и net framework 4.5.2.
4.Варианты поставки.
4.1.Исполняемый файл.
Просто исполняемый файл Tram.exe, файл библиотеки "Tram.dll" и файл настроек "Settings.txt". Все 3 файла должны лежать в одном каталоге. Запускать исполняемый файл можно любыми средствами и под любым пользователем, обладающим правами на R/W доступ к каталогу базы данных и к сетевым возможностям машины.
Преимущество - простота реализации.
4.2.Стандартный инсталлятор от Майки (из VS2019).
Инсталлятор устанавливает в систему службу "TramSrv". Вариант запуска: автозапуск.
Служба, при старте, запускает рабочий процесс "Tram.exe" сервиса и контролирует его работоспособность. При завершении процесса, сервис останавливается.
Инсталлятор, при запуске, проверяет наличие необходимых условий запуска (установленных фреймворков) и предлагает их установить (с офф. сайта) - при отсутствии.
При удалении решения, сервис также удаляется из системы.
Преимущества:
-не требуется авторизации пользователя на сервере.
-работает всегда и запускается сам.
-проверка условий запуска и поддержка их выполнения.
-все необходимые файлы кидает в установочный каталог и производит минимальные настройки для запуска.
5.Установка.
5.1.Параметры.
Оба варианта поставки (сервис и исполняемый файл) предоставляют возможность определения через комм. строку следующих параметров работы:
5.1.1. Прослушиваемые порты (ключи: -PORT и -SSLPORT). (Пример: -PORT5050 -SSLPORT5051).
5.1.2. Размещение файла логов (ключ: -LOGFILE). (Пример: -LOGFILEC:\TramLog.txt).
Следующие ключи не тестировал и сделал, "чтоб было".
5.1.3. Путь к файлу ssl-сертификата (ключ: -SERTFILE). (Пример: -SERTFILEC:\cert.CRT).
(Понятно, что пароль через командную строку передавать нельзя)
5.1.4. Пароль для доступа к сертификату (ключ: -SERTPWD). (Пример: -SERTPWD12345).
5.2.При поставке Решения в качестве сервиса.
5.2.1.После установки службы, следует обратить внимание на пользователя, под которым служба будет запускаться.
У пользователя должны быть права на каталог базы данных и работу с сетью.
5.2.2.После установки службы также следует указать необходимые параметры командной строки (куда будут писаться логи (если требуется) и переопределить порты (если требуется)).
5.2.3.После установки, сервис "TramSrv" первый раз следует пнуть вручную, либо перезапустить компьютер (т.к. вариант автозапуска = "Автоматический" подразумевает автозапуск при старте системы).
5.3.При поставке Решения в качестве исполняемого файла.
Собственно, закинуть исполняемый файл, файл настроек и библиотеку реализации в 1 каталог и после этого можно запускать.
Как и в случае с сервисом - можно указать путь к логу и переопределить порты.
5.4.Файл настроек (в случае обеих поставок).
Файл настроек ВСЕГДА должен лежать в 1м каталоге с исполняемым файлом "Tram.exe".
В файле настроек указывается путь к каталогу с базами данных 1с. (!! Не к базе данных, а к родительскому каталогу базы данных!!). Родительских каталогов может быть несколько. Но имя каталога самой базы данных должно быть уникально в рамках всех родительских каталогов.
Пример:
============
[folders]
C:\1c77DB
C:\2c77DB
C:\3c77DB
============
5.5.Желательно в параметрах комм. строки указать выходной файл логов. Его просмотр сильно облегчает решение проблем запуска.
6.Использование.
Примерный код обращения к сервису представлен в обработке "ТестСоединения.epf" (формат 1с 8.х), находящейся в репозитории и в архиве к статье.
В этой связи, детально копипастить сюда его не вижу смысла. Поясню только механизмы, которые реализованы в самом Решении, на стороне сервиса.
6.1.В режиме получения данных, конечным результатом передаваемого в сервис пакета кода всегда должна быть таблица значений "тзВых" с колонками типа "Число" или "Строка".
Например:
//================
Т = "тзВых = СоздатьОбъект(""ТаблицаЗначений"");
|тзВых.НоваяКолонка(""пп"",""Строка"");
|тзВых.НоваяКолонка(""Сумма"",""Число"");
|тзВых.НоваяКолонка(""Количество"",""Число"");
|
|тзВых.Новаястрока();
|тзВых.пп = ""123123123"";
|тзВых.Сумма = 1;
|тзВых.Количество = 2;
|
|тзВых.Новаястрока();
|тзВых.пп = ""12фывафкцук"";
|тзВых.Сумма = 3;
|тзВых.Количество = 4;
|
|тзВых.Новаястрока();
|тзВых.пп = ""12ььььафкцук"";
|тзВых.Сумма = 5;
|тзВых.Количество = 6;
|
|";
//================
Это связано с тем, что данный код записывается в файл, дополняется снизу фрагментом, который конвертирует данные результирующей тз в текст, текст сохраняется в файл, а уже файл читается кодом сервиса (после возврата исполнения из com-соединения) и прочитанный текст отправляется клиенту.
Фрагмент-конвертер выглядит так:
//================
Т = СоздатьОбъект("Текст");
стрЛок = "";
Для тк = 1 по тзВых.КоличествоКолонок() Цикл
стрЛок = стрЛок + ?(стрЛок="","","||||||") + Строка(тзВых.ПолучитьПараметрыКолонки(тк));
КонецЦикла;
Т.ДобавитьСтроку(стрЛок);
тзВых.ВыбратьСтроки();
Пока тзВых.ПолучитьСтроку()=1 Цикл
стрЛок = "";
Для тк = 1 по тзВых.КоличествоКолонок() Цикл
стрЛок = стрЛок + ?(стрЛок="","","||||||") + Строка(тзВых.ПолучитьЗначение(тзВых.НомерСтроки,тк));
КонецЦикла;
Т.ДобавитьСтроку(стрЛок);
КонецЦикла;
Т.Записать(Форма.Параметр);
Исключение
Ош = ОписаниеОшибки();
Т = СоздатьОбъект("Текст");
Т.ДобавитьСтроку(Ош);
Т.Записать(Форма.Параметр);
КонецПопытки;
//================
Исполнение происходит так.
Общий код (и пришедший в запросе и добавленный код-конвертор) записывается в файл с именем "CodeListing.txt".
Также, в составе ресурсов Решения есть обработка 7.7 со следующим модулем:
//================
#ЗагрузитьИзФайла CodeListing.txt
//================
Файл "CodeListing.txt" и эта обработка записываются во временный каталог, а через com-соединение вызывается открытие этой обработки платформой 7.7 посредством такого кода:
ОткрытьФорму("Путь обработки во временном каталоге","Отчет", "Имя временного файла для записи результата в формате текста.").
После того, как управление возвращается из 1с 7.7 в код сервиса, текстовый файл результата читается и передается клиенту.
6.2.Передача обработки на исполнение.
Произвольная обработка запаковывается в BASE64 и передается как текстовое тело запроса.
Сервис распаковывает ее взад, сохраняет как временный файл и исполняет через com-соединение посредством метода: "ОткрытьФорму()".
7.Ссылка на решение:
https://github.com/KotVezdehod/Tram.
8.Примечание.
Решение делал на 1 раз, в этой связи не реализовал ряд фич.
8.1. Например, можно было-бы (при установке сервиса) автоматически заполнять файл настроек списком каталогов с базами данных
8.2. Прописывать в командную строку созданного сервиса путь к файлу лога.
P.S.Тестирование проводилось на версии платформы 7.7.27.