Интеграция 1С с внешними системами через механизм Внешних источников данных (ВИД) — это мощный инструмент, который позволяет работать с таблицами SQL-серверов почти так же удобно, как с объектами метаданных 1С. Однако при работе с высоконагруженными системами, такими как СКУД (системы контроля и управления доступом), где события могут происходить ежесекундно, возникают вопросы производительности и надежности. В этой статье мы подробно разберем, как правильно выстроить процесс получения данных из MSSQL и MySQL, стоит ли «зеркалировать» данные в РегистрСведений и как избежать деградации производительности базы данных.
Первый вопрос, который встает перед разработчиком: стоит ли записывать данные во внутренний РегистрСведений или достаточно обращаться к внешнему источнику напрямую в момент формирования отчета? Рассмотрим оба варианта:
Проанализируем ситуацию: если заказчик настаивает на хранении данных в 1С, наша задача — сделать этот процесс максимально легким для системы. Разберем, как реализовать регламентную загрузку по шагам.
Для загрузки данных с частотой в 1 минуту идеально подходит механизм РегламентныеЗадания. Рассмотрим основные правила, которые помогут не «повесить» систему:
1. Фиксация момента последней загрузки.
Никогда не используйте локальное время сервера 1С для определения периода загрузки. Данные в SQL могут появиться с задержкой в несколько секунд. Мы должны сохранять время последнего успешно загруженного события из внешней базы.
2. Использование метода «Скользящего окна».
Для надежности рекомендуется при каждом запуске считывать данные с небольшим нахлестом (например, за последние 5 минут), даже если последняя загрузка была минуту назад. Это гарантирует, что записи, попавшие в SQL-базу с задержкой, не будут потеряны. При записи в РегистрСведений в 1С используйте замещение, чтобы не плодить дубли.
3. Групповая запись данных.
Запись каждой строки по отдельности в цикле — это путь к блокировкам и медленной работе. Правильно будет прочитать порцию данных из внешнего источника, поместить их в таблицу значений и записать в РС одним набором.
// Пример записи данных набором
НаборЗаписей = РегистрыСведений.СобытияСКУД.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата()); // Если нужно заместить за период
// Заполняем набор данными из внешней таблицы
Для Каждого СтрокаСобытия Из ТаблицаВнешнихДанных Цикл
НоваяЗапись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаСобытия);
КонецЦикла;
НаборЗаписей.Записать(Истина); // Использование замещения
При частом обращении к внешним базам критически важно переиспользовать открытые соединения. Мы рекомендуем выносить логику подключения в модуль с повторным использованием возвращаемых значений. Это позволит 1С не тратить время на авторизацию и «рукопожатие» с SQL-сервером при каждом вызове фонового задания.
Особое внимание уделим MySQL. При работе через ODBC-драйвер часто возникают проблемы с датами и кодировками. Разберем настройки строки подключения:
AllowZeroDatetime=True или no_datetime_string_conversion=1.CharSet=cp1251 или utf8.Если внешняя база данных позволяет вносить изменения в структуру, можно рассмотреть архитектуру с промежуточными таблицами на стороне SQL. Выясним причину, почему это эффективно:
На стороне MySQL или MSSQL настраивается триггер на вставку в основную таблицу событий. Этот триггер копирует только нужные для 1С поля в специальную «обменную» таблицу. 1С читает эту таблицу, забирает данные и очищает её (или помечает записи как прочитанные). Это минимизирует нагрузку на «боевые» таблицы СКУД и защищает их от блокировок со стороны 1С.
При чтении данных напрямую из таблиц СКУД, которые постоянно обновляются, можно столкнуться с тем, что запрос 1С блокирует работу турникетов. Чтобы этого избежать, при создании запросов к внешнему источнику (если вы используете прямые SQL-запросы через ADODB.Connection) используйте уровень изоляции Read Uncommitted или хинт WITH (NOLOCK) в MSSQL.
Если 1С сама работает на MSSQL, можно настроить Linked Server. Это позволит обращаться к MySQL прямо из контекста вашего основного SQL-сервера. В этом случае в 1С настраивается только один внешний источник (ваш же MSSQL), который через представления (Views) «пробрасывает» данные из других баз. Это значительно упрощает настройку прав и администрирование драйверов на сервере приложений.
Проанализировав ситуацию с накоплением данных, мы рекомендуем следующий план действий:
РегистраСведений 1С (например, храните данные только за последние 3 месяца). Это предотвратит бесконтрольный рост базы.Попытка...Исключение. При обрыве связи регламентное задание не должно зависать; оно должно корректно завершиться и повторить попытку в следующем цикле.Таким образом, использование внешних источников данных вместе с грамотно настроенным механизмом кэширования в регистрах сведений позволяет создать надежную и отказоустойчивую систему отчетности, не жертвуя производительностью основной базы 1С.