Как организовать хранение и отображение больших массивов загружаемых данных в 1С?

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

Часто при интеграции со сторонними системами возникает задача регулярного импорта больших объемов информации. Проанализируем типичную ситуацию: каждые полчаса в базу загружается 2500 и более строк, каждая из которых содержит 25+ полей. Иногда данные полностью идентичны предыдущей загрузке. Если попытаться сохранить всё это в табличную часть одного документа, мы столкнемся с серьезными проблемами: интерфейс превращается в нечитаемое месиво, база данных стремительно разрастается, а производительность падает. Рассмотрим по шагам, как грамотно организовать структуру хранения и отображения таких данных в 1С.

Отказ от документов в пользу регистров сведений

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

Рекомендуется не загружать "лишний хлам" в 1С через громоздкие табличные части, а писать данные напрямую в Независимый регистр сведений. Если загружаемые данные содержат текстовые идентификаторы, которые нужно связать со справочниками (например, контрагентами или номенклатурой), сопоставление следует выполнять в оперативной памяти сервера с использованием объекта Соответствие или заранее закешированных таблиц. В сам регистр записываются уже готовые ссылки.

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

Оптимизация дублей: хэширование и платформенные механизмы

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

  1. Сверка по хэшу: Вы можете формировать из всех 25 колонок каждой строки единую хэш-строку и сверять ее с хэшем уже существующих записей. Если хэши совпадают — мы просто игнорируем строку и не грузим ее.
  2. Использование новых режимов записи: В последних версиях платформы (начиная с 8.3.26) появились режимы Слияние и Обновление для наборов записей регистров.

Посмотрим на пример использования платформенного механизма замещения при записи в регистр:


НаборЗаписей = РегистрыСведений.ЗагруженныеДанныеИнтеграции.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата());

// Заполнение набора новыми данными...
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Поле1 = Значение1;

// Запись с использованием режима слияния (платформа сама обновит только измененные строки)
НаборЗаписей.Записать(Истина, РежимЗамещенияОбновлениеЗаписей.Слияние);

Сохранение исходных файлов в «Хранилище значений»

Если сырые данные требуются для истории, аудита или расследования инцидентов, совершенно необязательно создавать под них огромную структуру метаданных. Исходный пакет (JSON, XML или CSV) целесообразно сохранять в базу в сжатом виде, используя тип данных ХранилищеЗначений.

При таком подходе мы парсим данные один раз — нужные для оперативной работы значения сразу пишутся в регистр, а сам исходный файл компактно ложится в реквизит с типом ХранилищеЗначений. Извлекать и показывать эти данные пользователю можно только по требованию (по нажатию специальной кнопки).

Решение проблемы нечитаемого интерфейса (25+ колонок)

Разберем ситуацию, когда пользователю действительно нужно просматривать и анализировать этот огромный массив. Открывать документ с табличной частью на 25+ полей — это плохой пользовательский опыт. Колонки не помещаются на экран, появляются бесконечные горизонтальные прокрутки. Существует несколько способов организовать интерфейс более элегантно:

  1. Использование отчетов: Большие массивы данных лучше всего анализировать с помощью Системы Компоновки Данных (СКД). Отчеты позволяют пользователю самому настраивать группировки, отборы и видимость нужных колонок, не перегружая формы документов.
  2. Архитектура Master-Detail (Панель свойств): В основной таблице на форме (например, динамическом списке, читающем регистр) выведите только 5–7 самых важных полей: статус, дату, ключевой идентификатор, сумму. Рядом расположите отдельную панель (или вкладку), где в виде вертикального списка будут отображаться все 25+ реквизитов для текущей выделенной строки.
  3. Группировка колонок в управляемой форме: Если таблица необходима, объединяйте колонки в логические группы (например, «Логистика», «Финансы», «Служебные данные»). Платформа 1С позволяет сворачивать такие группы, освобождая место на экране.
  4. Поле HTML-документа: Для сложных визуализаций можно использовать элемент ПолеHTMLДокумента. Средствами веб-технологий можно отрисовать красивую таблицу с замороженными колонками и подсветкой изменений между загрузками.

Порционная обработка данных

При загрузке 2500 строк каждые полчаса важно помнить про оптимизацию серверных вызовов и блокировок. Не пытайтесь записывать все данные построчно в цикле — это крайне медленно. Также опасно пытаться записать огромный массив данных одной гигантской транзакцией.

Рассмотрим правильный подход: разбивайте загружаемый массив на порции (например, по 500 или 1000 записей) и выполняйте запись наборов данных пакетами. Это обеспечит оптимальный баланс между скоростью работы базы данных 1С и нагрузкой на оборудование, а также снизит вероятность таймаутов на блокировках при многопользовательской работе.

← На главную