Как организовать загрузку данных из внешних баз MSSQL и MySQL в 1С через внешние источники данных?

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

Интеграция 1С с внешними системами через механизм Внешних источников данных (ВИД) — это мощный инструмент, который позволяет работать с таблицами SQL-серверов почти так же удобно, как с объектами метаданных 1С. Однако при работе с высоконагруженными системами, такими как СКУД (системы контроля и управления доступом), где события могут происходить ежесекундно, возникают вопросы производительности и надежности. В этой статье мы подробно разберем, как правильно выстроить процесс получения данных из MSSQL и MySQL, стоит ли «зеркалировать» данные в РегистрСведений и как избежать деградации производительности базы данных.

Выбор архитектуры: Прямой запрос или хранение в 1С

Первый вопрос, который встает перед разработчиком: стоит ли записывать данные во внутренний РегистрСведений или достаточно обращаться к внешнему источнику напрямую в момент формирования отчета? Рассмотрим оба варианта:

  1. Прямое чтение через ВИД: Если данные нужны только для отчета, это кажется самым простым путем. Однако, если одна из внешних баз (например, в удаленном офисе в Санкт-Петербурге) станет недоступна, отчет не сформируется вовсе. Кроме того, сложные запросы к внешним источникам через механизм 1С могут работать медленнее, чем к родным таблицам.
  2. Промежуточный Регистр Сведений (РС): Запись данных в 1С обеспечивает автономность. Отчеты будут работать мгновенно, даже если каналы связи с внешними базами оборвутся. Основной минус — рост объема базы 1С за счет «мусорных» данных СКУД.

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

Организация регламентной загрузки данных

Для загрузки данных с частотой в 1 минуту идеально подходит механизм РегламентныеЗадания. Рассмотрим основные правила, которые помогут не «повесить» систему:

1. Фиксация момента последней загрузки.
Никогда не используйте локальное время сервера 1С для определения периода загрузки. Данные в SQL могут появиться с задержкой в несколько секунд. Мы должны сохранять время последнего успешно загруженного события из внешней базы.

2. Использование метода «Скользящего окна».
Для надежности рекомендуется при каждом запуске считывать данные с небольшим нахлестом (например, за последние 5 минут), даже если последняя загрузка была минуту назад. Это гарантирует, что записи, попавшие в SQL-базу с задержкой, не будут потеряны. При записи в РегистрСведений в 1С используйте замещение, чтобы не плодить дубли.

3. Групповая запись данных.
Запись каждой строки по отдельности в цикле — это путь к блокировкам и медленной работе. Правильно будет прочитать порцию данных из внешнего источника, поместить их в таблицу значений и записать в РС одним набором.


// Пример записи данных набором
НаборЗаписей = РегистрыСведений.СобытияСКУД.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата()); // Если нужно заместить за период
// Заполняем набор данными из внешней таблицы
Для Каждого СтрокаСобытия Из ТаблицаВнешнихДанных Цикл
    НоваяЗапись = НаборЗаписей.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаСобытия);
КонецЦикла;
НаборЗаписей.Записать(Истина); // Использование замещения

Оптимизация соединений и работа с драйверами

При частом обращении к внешним базам критически важно переиспользовать открытые соединения. Мы рекомендуем выносить логику подключения в модуль с повторным использованием возвращаемых значений. Это позволит 1С не тратить время на авторизацию и «рукопожатие» с SQL-сервером при каждом вызове фонового задания.

Особое внимание уделим MySQL. При работе через ODBC-драйвер часто возникают проблемы с датами и кодировками. Разберем настройки строки подключения:

Использование триггеров и промежуточных таблиц

Если внешняя база данных позволяет вносить изменения в структуру, можно рассмотреть архитектуру с промежуточными таблицами на стороне SQL. Выясним причину, почему это эффективно:

На стороне MySQL или MSSQL настраивается триггер на вставку в основную таблицу событий. Этот триггер копирует только нужные для 1С поля в специальную «обменную» таблицу. 1С читает эту таблицу, забирает данные и очищает её (или помечает записи как прочитанные). Это минимизирует нагрузку на «боевые» таблицы СКУД и защищает их от блокировок со стороны 1С.

Борьба с блокировками в MSSQL

При чтении данных напрямую из таблиц СКУД, которые постоянно обновляются, можно столкнуться с тем, что запрос 1С блокирует работу турникетов. Чтобы этого избежать, при создании запросов к внешнему источнику (если вы используете прямые SQL-запросы через ADODB.Connection) используйте уровень изоляции Read Uncommitted или хинт WITH (NOLOCK) в MSSQL.

Если 1С сама работает на MSSQL, можно настроить Linked Server. Это позволит обращаться к MySQL прямо из контекста вашего основного SQL-сервера. В этом случае в 1С настраивается только один внешний источник (ваш же MSSQL), который через представления (Views) «пробрасывает» данные из других баз. Это значительно упрощает настройку прав и администрирование драйверов на сервере приложений.

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

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

  1. Регламентное задание: Запуск раз в 1-5 минут.
  2. Очистка: Внедрите механизм автоматического удаления старых записей из РегистраСведений 1С (например, храните данные только за последние 3 месяца). Это предотвратит бесконтрольный рост базы.
  3. Обработка ошибок: Весь код обращения к внешнему источнику должен быть обернут в конструкцию Попытка...Исключение. При обрыве связи регламентное задание не должно зависать; оно должно корректно завершиться и повторить попытку в следующем цикле.

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

← На главную