При работе с внешними данными, например, при импорте 15 файлов Excel объемом от 150 000 до 800 000 строк каждый, разработчик неизбежно сталкивается с проблемой производительности. Суммарный объем данных может достигать 10 миллионов записей. В такой ситуации стандартные методы 1С могут работать крайне медленно. Проанализируем, как правильно организовать структуру хранения, ускорить запись и оптимизировать последующий поиск по этим данным.
Первый вопрос, который возникает: где хранить такие объемы? Сравним Справочники и РегистрыСведений. Разберем ситуацию подробно.
Для хранения "плоских" данных (набор колонок без сложной иерархии) Регистр сведений (непериодический, независимый) является более предпочтительным по следующим причинам:
Ссылка, Код, Наименование, ПометкаУдаления, Предопределенный. На 10 миллионах строк эти поля создадут огромную паразитную нагрузку на дисковую подсистему и оперативную память. У регистра сведений таких полей нет — вы создаете только те измерения и ресурсы, которые вам действительно нужны.Загрузка миллионов строк по одной записи через метод Записать() — это путь к многочасовому ожиданию. Рассмотрим, как ускорить этот процесс.
Во-первых, при работе внутри 1С обязательно используйте режим загрузки данных. Это отключает проверки в модулях объектов и значительно снижает нагрузку на сервер. Посмотрим на пример кода для записи набора записей регистра:
НаборЗаписей = РегистрыСведений.ВашРегистр.СоздатьНаборЗаписей();
НаборЗаписей.ОбменДанными.Загрузка = Истина;
// Заполняем набор порциями, например, по 5000 строк
Для Каждого СтрокаДанных Из ТаблицаФайла Цикл
НоваяЗапись = НаборЗаписей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяЗапись, СтрокаДанных);
Если НаборЗаписей.Количество() >= 5000 Тогда
НаборЗаписей.Записать(Ложь); // Ложь - чтобы не очищать весь регистр
НаборЗаписей.Очистить();
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать(Ложь);
Во-вторых, если база данных работает на MS SQL Server, можно использовать механизм BULK INSERT. Это прямая загрузка данных в таблицу СУБД из текстового файла, минуя объектную модель 1С. Для PostgreSQL аналогичным высокопроизводительным инструментом является команда COPY. Проанализируем ситуацию: использование этих команд позволяет загружать миллионы строк за секунды, однако требует аккуратности, так как данные попадают в обход бизнес-логики 1С.
Поиск по строковым полям в больших таблицах — ресурсоемкая операция. Выясним, как сделать его мгновенным. Рассмотрим три варианта оптимизации:
Число), куда при записи сохранять результат функции Hash(Строка1 + Строка2). Поиск по числовому хешу в разы быстрее, чем по текстовым полям. При совпадении хеша нужно будет лишь дополнительно проверить строки на точное соответствие.INCLUDE). Это позволит СУБД найти ответ прямо в дереве индекса, не обращаясь к основной таблице данных (Data Pages).Проанализируем способы очистки базы после завершения обработки. Стандартное удаление через Запрос и цикл — худший вариант. Рассмотрим альтернативы:
В среде 1С для полной очистки независимого регистра сведений достаточно записать пустой набор без установки отборов:
Набор = РегистрыСведений.ВашРегистр.СоздатьНаборЗаписей();
Набор.Записать(Истина); // Параметр Истина очищает все данные в регистре
Если же данные загружены в буферную таблицу напрямую в SQL, используйте команду TRUNCATE TABLE. В отличие от DELETE, эта команда не записывает удаление каждой строки в лог транзакций, а просто освобождает страницы памяти, что делает операцию мгновенной.
Разберем еще несколько важных моментов, которые помогут при работе с 15 тяжелыми файлами Excel:
ФоновыеЗадания. Запустите 3-5 фоновых заданий, каждое из которых будет обрабатывать свою часть файлов. Это позволит максимально эффективно использовать ресурсы многоядерного сервера.Excel.Application крайне медленно и нестабильно. Рекомендуем предварительно конвертировать файлы в формат CSV или использовать чтение через ТабличныйДокумент (если формат позволяет) или внешние компоненты (например, на базе LibXL).Подводя итог, можно сказать, что для работы с миллионами строк в 1С наиболее эффективным решением будет использование независимого регистра сведений, запись данных порциями с отключенными проверками и оптимизация поиска через числовые хеш-суммы или грамотно настроенные индексы на уровне СУБД.