При попытке выгрузить большой массив данных (например, отбор по журналу регистрации за месяц объемом в 500–700 тысяч строк) через стандартную команду «Вывести список» толстый клиент 1С может зависнуть на часы или завершить работу с критической ошибкой. Разберем причины такого поведения платформы и рассмотрим эффективные варианты быстрой выгрузки данных без перегрузки оперативной памяти.
Проанализируем техническую сторону работы штатного механизма:
ТабличныйДокумент. Каждая ячейка такого документа хранит метаданные о форматировании, шрифтах, границах и типах данных. Для таблицы в 700 000 строк это требует нескольких гигабайт памяти.Самый быстрый и надежный программный способ выгрузить сотни тысяч записей — использовать метод ВыгрузитьЖурналРегистрации() с последующей потоковой записью строк в текстовый файл формата CSV через объект ЗаписьCSV или ЗаписьТекста. Чтобы не переполнять оперативную память, чтение выполняется порциями (по дням или с ограничением по количеству строк).
Рассмотрим пример кода обработки, которая читает журнал регистрации порциями и сразу сбрасывает данные на диск:
ФильтрЖР = Новый Структура;
ФильтрЖР.Вставить("ДатаНачала", НачалоДня(ПериодНачала));
ФильтрЖР.Вставить("ДатаОкончания", КонецДня(ПериодОкончания));
ЗаписьФайла = Новый ЗаписьТекста("C:\Export\LogData.csv", КодировкаТекста.UTF8);
// Записываем заголовок CSV
ЗаписьФайла.ЗаписатьСтроку("Дата;Пользователь;Событие;ПредставлениеДанных;Комментарий");
ТекущаяДатаСреза = НачалоДня(ПериодНачала);
Пока ТекущаяДатаСреза <= КонецДня(ПериодОкончания) Цикл
ФильтрЖР.ДатаНачала = ТекущаяДатаСреза;
ФильтрЖР.ДатаОкончания = КонецДня(ТекущаяДатаСреза);
ВременнаяТаблицаЖР = Новый ТаблицаЗначений;
// Обязательно указываем только нужные колонки для экономии памяти
ВыгрузитьЖурналРегистрации(ВременнаяТаблицаЖР, ФильтрЖР, "Дата, Пользователь, Событие, ПредставлениеДанных, Комментарий");
Для Каждого СтрЛога Из ВременнаяТаблицаЖР Цикл
ТекстСтроки = СтрШаблон("%1;%2;%3;%4;%5",
Формат(СтрЛога.Дата, "ДФ=yyyy-MM-dd HH:mm:ss"),
СтрЛога.Пользователь,
СтрЛога.Событие,
СтрЗаменить(СтрЛога.ПредставлениеДанных, ";", ","),
СтрЗаменить(СтрЛога.Комментарий, ";", ",")
);
ЗаписьФайла.ЗаписатьСтроку(ТекстСтроки);
КонецЦикла;
ВременнаяТаблицаЖР.Очистить();
ТекущаяДатаСреза = ТекущаяДатаСреза + 86400; // переход к следующим суткам
КонецЦикла;
ЗаписьФайла.Закрыть();
Потоковая запись позволяет выгрузить 700 000 строк за считанные минуты, так как объем оперативной памяти фиксирован размером суточной порции записей.
Если данные необходимо выгрузить без написания циклов форматирования строк, можно передать путь к целевому файлу первым параметром в метод ВыгрузитьЖурналРегистрации(). В этом случае платформа производит запись напрямую в файл XML, минуя клиентскую память и экранные формы:
ФильтрЖР = Новый Структура;
ФильтрЖР.Вставить("ДатаНачала", ПериодНачала);
ФильтрЖР.Вставить("ДатаОкончания", ПериодОкончания);
// Передаем путь к файлу XML вместо ТаблицыЗначений
ВыгрузитьЖурналРегистрации("C:\Export\EventLogExport.xml", ФильтрЖР, "Дата, Пользователь, Событие, ПредставлениеДанных");
Такой файл создается значительно быстрее, чем экранная форма, и может быть легко обработан внешними парсерами или загружен в другие аналитические базы данных.
Если требуется интерактивный анализ без ручного написания обработок, рекомендуется использовать специализированные внешние инструменты:
В современных версиях платформы 1С при использовании нового (единого) формата журнала регистрации логи хранятся в файле 1Cv8.lgd, который представляет собой стандартную базу данных SQLite. К этому файлу можно обратиться напрямую:
1Cv8.lgd находится в каталоге журнала регистрации на сервере 1С:Предприятия.Для старого разделенного формата журнала (файлы .lgp и .lgf) аналогичный результат достигается прямым парсингом текстовых файлов с помощью скриптов.