Как ускорить синхронизацию данных при передаче документов с огромным количеством проводок в 1С

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

В крупных отраслевых решениях, таких как «1С:Бухгалтерия сельскохозяйственного предприятия» (Агрокомплекс), специалисты часто сталкиваются с проблемой экстремальной нагрузки на механизмы синхронизации в периоды закрытия отчетных периодов. Специфика агропромышленного сектора такова, что основные затраты распределяются в конце года, что порождает документы Регламентная операция с сотнями тысяч бухгалтерских проводок. При использовании стандартного механизма синхронизации данных через формат Enterprise Data или FTP-ресурс такие объемы могут передаваться неделями, блокируя при этом передачу оперативной информации (НСИ, платежные поручения, накладные).

Разберем детально, почему так происходит и какие технические и методологические приемы помогут нам решить эту задачу эффективно.

Анализ причин низкой производительности

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

  1. Огромный объем XML: Каждая проводка со всеми субконто превращается в громоздкий узел XML-файла. Файл может достигать сотен мегабайт.
  2. Затраты на чтение/запись: Чтение такого файла парсером на стороне приемника (например, в «1С:Управление холдингом») требует колоссальных ресурсов оперативной памяти.
  3. Очередь обмена: Пока система обрабатывает один «тяжелый» файл, все остальные данные (новые контрагенты, текущие документы) стоят в очереди, что парализует работу холдинга.

Решение 1: Разделение планов обмена и использование КД 2.0

Рассмотрим вариант выноса тяжелых документов в отдельный поток. Вместо того чтобы пытаться «протолкнуть» регламентные операции через типовую синхронизацию, мы можем создать отдельный план обмена. В этом случае мы разделим потоки данных.

Для реализации этого подхода выполним следующие шаги:

  1. Создадим в Конвертации данных 2.0 правила обмена только для документа Регламентная операция.
  2. Настроим в базах отдельный узел обмена, где в составе объектов будет только этот тип документа.
  3. Запустим выгрузку этого узла в ночное время или на отдельном сервере.

Это позволит оперативной информации (НСИ, документы текущего дня) передаваться по основному каналу без задержек.

Решение 2: Агрегация (свертка) данных при выгрузке

Проанализируем ситуацию с точки зрения методологии. Действительно ли в центральной базе (УХ) необходима детализация до каждого поля, культуры или конкретной партии семян в каждой из 100 000 проводок? Зачастую для управленческого учета в холдинге достаточно агрегированных данных.

Мы можем доработать алгоритм выгрузки так, чтобы проводки сворачивались по ключевым аналитикам:

Такая свертка может сократить количество строк с 100 000 до 2 000–3 000, что моментально решит проблему скорости передачи без потери качества учета в центральной базе.

Решение 3: Передача данных через промежуточные файлы (Text/CSV)

Если нам всё же необходимо передать все 100 000 проводок «один в один», то формат XML становится главным врагом. Рассмотрим вариант использования простых текстовых форматов или CSV. В этом случае мы передаем в синхронизации только «шапку» документа, а его табличную часть (движения) переносим отдельно.

Алгоритм действий следующий:

  1. В базе-источнике создаем обработку, которая выгружает движения документа в текстовый файл с разделителями.
  2. В базе-приемнике создаем аналогичную обработку загрузки, которая считывает файл и записывает набор записей регистра бухгалтерии напрямую.

Пример кода для быстрой записи движений в приемнике:


НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

// Читаем данные из файла и заполняем набор
Пока Файл.ПрочитатьСтроку() Цикл
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.Период = ДатаИзФайла;
    // Заполнение остальных полей...
КонецЦикла;

НаборЗаписей.Записать(Истина); // Флаг Истина позволяет быстро перезаписать движения

Использование НабораЗаписей с прямой записью минуя объектную модель документа работает в десятки раз быстрее, чем стандартная загрузка через XDTO.

Решение 4: Оптимизация транспорта и использование FastInfoSet

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

Начиная с современных версий платформы 8.3, для обмена данными можно использовать бинарный формат FastInfoSet. Он значительно эффективнее обычного XML, так как сжимает данные на лету и быстрее обрабатывается парсером. Для этого в настройках подключения (если используется веб-сервис или прямой обмен) необходимо активировать соответствующие параметры. Однако помните, что при обмене через FTP мы все равно ограничены скоростью записи и чтения файла на диск.

Резюме и рекомендации

Подведем итог нашему анализу. Если синхронизация в «Агрокомплексе» не справляется с годовым закрытием, мы рекомендуем:

  1. В первую очередь: Оценить возможность свертки (агрегации) проводок. Это самый правильный путь с точки зрения архитектуры данных холдинга.
  2. Во вторую очередь: Разделить планы обмена. Пусть тяжелые документы закрытия года идут «своим путем», не мешая оперативной работе пользователей.
  3. Технический хак: Использовать выгрузку в текстовый файл для движений документа, если бизнес-требования запрещают свертку данных. Это позволит избежать перегрузки оперативной памяти при сериализации XML.

Выбрав один из этих путей, мы обеспечим стабильную работу системы даже в самые напряженные периоды отчетности.

← На главную