Как эффективно работать с большими объемами данных в 1С: загрузка, хранение и поиск

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

При работе с внешними данными, например, при импорте 15 файлов Excel объемом от 150 000 до 800 000 строк каждый, разработчик неизбежно сталкивается с проблемой производительности. Суммарный объем данных может достигать 10 миллионов записей. В такой ситуации стандартные методы 1С могут работать крайне медленно. Проанализируем, как правильно организовать структуру хранения, ускорить запись и оптимизировать последующий поиск по этим данным.

Выбор структуры хранения: Справочник или Регистр сведений?

Первый вопрос, который возникает: где хранить такие объемы? Сравним Справочники и РегистрыСведений. Разберем ситуацию подробно.

Для хранения "плоских" данных (набор колонок без сложной иерархии) Регистр сведений (непериодический, независимый) является более предпочтительным по следующим причинам:

  1. Отсутствие избыточности: У справочника всегда есть системные поля: Ссылка, Код, Наименование, ПометкаУдаления, Предопределенный. На 10 миллионах строк эти поля создадут огромную паразитную нагрузку на дисковую подсистему и оперативную память. У регистра сведений таких полей нет — вы создаете только те измерения и ресурсы, которые вам действительно нужны.
  2. Кластерный индекс: В регистре сведений измерения (Dimensions) автоматически входят в кластерный индекс. Если правильно подобрать порядок измерений, поиск будет выполняться максимально быстро на уровне СУБД.
  3. Скорость очистки: Удаление данных из независимого регистра сведений через запись пустого набора записей происходит быстрее, чем удаление миллионов объектов справочника, для каждого из которых СУБД должна проверять ссылки и обновлять индексы.

Методы ускорения загрузки данных (Bulk Loading)

Загрузка миллионов строк по одной записи через метод Записать() — это путь к многочасовому ожиданию. Рассмотрим, как ускорить этот процесс.

Во-первых, при работе внутри 1С обязательно используйте режим загрузки данных. Это отключает проверки в модулях объектов и значительно снижает нагрузку на сервер. Посмотрим на пример кода для записи набора записей регистра:


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

Во-вторых, если база данных работает на MS SQL Server, можно использовать механизм BULK INSERT. Это прямая загрузка данных в таблицу СУБД из текстового файла, минуя объектную модель 1С. Для PostgreSQL аналогичным высокопроизводительным инструментом является команда COPY. Проанализируем ситуацию: использование этих команд позволяет загружать миллионы строк за секунды, однако требует аккуратности, так как данные попадают в обход бизнес-логики 1С.

Оптимизация поиска по двум колонкам

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

  1. Составной индекс: Если вы используете Регистр сведений, сделайте оба поля поиска Измерениями. 1С создаст индекс, включающий эти поля. Важно: поле с большей селективностью (где больше уникальных значений) должно идти первым в списке измерений.
  2. Использование Хеширования: Если строки очень длинные, поиск по ним будет медленным даже с индексами. Рекомендуется создать дополнительное поле (например, типа Число), куда при записи сохранять результат функции Hash(Строка1 + Строка2). Поиск по числовому хешу в разы быстрее, чем по текстовым полям. При совпадении хеша нужно будет лишь дополнительно проверить строки на точное соответствие.
  3. Покрывающие индексы: На уровне SQL Server можно создать индекс, который включает в себя не только поля поиска, но и значения, которые вы хотите получить (через конструкцию INCLUDE). Это позволит СУБД найти ответ прямо в дереве индекса, не обращаясь к основной таблице данных (Data Pages).

Как быстро удалять данные?

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

В среде 1С для полной очистки независимого регистра сведений достаточно записать пустой набор без установки отборов:


Набор = РегистрыСведений.ВашРегистр.СоздатьНаборЗаписей();
Набор.Записать(Истина); // Параметр Истина очищает все данные в регистре

Если же данные загружены в буферную таблицу напрямую в SQL, используйте команду TRUNCATE TABLE. В отличие от DELETE, эта команда не записывает удаление каждой строки в лог транзакций, а просто освобождает страницы памяти, что делает операцию мгновенной.

Дополнительные рекомендации по архитектуре

Разберем еще несколько важных моментов, которые помогут при работе с 15 тяжелыми файлами Excel:

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

← На главную