Стоит ли настраивать обмен 1С с SQL через внешние источники данных и какие есть альтернативы

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

При проектировании интеграции между 1С и внешними информационными системами (например, фронт-офисом, сайтом или сторонними СУБД) разработчики часто сталкиваются с дилеммой. С одной стороны, механизм Внешних источников данных (ВИД) в 1С манит своей простотой: подключился напрямую к SQL-таблице и читай/пиши данные. С другой стороны, опытные архитекторы называют такой подход устаревшим и опасным.

В этой статье мы подробно разберем, почему прямой обмен через общие таблицы SQL (паттерн Shared Database) часто превращается в головную боль, какие скрытые риски несет механизм ВИД и как спроектировать надежный, современный обмен с использованием брокеров сообщений и интеграционных шин.

---

Проблема прямого обмена через SQL: почему это считается плохой практикой

Давайте проанализируем классический сценарий. Внешняя система (например, сайт или кассовый модуль) записывает данные в специальную "буферную" таблицу в СУБД MS SQL или PostgreSQL. Платформа 1С по расписанию опрашивает эту таблицу, забирает новые записи, обрабатывает их и помечает как обработанные. Данная схема кажется простой, но на практике мы сталкиваемся со следующими критическими проблемами:

  1. Сильная связанность систем (Tight Coupling). Обе системы становятся жестко зависимыми от структуры таблиц базы данных. Если разработчики внешней системы изменят тип колонки, удалят поле или переименуют таблицу в SQL, интеграция на стороне 1С мгновенно сломается. Вы теряете автономность разработки.
  2. Паразитная нагрузка из-за постоянного опроса (Polling). Чтобы оперативно получать данные, 1С должна регулярно выполнять запросы к SQL-серверу (например, каждые 5–10 секунд). Даже если данных для обмена нет, база данных постоянно обрабатывает эти запросы, расходуя ресурсы процессора и дисковой подсистемы.
  3. Сложности с блокировками и конкурентным доступом. Если вы решите ускорить обработку данных и запустите несколько параллельных фоновых заданий в 1С, вам придется самостоятельно решать проблему распределения записей. В противном случае разные потоки начнут считывать и обрабатывать одни и те же строки SQL-таблицы, провоцируя взаимные блокировки (deadlocks) или дублирование информации.

Ниже представлен типичный пример неэффективного кода, который часто пишут разработчики для опроса внешней таблицы:


// Пример неэффективного опроса таблицы через ВИД
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ВнешняяТаблица.Идентификатор КАК ID,
    |	ВнешняяТаблица.ДанныеЗаказа КАК Данные
    |ИЗ
    |	ВнешнийИсточникДанных.ВнешняяБД.Таблица.ОчередьОбмена КАК ВнешняяТаблица
    |ГДЕ
    |	ВнешняяТаблица.СтатусОбработки = ""Новый""";

РезультатЗапроса = Запрос.Выполнить();
// Далее следует перебор выборки и запись в 1С, что блокирует таблицу в SQL

---

Скрытые ограничения механизма «Внешние источники данных» в 1С

Помимо общих архитектурных недостатков, сам встроенный механизм ВИД в платформе 1С имеет ряд технических ограничений, о которых нужно помнить:

---

Развенчиваем миф о гарантированной доставке

Существует заблуждение: "Если мы записали данные в таблицу SQL, значит, они доставлены. Подтверждение получения не требуется". Это в корне неверно.

Гарантированная доставка — это не просто успешная фиксация транзакции записи во временную таблицу. Настоящая гарантированная доставка подразумевает, что принимающая сторона (в данном случае 1С) не просто "увидела" строку, но и успешно ее распарсила, провела по всем правилам бизнес-логики (например, создала проведенный документ РеализацияТоваровУслуг) и отправила отправителю статус: "Данные успешно применены, исходную запись можно удалить/архивировать". Если же в процессе проведения документа в 1С возникла ошибка (например, не хватило остатка товара на складе), транзакция на стороне SQL должна остаться в исходном состоянии, либо отправителю должно уйти сообщение об ошибке.

---

Современное и надежное решение: Брокеры сообщений (RabbitMQ)

Для построения надежного обмена информацией вместо прямых SQL-запросов следует использовать событийно-ориентированную интеграцию (EDA) с помощью брокеров сообщений, таких как RabbitMQ.

RabbitMQ — это бесплатное программное обеспечение с открытым исходным кодом, которое выступает интеллектуальным посредником между системами. Вместо записи в SQL-таблицу внешняя система отправляет сообщение (например, JSON-пакет) в очередь брокера. 1С считывает сообщения из очереди по мере своей готовности.

Преимущества использования RabbitMQ:

  1. Асинхронность и слабая связанность. Если сервер 1С временно недоступен (например, выполняется обновление базы), внешняя система продолжает бесперебойно отправлять данные в очередь. Как только 1С запустится, она плавно разберет накопившиеся сообщения.
  2. Отсутствие паразитного опроса СУБД. RabbitMQ сам сообщает подписчикам (1С) о появлении новых сообщений, избавляя базы данных от бесконечных бессмысленных SELECT-запросов.
  3. Встроенные механизмы подтверждения (ACK). Сообщение не удаляется из очереди до тех пор, пока 1С явным образом не подтвердит, что оно успешно обработано на уровне бизнес-логики.

Рассмотрим концептуальный пример того, как просто отправить сообщение в очередь RabbitMQ из 1С, используя стандартный REST API брокера:


// Пример отправки сообщения в очередь RabbitMQ через HTTP REST API
НТТРСоединение = HTTPСоединение("localhost", 15672, "guest", "guest");
НТТРЗапрос = Новый HTTPЗапрос("/api/exchanges/%2f/amq.default/publish");
НТТРЗапрос.Заголовки.Вставить("Content-Type", "application/json");

// Формируем JSON-пакет с полезной нагрузкой
ТелоЗапроса = 
"{
|  ""properties"": {},
|  ""routing_key"": ""orders_queue"",
|  ""payload"": ""{\""OrderID\"": 1024, \""Total\"": 5400.00}"",
|  ""payload_encoding"": ""string""
|}";

НТТРЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);
НТТПОтвет = НТТРСоединение.ОтправитьДляАнализа(НТТРЗапрос);

Если НТТПОтвет.КодСостояния = 200 Тогда
    ЗаписатьЛогСобытий("Данные успешно отправлены в брокер сообщений.");
КонецЕсли;

---

Промышленные шины данных: 1С:Шина и DATAREON MQ

Если проект масштабный, включает десятки баз данных и требует сложной маршрутизации, отличным решением станет использование готовых интеграционных шин (Enterprise Service Bus — ESB).

---

Когда все-таки можно использовать прямой обмен через SQL?

Было бы несправедливо сказать, что прямой обмен через СУБД или ВИД — это абсолютное зло в любой ситуации. Данный подход жизнеспособен, если выполняются следующие условия:

Резюме

Подводя итог, ответим на вопрос автора темы: обмен 1С с SQL через внешние источники для серьезных распределенных систем — это действительно не лучшее решение, несущее в себе риски снижения производительности СУБД и усложнения поддержки кода.

Для построения надежной ИТ-архитектуры рекомендуем придерживаться следующего правила: если вы интегрируете критически важные бизнес-процессы (заказы, остатки, цены), используйте брокеры сообщений (RabbitMQ) или специализированные шины данных (1С:Шина). Оставьте механизм ВИД исключительно для локальных, простых задач интеграции со специализированным оборудованием.

← На главную