Приложение 6. Интернет-сервисы получения списка общих информационных баз и дистрибутива клиентского приложения
6.1. Получение списка общих информационных баз
При удаленной работе (например, через веб-сервер) возникает необходимость получения списка общих информационных баз. В этом случае параметр CommonInfoBases конфигурационного файла 1cestart.cfg не позволяет получить этот список. Для получения этого списка можно воспользоваться возможностью публикации списка общих информационных баз через Интернет-сервис. При этом доступно получение списка как через HTTP-запросы и через Web-сервисы.
Если получение списка общих информационных баз выполяется с помощью https-соединения, то проверка сертификата сервера (с которого выполняется получение списка) выполняется с помощью сертификатов корневых удостоверяющих центров, получаемых из файла cacert.pem (который находится в каталоге исполняемых файлов платформы) и из хранилища сертификатов ОС Windows.
6.1.1. Получение через Web-сервис
Для получения списка общих информационных баз через Web-сервис необходимо опубликовать специальный Web-сервис, который будет возвращать этот список. Рассмотрим работу этого Web-сервиса более подробно.
6.1.1.1. Описание функционирования
Интерактивная программа запуска (1cv8s) может получить список общих баз, как из локальной сети, так и через Интернет. Получение списка баз через Интернет выполняется только в случае интерактивного запуска и если указан адрес для получения списка общих информационных баз (параметр InternetService или WebCommonInfoBases файла 1cestart.cfg).
Для нормального функционирования, механизм получения списка общих информационных баз должен удовлетворять следующим требованиям:
● Вызов метода WebCommonInfoBases.CheckInfoBases() должен быть анонимным;
● Вызов метода WebCommonInfoBases.GetInfoBases() должен выполнять с аутентификацией;
● Информационная база, которая возвращает списки общих баз, должна содержать список пользователей, которые могут обращаться к ней за списком баз.
Первым шагом осуществляется вызов метода WebCommonInfoBases.CheckInfoBases() (анонимно). Если для этого компьютера и для этого пользователя интерактивная программа запуска вызывается впервые, то в качестве параметров ClientID и InfoBaseCheckCode передается значение 00000000-0000-0000-0000-000000000000. Если вызов не первый, то в качестве параметров передаются код клиента и код, идентифицирующий текущий список общих информационных баз. Метод Web-сервиса должен определить, нужно обновлять список общих информационных баз для данного клиента или нет. Если такая необходимость есть – то выходной параметр InfoBasesChanged должен получить значение Истина, а параметр URL должен содержать адрес Web-сервиса, в котором реализован метод WebCommonInfoBases.GetInfoBases() (требует аутентификации). В противном случае параметр InfoBasesChanged должен получить значение Ложь, а параметр URL должен содержать пустую строку.
Алгоритм, используемый для проверки неизменности списка общих информационных баз, не регламентируется и может быть произвольным. Необходимо понимать, что интерактивная программа запуска не занимается расчетом значения кода, идентифицирующего список общих информационных баз, а просто хранит значение, которое было передано при предыдущем вызове Web-сервиса.
Если вызов метода WebCommonInfoBases.CheckInfoBases() указал на необходимость обновления списка, интерактивная программа запуска вызывает метод Web-сервиса WebCommonInfoBases.GetInfoBases(). Web-сервис расположен по адресу, который вернула функция WebCommonInfoBases.CheckInfoBases() в параметре URL. Метод GetInfoBases() должен сопоставить пользователя, от имени которого выполнена аутентификация Web-сервиса с каким-либо кодом клиента. Сопоставление может быть «персональным» – пользователь идентифицирует себя своим персональным именем пользователя и паролем и получает свой, персональный список общих информационных баз. Также сопоставление может быть «ролевым» – пользователь идентифицирует свою принадлежность к некоторой роли, например Оператор, Кладовщик и т. д., и получает список общих информационных баз, который общий для всех пользователей, выполняющих одну роль. При этом необходимо понимать, что в первом случае информационная база, реализующая метод GetInfoBases(), должна содержать список всех пользователей, которые могут запускать интерактивную программу запуска (1cv8s), подключенную в Web-сервису. Во втором случае в списке пользователей достаточно завести имена ролей.
Метод GetInfoBases() должен вернуть три значения:
● Код клиента (если он не задан);
● Список общих информационных баз в формате v8i (см. здесь);
● Значение кода, идентифицирующий переданный список общих информационных баз. Это значение будет передано в метод WebCommonInfoBases.CheckInfoBases() при следующей проверке необходимости обновления списка общих информационных баз.
Если список общих информационных баз получается впервые, то код клиента (параметр ClientID) будет равно значению 00000000-0000-0000-0000-000000000000.
Также следует понимать следующие особенности:
● Информационная база, в которой реализуется Web-сервис WebCommonInfoBases, должна публиковаться в две разные публикации – это вытекает из необходимости обеспечить разный уровень аутентификации для вызова метода CheckInfoBases() и GetIndoBases().
● Организация анонимного доступа выполняется с помощью явного указания пользователя, от имени которого выполняется доступ, в файл default.vrd.
● Пользователь, от имени которого организуется анонимный доступ, не должен иметь возможность вызывать метод получения списка информационных баз, а только указывать, изменился список для переданного значения ClientID или нет.
● Ни одна публикация, обслуживающая Web-сервис WebCommonInfoBases, не должна предоставлять возможность работать с помощью веб-клиента.
6.1.1.2. Описание Web-сервиса
Имя Web-сервиса: WebCommonInfoBases. Тайм-аут на выполнение любого метода Web-сервиса составляет 3 секунды.
Методы Web-сервиса перечислены ниже.
CheckInfoBases
Описание:
Данный метод используется интерактивной программой запуска (1cv8s) для определения необходимости получения списка общих информационных баз.
Параметры:
ClientID входной
Тип: Строка. Содержит идентификатор клиента, для которого проверяется актуальность списка общих информационных баз.
InfoBaseCheckCode входной
Тип: Строка. Код, идентифицирующий список информационных баз. Код должен однозначно идентифицировать текущий список информационных баз. При любом изменении списка код должен быть изменен и не должен совпадать ни с одним, ранее используемым для данного идентификатора клиента, кодом.
InfoBasesChanged выходной
Тип: Булево. Признак того, что список общих информационных баз необходимо получить повторно.
URL выходной
Тип: Строка. URL, по которому следует запрашивать список общих информационных баз в том случае, если этот список поменялся с прошлого обращения.
Возвращаемое значение:
Тип произвольный, значение игнорируется.
GetInfoBases
Описание:
Параметры:
ClientID входной/выходной
Тип: Строка. Содержит идентификатор клиента, для которого выполняется получение списка общих информационных баз. Если идентификатор клиента не задан (равен значению 00000000-0000-0000-0000-000000000000), то метод должен назначить идентификатор клиента и вернуть его в этом параметре.
InfoBaseCheckCode выходной
Тип: Строка. Значение кода, идентифицирующего список общих информационных баз, который возвращается данным методом в параметре InfoBases.
InfoBases выходной
Тип: Строка. Список общих информационных баз в формате v8i (см. здесь).
Возвращаемое значение:
Тип произвольный, значение игнорируется.
6.1.1.3. Пример реализации
Рассмотрим пример Web-сервиса для получения списка общих информационных баз.
Примечание. Пример, приведенный в данном разделе, не является законченным. Он предназначен для демонстрации работы механизма.
В качестве Web-сервиса используется простая конфигурация, которая содержит один справочник и один Web-сервис.
Справочник имеет следующие характеристики:
● Имя СписокОбщихБаз.
● Тип кода Строка, длина 36 символов.
● Реквизиты:
● Имя КодСписка, тип УникальныйИдентификатор.
● Имя СписокИБ, тип Строка, неограниченной длины.
● Остальные параметры заданы по умолчанию.
Данный справочник будет хранить список идентификаторов клиентов (стандартный реквизит Код), список общих информационных баз (реквизит СписокИБ) и текущая версия списка информационных баз (реквизит КодСписка), рассчитанной при последнем получении списка для данного клиента. Версия списка является уникальным идентификатором, который изменяется при каждом сохранении элемента справочника. Для этого в модуле объекта определен обработчик ПередЗаписью:
Копировать в буфер обмена
Процедура ПередЗаписью(Отказ)
КодСписка = Новый УникальныйИдентификатор;
КонецПроцедуры
Также в конфигурации должен быть создан Web-сервис WebCommonInfoBases, для которого должны быть определены операции:
● CheckInfoBases, свойство Тип возвращаемого значения установлено в значение string, флажок Возможно пустое значение установлен. Остальные свойства установлены в значения по умолчанию. Параметры метода и их типы см. здесь.
● GetInfoBases, свойство Тип возвращаемого значения установлено в значение string, флажок Возможно пустое значение установлен. Остальные свойства установлены в значения по умолчанию. Параметры метода и их типы см. здесь.
Текст операций Web-сервиса:
Копировать в буфер обмена
Функция CheckInfoBases(ClientID, InfoBaseCheckCode, InfoBaseChanged, URL)
Если ClientID = "00000000-0000-0000-0000-000000000000"
И InfoBaseCheckCode = "00000000-0000-0000-0000-000000000000" Тогда
// это первое обращение клиента
InfoBaseChanged = Истина;
URL = "/listservice2/ws/WebCommonInfoBases";
Возврат "";
КонецЕсли;
Клиент = Справочники.СписокОбщихБаз.НайтиПоКоду(ClientID);
Если Клиент.Пустая() Тогда
// нет такого клиента
InfoBaseChanged = Ложь;
Иначе
// проверим, что список на стороне клиента и наш список не различаются
Если InfoBaseCheckCode = Клиент.КодСписка Тогда
// список не поменялся
InfoBaseChanged = Ложь;
URL = "";
Иначе
// список изменился
InfoBaseChanged = Истина;
URL = "/listservice2/ws/WebCommonInfoBases";
КонецЕсли;
КонецЕсли;
Возврат "";
КонецФункции
Функция GetInfoBases(ClientID, InfoBaseCheckCode, InfoBases)
Если ClientID = "00000000-0000-0000-0000-000000000000" Тогда
ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
// необходимо завести нового клиента
// кодом элемента справочника будет уникальный идентификатор
// пользователя информационной базы
Объект = Справочники.СписокОбщихБаз.СоздатьЭлемент();
Объект.Код = Строка(ТекПользователь.УникальныйИдентификатор);
// именем клиента будет имя пользователя
Объект.Наименование = ТекПользователь.Имя;
// список ИБ пустой при первом обращении
Объект.СписокИБ = "";
Объект.Записать();
// сформируем возвращаемые значения Web-сервиса
InfoBaseCheckCode = Объект.КодСписка;
InfoBases = Объект.СписокИБ;
ClientID = Объект.Код;
Иначе
// здесь получим данные для существующего кода клиента
Клиент = Справочники.СписокОбщихБаз.НайтиПоКоду(ClientID);
Если Клиент.Пустая() Тогда
// нет такого клиента
InfoBaseCheckCode = "";
InfoBases = "";
Иначе
InfoBaseCheckCode = Клиент.КодСписка;
InfoBases = Клиент.СписокИБ;
КонецЕсли;
КонецЕсли;
Возврат "";
КонецФункции
После создания конфигурации следует дважды опубликовать Web-сервис на веб-сервере (см. здесь). Затем необходимо запомнить адреса опубликованных Web-сервисов. Предположим, что Web-сервисы опубликованы по адресам:
●
http://localhost/listservice – анонимный Web-сервис;
●
http://localhost/listservice2 – Web-сервис, требующий аутентификации;
В информационной базе должны существовать пользователи Анонимный, и, например, пользователи с именами Оператор, Кладовщик, Бухгалтер.
Файл default.vrd, который описывает публикацию по адресу
http://localhost/listservice имеет следующий вид:
Копировать в буфер обмена
<?xml version="1.0" encoding="UTF-8"?>
<point 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"
base="/listservice"
ib="File=X:\DB\ListBase;Usr=Анонимный"
enable="false">
<ws>
<point name="WebCommonInfoBases"
enable="true"/>
</ws>
</point>
Файл default.vrd, который описывает публикацию по адресу
http://localhost/listservice2 имеет следующий вид:
Копировать в буфер обмена
<?xml version="1.0" encoding="UTF-8"?>
<point 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"
base="/listservice2"
ib="File= X:\DB\ListBase;"
enable="false">
<ws>
<point name="WebCommonInfoBases"
enable="true"/>
</ws>
</point>
В настройках веб-сервера, для которого выполнены публикации Web-сервиса получения списка общих информационных баз, должна быть запрещена обработка HTTP-запроса HEAD (по крайней мере для виртуальных каталогов, через которые выполняется обращение к Web-сервису). В противном случае Web-сервис не будет использоваться.
В форме настройки окна запуска (см. здесь) необходимо добавить Интернет-сервис с указанным выше адресом, с указанием суффикса ws:
http://localhost/listservice/ws/.После выполнения настройки следует запустить программу запуска. На предложение ввести имя пользователя и пароль доступа к Web-сервису «1С:Предприятия», следует вводить имена Оператор, Кладовщик, Бухгалтер. В справочнике СписокОбщихБаз появятся соответствующие записи. Если в реквизит СписокИБ каждого элемента справочника поместить свой список в формате v8i, то этот список будет добавляться в список информационных баз программы запуска, после выполнения аутентификации.
6.2. Получение дистрибутива клиентского приложения
При удаленной работе (через веб-сервер) возникает необходимость автоматического получения дистрибутива клиентского приложения в тех случаях, когда на сервере «1С:Предприятия» (или веб-сервере) выполнена замена версии системы. В этом случае поиск новой версии с помощью параметра DistributiveLocation конфигурационных файлов может не дать результат. Для получения дистрибутива можно воспользоваться возможностью публикации дистрибутива клиентского приложения через Интернет-сервис. При этом доступно получение списка как через HTTP-запросы и через Web-сервисы.
Если получение дистрибутива клиентского приложения выполяется с помощью https-соединения, то проверка сертификата сервера (с которого выполняется получение дистрибутива) выполняется с помощью сертификатов корневых удостоверяющих центров, получаемых из файла cacert.pem (который находится в каталоге исполняемых файлов платформы) и из хранилища сертификатов ОС Windows.
6.2.1. Получение через Web-сервис
Для получения дистрибутива клиентского приложения через Web-сервис необходимо опубликовать специальный Web-сервис, который будет возвращать этот дистрибутив. Рассмотрим работу этого Web-сервиса более подробно.
6.2.1.1. Описание функционирования
Если тонкий клиент (1cv8c) запущен с ключом /AppAutoCheckVersion, то выполняется попытка подобрать версию тонкого клиента в том случае, если она не совпадает с версией сервера «1С:Предприятия» или расширения веб-сервера. Для этого используются три механизма (по порядку использования):
● Поиск дистрибутива в локальной сети – с помощью параметров конфигурационных файлов (1cestart.cfg и 1cescmn.cfg) DistributiveLocation.
● Получение дистрибутива клиентского приложения по URL, указанных в конфигурационных файлах default.vrd (атрибут элемента point, см. здесь) или conf.cfg (параметр PublishDistributiveLocation, см. здесь). При этом приоритетным является значение, указанное в файле default.vrd.
● Получение файла через Web-сервис получения дистрибутива клиентского приложения. Для этого адрес Web-сервиса необходимо указать в конфигурационном файле 1cestart.cfg (параметр InternetService или WebDistributiveLocation, подробнее см. здесь) или в диалоге настройке окна запуска, подробнее см. здесь.
Тонкий клиент анализирует результат обращения к Web-сервису. Если Web-сервис возвращает 0 в параметре Size, то считается, что необходимого дистрибутива необходимого клиентского приложения нет, и формируется ошибка о несоответствии версий клиентского приложения и сервера. В противном случае пользователю выдается запрос на скачивание и установку клиентского приложения, с указанием размера получаемого дистрибутива. При положительном ответе выполняется скачивание и установка новой версии, после чего происходит перезапуск нужной версии клиентского приложения. При выполнении загрузки файла дистрибутива тайм-аут на выполнение операции составляет 600 секунд. При выполнении загрузки дистрибутива не поддерживается redirect на стороне веб-сервера.
6.2.1.2. Описание Web-сервиса
Имя Web-сервиса: WebDistributiveLocation. Тайм-аут на выполнение любого метода Web-сервиса составляет 3 секунды.
Методы Web-сервиса перечислены ниже.
GetDistributiveInfo
Описание:
Данный метод используется тонким клиентом (1cv8с) для получения дистрибутива клиентского приложения нужной версии в следующих случаях:
● Несовпадение версии клиентского приложения и сервера, в клиент-серверном варианте, при подключении через веб-сервер.
● Несовпадение версии клиентского приложения и расширения веб-сервера, в файловом варианте, при подключении через веб-сервер.
Параметры:
OS входной
Тип: Строка. Тип операционной системы, для которой необходимо получить дистрибутив клиентского приложения.
Возможные значения: Windows, Linux.
Arch входной
Тип: Строка. Архитектура операционной системы, для которой необходимо получить дистрибутив клиентского приложения.
Возможные значения: x86, x86_64.
Version входной
Тип: Строка. Номер версии клиентского приложения, дистрибутив которого необходимо получить.
Size выходной
Тип: Число. Размер дистрибутива клиентского приложения (в байтах). Если запрашиваемый дистрибутив отсутствует, необходимо вернуть значение 0.
URL выходной
Тип: Строка. URL для скачивания дистрибутива клиентского приложения. При формировании URL следует помнить, что файл с дистрибутивом должен быть доступен веб-серверу, и у пользователя, который будет получать дистрибутив, также должны быть права на скачивание этого файла.
Дистрибутив клиентского приложение представляет из себя zip-архив файлов дистрибутива, без иерархии.
Возвращаемое значение:
Тип произвольный, значение игнорируется.
6.2.1.3. Пример реализации
Рассмотрим пример Web-сервиса для получения дистрибутива клиентского приложения.
Примечание. Пример, приведенный в данном разделе, не является законченным. Он предназначен для демонстрации работы механизма.
В качестве Web-сервиса используется простая конфигурация, которая реализует собственно Web-сервис и не содержит никаких других объектов конфигурации. Дистрибутивы клиентского приложения будут расположены в специальном каталоге, к которому должен иметь доступ веб-сервер. В конфигурации должен быть создан Web-сервис WebDistributiveLocation, для которого должна быть определены операция GetDistributiveInfo, свойство Тип возвращаемого значения установлено в значение string, флажок Возможно пустое значение установлен. Остальные свойства установлены в значения по умолчанию. Параметры метода и их типы см. здесь.
Текст операций Web-сервиса:
Копировать в буфер обмена
Функция GetDistributiveInfo(OS, Arch, Version, Size, URL)
КаталогДистрибутивов = "C:\inetpub\Distribs\";
URLДистрибутивов = "
http://host/site/distribs/";
// сформируем имя файла с архивом
ИмяФайла = "tc-" + НРег(OS) + "-" + Arch + "-" + Version + ".zip";
Архив = Новый Файл(КаталогДистрибутивов + ИмяФайла);
Если Архив.Существует() Тогда
Size = Архив.Размер();
URL = URLДистрибутивов + ИмяФайла;
Иначе
Size = 0;
URL = "";
КонецЕсли;
Возврат "";
КонецФункции
Следует указать в переменных КаталогДистрибутивов и URLДистрибутивов правильные значения, соответствующие реальному имени каталога с дистрибутивами клиентского приложения (при обращении к нему из Web-сервиса – переменная КаталогДистрибутивов и при обращении к нему через веб-сервис – переменная URLДистрибутивов).
Имя файла с дистрибутивом должно иметь имя tc-windows-x86-8.3.3.100.zip или аналогичное (в зависимости от вида ОС и архитектуры запрашиваемого клиентского приложения). Имя файла с архивом определяется программным кодом приведенного выше демонстрационного Web-сервиса.
После создания конфигурации следует опубликовать Web-сервис на веб-сервере (см. здесь). Затем необходимо запомнить адрес опубликованного Web-сервиса. Предположим, что Web-сервис опубликован по адресу
http://localhost/getdistr.В форме настройки окна запуска (см. здесь) необходимо добавить Интернет-сервис с указанным выше адресом, с указанием суффикса ws:
http://localhost/getdistr/ws. Теперь при необходимости получения дистрибутива будет выполнен запрос у Web-сервису. Если в каталоге КаталогДистрибутивов (на компьютере в Web-сервисом) будет zip-архив с нужным дистрибутивом – этот файл будет передан на компьютер, который запросил дистрибутив.