При построении территориально-распределенных систем или работы с холдинговой структурой часто возникает задача быстрого сбора сводной отчетности и оперативных остатков из множества однотипных баз 1С. Разберем основные архитектурные подходы к решению этой задачи, оценим их производительность, сложность реализации и соответствие стандартам платформы 1С:Предприятие 8.3.
Рассмотрим наиболее технологичный и рекомендуемый фирмой 1С способ взаимодействия между базами данных — создание веб-сервисов или HTTP-сервисов на стороне баз-источников.
При отправке запроса центральная база обращается к сервису периферийной базы. Подключение по протоколам HTTP/HTTPS происходит практически мгновенно, а формирование ответа выполняется средствами виртуальных таблиц платформы 1С, что гарантирует абсолютную точность получаемых остатков.
Основные преимущества использования HTTP/Web-сервисов:
COMConnector), веб-сервисы не требуют инициализации тяжелого COM-объекта и создания сеанса с повторной загрузкой конфигурации.РегистрНакопления.ТоварыНаСкладах.Остатки()), что полностью исключает ошибки в расчете итогов.Проанализируем ситуацию, когда данных слишком много, а опрос десятков баз в режиме "on-demand" (по требованию) создает ощутимую задержку для пользователя. В таком случае оптимальным решением является переход от прямого опроса к предварительному сбору данных.
Реализовать эту схему можно двумя способами:
РегламентныеЗадания обегает периферийные базы и сохраняет полученные остатки в специализированный регистр сведений (витрину данных).При таком подходе пользователь, формирующий сводный отчет в центральной базе, получает данные моментально, так как чтение происходит из локальных таблиц консолидированной базы.
Платформа 1С 8.3 имеет встроенный механизм автоматической публикации REST API (интерфейс OData). Проанализируем возможности этого инструмента:
Включение стандартного интерфейса OData позволяет получать данные из таблиц 1С без написания программного кода веб-сервисов. Внешняя система или центральная база 1С может выполнять стандартные HTTP GET-запросы к объектам конфигурации. Однако для расчета остатков по регистрам накопления на произвольный момент времени встроенный OData-интерфейс требует правильной адресации к виртуальным таблицам, поэтому для сложных расчетов предпочтительнее создавать собственные HTTP-сервисы.
Выясним причину, почему прямой доступ к СУБД MS SQL в обход сервера приложений 1С крайне не рекомендуется, несмотря на кажущуюся высокую скорость выборок.
Разберем основные технические и лицензионные сложности прямого чтения SQL-таблиц:
_AccumRg1234) и полей (_Fld5678) изменяются при реструктуризации базы или изменении состава конфигурации. Для их получения приходится постоянно использовать метод ПолучитьСтруктуруХраненияБазыДанных() и динамически собирать SQL-текст.Если необходимо объединить данные из базы 1С с внешней СУБД (например, выделенной аналитической базой данных PostgreSQL или MS SQL), в 1С предусмотрен объект ВнешниеИсточникиДанных. Он позволяет подключаться к сторонним таблицам через ODBC-драйвер и работать с ними с помощью обычных запросов 1С.
Посмотрим на пример архитектурной схемы с использованием витрины данных:
// Пример структуры HTTP-сервиса на стороне базы-источника
Функция ПолучитьОстаткиТоваров(Запрос)
Запрос1С = Новый Запрос;
Запрос1С.Текст =
"ВЫБРАТЬ
| ТоварыОстатки.Номенклатура.Код КАК Код,
| ТоварыОстатки.Номенклатура.Наименование КАК Наименование,
| ТоварыОстатки.ВНаличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыОстатки";
Запрос1С.УстановитьПараметр("Период", ТекущаяДата());
ТЗ = Запрос1С.Выполнить().Выгрузить();
// Формирование JSON-ответа
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТЗ);
СтрокаJSON = ЗаписьJSON.Закрыть();
Ответ = Новый СоответствиеHTTPСервисаОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаJSON);
Возврат Ответ;
КонецФункции
Подводя итог, выделим оптимальный выбор технологии: