Как быстро получать сводные данные и остатки из нескольких баз 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Использование Web-сервисов и HTTP-сервисов (WS/HTTP)

Рассмотрим наиболее технологичный и рекомендуемый фирмой 1С способ взаимодействия между базами данных — создание веб-сервисов или HTTP-сервисов на стороне баз-источников.

При отправке запроса центральная база обращается к сервису периферийной базы. Подключение по протоколам HTTP/HTTPS происходит практически мгновенно, а формирование ответа выполняется средствами виртуальных таблиц платформы 1С, что гарантирует абсолютную точность получаемых остатков.

Основные преимущества использования HTTP/Web-сервисов:

  1. Высокая скорость соединения: В отличие от устаревшего COM-соединения (COMConnector), веб-сервисы не требуют инициализации тяжелого COM-объекта и создания сеанса с повторной загрузкой конфигурации.
  2. Безопасность и стандартизация: Передача данных осуществляется в легких форматах JSON или XML через защищенные протоколы связи.
  3. Использование встроенных алгоритмов 1С: Запрос к остаткам выполняется стандартным языком запросов 1С к виртуальным таблицам (например, РегистрНакопления.ТоварыНаСкладах.Остатки()), что полностью исключает ошибки в расчете итогов.

Регламентный сбор данных и витрины остатков

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

Реализовать эту схему можно двумя способами:

  1. Push-модель (базы-источники сами отправляют данные): На стороне каждой периферийной базы настраивается регламентное задание. По расписанию (например, каждые 15 минут или раз в сутки на начало дня) база вычисляет срез остатков и отправляет его в центральную базу-концентратор через HTTP-сервис.
  2. Pull-модель (центральная база собирает данные): Центральная база по расписанию через РегламентныеЗадания обегает периферийные базы и сохраняет полученные остатки в специализированный регистр сведений (витрину данных).

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

Использование встроенного REST API / OData

Платформа 1С 8.3 имеет встроенный механизм автоматической публикации REST API (интерфейс OData). Проанализируем возможности этого инструмента:

Включение стандартного интерфейса OData позволяет получать данные из таблиц 1С без написания программного кода веб-сервисов. Внешняя система или центральная база 1С может выполнять стандартные HTTP GET-запросы к объектам конфигурации. Однако для расчета остатков по регистрам накопления на произвольный момент времени встроенный OData-интерфейс требует правильной адресации к виртуальным таблицам, поэтому для сложных расчетов предпочтительнее создавать собственные HTTP-сервисы.

Прямой доступ к таблицам MS SQL: риски и техническая сложность

Выясним причину, почему прямой доступ к СУБД MS SQL в обход сервера приложений 1С крайне не рекомендуется, несмотря на кажущуюся высокую скорость выборок.

Разберем основные технические и лицензионные сложности прямого чтения SQL-таблиц:

  1. Сложная структура хранения итогов: Регистры остатков 1С хранятся в двух физических таблицах SQL — таблице движений и таблице итогов. Актуальные итоги рассчитываются на специальную техническую дату, а промежуточные — на начало каждого месяца. Чтобы получить корректный остаток на произвольную дату через SQL, придется писать сложнейший T-SQL запрос с получением ближайших итогов и суммированием/вычитанием всех движений за интервал.
  2. Разделение итогов: Если в регистре включен механизм разделения итогов для высоконагруженных систем, одна запись остатка распадается на множество физических строк в СУБД. Прямой SQL-запрос без учета этого механизма вернет некорректные данные.
  3. Динамическая схема данных: Имена таблиц (например, _AccumRg1234) и полей (_Fld5678) изменяются при реструктуризации базы или изменении состава конфигурации. Для их получения приходится постоянно использовать метод ПолучитьСтруктуруХраненияБазыДанных() и динамически собирать SQL-текст.
  4. Сырые типы данных: Вместо привычных ссылок 1С вы получите идентификаторы UUID, технические индексы перечислений и системные даты, которые требуют дополнительной расшифровки.
  5. Блокировки и лицензионные риски: Прямой `SELECT` без специальных инструкций (таких как `NOLOCK` или настойки `READ COMMITTED SNAPSHOT`) может вызывать взаимные блокировки с транзакциями пользователей 1С. Кроме того, при использовании совместных лицензий «1С + MS SQL Runtime» прямое чтение базы сторонними приложениями напрямую нарушает лицензионное соглашение.

Использование внешних источников данных

Если необходимо объединить данные из базы 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);
    
    Возврат Ответ;
    
КонецФункции

Резюме и рекомендации

Подводя итог, выделим оптимальный выбор технологии:

  1. Для получения оперативных остатков в режиме реального времени создавайте HTTP-сервисы в базах-источниках. Это безопасно, быстро и надежно.
  2. Для формирования тяжелых сводных отчетов настраивайте регламентный сбор данных (Push или Pull) в центральную витрину данных.
  3. Избегайте прямого обращения к таблицам MS SQL, чтобы предотвратить ошибки в расчете итогов, блокировки и нарушения лицензионных условий.
← На главную