При интеграции 1С с внешними системами (например, с базами на платформе 7.7 или сторонними веб-приложениями) у разработчиков часто возникает соблазн записывать данные напрямую в таблицы SQL-сервера. Кажется, что это самый быстрый способ, позволяющий обойти медленные механизмы платформы. Однако такой подход скрывает в себе множество критических рисков. В этой статье мы проанализируем, почему прямая запись в 1С может привести к краху системы, и рассмотрим современные безопасные способы решения этой задачи.
Рассмотрим подробнее, с какими проблемами столкнется система, если данные попадут в базу в обход сервера приложений 1С:
_InfoRg123 для регистра сведений) не фиксированы. При выполнении реструктуризации базы данных (даже если вы просто добавили новый реквизит в другой справочник) платформа может пересоздать нужную вам таблицу под другим именем. Это мгновенно выведет из строя все ваши прямые SQL-запросы.Binary(16). Однако порядок байтов в 1С отличается от стандартного представления в SQL. При записи из внешних систем (особенно из 7.7) необходимо выполнять специфический «разворот» групп символов в бинарном представлении, иначе ссылки в системе окажутся «битыми».Самый современный и надежный способ интеграции — создание собственного API внутри базы 1С 8.3. Рассмотрим, почему это выгодно:
Во-первых, при использовании HTTP-сервисов или Web-сервисов данные обрабатываются штатным кодом 1С. Это гарантирует автоматический сброс кэша, соблюдение всех блокировок и выполнение проверок в модулях набора записей. Во-вторых, это позволяет скрыть внутреннюю структуру таблиц SQL от внешней системы.
Если вам нужно передать данные из 1С 7.7, вы можете вызвать созданный в 8.3 веб-сервис. Хотя в 7.7 нет встроенной поддержки веб-сервисов, задачу можно решить с помощью использования объекта MSXML2.ServerXMLHTTP или аналогичных COM-объектов. Проанализируем примерную схему взаимодействия:
POST.JSON или XML с данными для записи.РегистрСведенийМенеджер.СоздатьНаборЗаписей()) и возвращает результат.Если вы не хотите писать собственный код для сервисов, можно воспользоваться стандартным интерфейсом 1С — OData. Это готовый REST-интерфейс, который позволяет выполнять любые CRUD-операции (создание, чтение, обновление, удаление) с объектами базы.
Для работы с OData достаточно опубликовать базу на веб-сервере (Apache или IIS) и разрешить доступ к конкретным объектам в настройках. Это значительно быстрее, чем использование COM-соединения, и безопаснее, чем прямая работа с SQL. Посмотрим на преимущества:
В ситуациях, когда необходимо видеть данные из сторонней SQL-базы (например, из базы 7.7) внутри 1С 8.3, лучше всего использовать механизм Внешних источников данных. Выясним, как это работает:
Вы подключаете таблицы внешней БД к конфигурации 8.3. После этого вы можете работать с ними практически как с родными объектами 1С: строить запросы, выводить данные в отчеты и даже программно изменять их. Это избавляет от необходимости дублировать данные и позволяет избежать конфликтов с сервером приложений.
Если производительность является критическим фактором, и вы опасаетесь, что запись через веб-сервис будет медленной, разберем архитектуру с использованием промежуточной таблицы. Вы можете создать простую «транзитную» таблицу в SQL, в которую внешняя система (7.7) будет очень быстро сбрасывать данные. В самой 1С 8.3 настраивается РегламентноеЗадание, которое с небольшим интервалом (например, каждые 10 секунд) считывает данные из этой таблицы и штатно записывает их в целевой регистр.
Такой подход обеспечивает:
Важный итог: Прямая запись в SQL оправдана только в исключительных случаях экстремальных нагрузок, когда все остальные методы исчерпаны, и при условии, что разработчик полностью понимает внутреннее устройство движка 1С. Во всех остальных случаях использование HTTP-сервисов или OData является более правильным, надежным и поддерживаемым решением.