Выгрузка конфигурации в XML за 35 секунд, и каждый байт совпадает

27.10.26

Интеграция - Файловый обмен (TXT, XML, DBF), FTP

Выгрузка типовой Бухгалтерии в XML через базу занимает больше четырёх минут. Я написал движок, который читает файл конфигурации напрямую и выгружает его за 35 секунд, совпадая с выгрузкой платформы байт в байт во всех 90 385 файлах. Загрузка обратно тоже работает: круг через платформу совпадает полностью. Рассказываю, как ускоряли, как проверяем и что при загрузке XML теряет сама платформа. А в конце спрашиваю, нужно ли это кому-то, кроме меня, и на какой конфигурации проверить следующей.

Кофе даже не успевает остыть

Кофе даже не успевает остыть

 

Кто хранит конфигурацию в git, гоняет проверки в CI или работает в EDT, знает эту паузу. Нужна выгрузка в XML - запускаешь, идёшь за кофе, возвращаешься, а она ещё идёт. На типовой Бухгалтерии это больше четырёх минут: сначала загрузить файл конфигурации в базу, потом выгрузить из базы.

Я написал свой движок, который читает файл конфигурации напрямую, без базы, и выгружает его в XML. На той же Бухгалтерии это 35 секунд. Результат совпадает с выгрузкой платформы байт в байт, все 90 385 файлов. Ниже - цифры, как удалось ускорить, как проверяли и что неожиданного нашлось по дороге. В конце - несколько вопросов к вам: хочу понять, нужно ли это кому-то, кроме меня.

Откуда вообще взялся движок, я рассказывал на Хабре в статье "Я просто хотел тёмную тему". Коротко: хотел тёмную тему в среде разработки, а пришлось научиться читать файл конфигурации.

 

Цифры

Мерил на типовой Бухгалтерии предприятия 3.0.171.23: файл 1,02 ГБ, почти 15 тысяч объектов верхнего уровня, 90 385 файлов в выгрузке. Ryzen 5 7500F (6 ядер), 64 ГБ памяти, SATA SSD, Windows 11, платформа 8.5.1.1529.

 

Открыть файл - в 48 раз быстрее, выгрузить всё в XML - в 5,3 раза, поменять свойство и записать файл - в 6,7 раза

Открыть файл - в 48 раз быстрее, выгрузить всё в XML - в 5,3 раза, поменять свойство и записать файл - в 6,7 раза

 

У движка в таблице медиана трёх прогонов, у платформы - один прогон каждой команды (они долгие, и базу каждый раз надо создавать заново). Время - процесс целиком: запуск, чтение файла, запись результата. Во время замера на машине шли другие сборки, без них выгрузка всей Бухгалтерии занимает 32 секунды.

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

 

Почему так быстро

Чудес нет, есть три обычные вещи.

Работа по ядрам. Объекты верхнего уровня выгружаются независимо друг от друга, так что их можно раздать по потокам. Тут же вылезла первая мелочь: один большой регламентированный отчёт выгружается три-пять секунд, и если он попадает в очередь последним, все потоки уже свободны, а он один держит конец выгрузки. Поэтому крупные объекты раздаются первыми - размер оцениваем по сжатому объёму их записей. Сам переход на потоки дал больше всего: было 3 минуты 58 секунд, стало 32 секунды.

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

Один квадратичный обход. Табличные документы (макеты) поначалу записывались так: на каждый номер строки перебирались все строки. На мелких макетах незаметно, а у Бухгалтерии есть макеты на тысячи строк. Поиск строки по номеру через таблицу вместо перебора: было 68 секунд процессорного времени только на макеты, стало 17.

Открытие файла ускорено так же: описания объектов разбираются параллельно, а вставляются в дерево в прежнем порядке, чтобы дерево не зависело от того, какой поток успел первым.

 

Открытый файл в окне движка: дерево, модуль, свойства. Конфигурация на снимке демонстрационная

Открытый файл в окне движка: дерево, модуль, свойства. Конфигурация на снимке демонстрационная

 

Как проверяем, что это та же выгрузка

Быстро выгрузить что-то похожее - несложно. Сложно выгрузить то же самое. Правило у меня одно: без потерь или ошибка.

После каждого изменения вся Бухгалтерия выгружается заново и сравнивается с выгрузкой платформы файл за файлом, байт за байтом. Не "по смыслу то же", а именно байты: порядок элементов, пробелы, переводы строк. Сейчас совпадают 90 385 из 90 385 файлов.

Сама сверка поначалу шла 13 минут, и это быстро стало главным тормозом: проверять хочется после каждой правки. Файлы теперь читаются по потокам, и сверка занимает 2 минуты 17 секунд.

 

Проверка в обе стороны

Проверка в обе стороны

 

Самым неприятным местом оказался порядок. В нескольких видах объектов элементы в выгрузке идут не по алфавиту, не по идентификатору и не в порядке объявления. Оказалось, платформа складывает их в хэш-таблицу и выгружает в порядке её обхода. Чтобы совпасть байт в байт, пришлось повторить устройство этой хэш-таблицы: число корзин, правило роста, хэш строки. Подробно я писал об этом в статье на Хабре.

 

Обратная дорога: загрузка из XML

Выгрузка без загрузки - половина дела: для git и CI нужно уметь собрать файл конфигурации обратно.

С загрузкой правило строже. Движок обязан понять каждый элемент и каждый атрибут XML. Если хоть что-то не понял, файл конфигурации не пишется вообще, а в отчёте - список отказов с причинами. Молча пропущенный флажок в одной форме - это потом чья-то сломанная конфигурация и испорченная пятница.

Позавчера отказов было почти пять тысяч. Сегодня загрузка Бухгалтерии проходит целиком: 7 573 формы, 77 266 записей, ноль отказов. Небольшая конфигурация клиента ЭДО тоже выгружается и загружается полностью.

Проверка загрузки идёт через платформу, по кругу:

  1. Движок собирает файл конфигурации из выгрузки.
  2. Платформа загружает этот файл в базу.
  3. Платформа выгружает его обратно в XML.
  4. Сравниваем с выгрузкой, которую платформа делает сама.

Совпадают 90 385 из 90 385 файлов.

По скорости загрузка пока не выигрывает: около четырёх минут, примерно как у платформы (загрузка XML в базу и сохранение файла - 229 секунд). Загрузка пока идёт в один поток, выгрузка и открытие - по ядрам. Ускорять её буду следующей.

 

Что теряет сама платформа

Самая неожиданная находка - на четвёртом шаге круга. Сначала я сравнивал результат с исходной выгрузкой и получал 26 расхождений. Искал ошибку у себя - не нашёл. Тогда загрузил исходный XML в базу самой платформой, выгрузил обратно, и получил те же 26 расхождений.

То есть часть данных при загрузке XML теряет или меняет сама платформа. Примеры:

  • у плана обмена без поля даты обмена платформа добавляет его при загрузке, и порядок полей в выгрузке становится другим;
  • у поля табличного документа теряется вид указателя;
  • у поля PDF значение "None" в положении строки состояния после загрузки читается как другое значение.

 

Ведро с дырочкой: 26 файлов меняются ещё до того, как за дело берётся наш движок

Ведро с дырочкой: 26 файлов меняются ещё до того, как за дело берётся наш движок

 

Вывод для всех, кто строит проверки на круге "выгрузили - загрузили - выгрузили": сравнивать надо не с исходной выгрузкой, а с кругом, который сделала сама платформа. Иначе её собственные потери будут выглядеть как ваши ошибки.

 

Что взять себе

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

  • Мерить процесс целиком. Запуск, чтение, запись - всё, что ждёт человек. Медиана нескольких прогонов, а если на машине что-то ещё работает, так и написать.
  • Сравнивать байты. "По смыслу то же" прячет ошибки, которые потом всплывут в чужой конфигурации.
  • Крупное - первым. При раздаче работы по потокам самый долгий кусок не должен оказаться в конце очереди.
  • Искать квадратичные обходы. Один перебор внутри перебора съедал три четверти времени на макетах.
  • Проверять эталон. Прежде чем чинить расхождение у себя, прогнать тот же круг платформой.

 

Что дальше

Пока это инструмент одного человека. Полностью, в обе стороны, он проверен на Бухгалтерии и клиенте ЭДО. На других конфигурациях расхождения ещё бывают: на Управлении торговлей 11.5 около сотни файлов выгрузились с ошибкой, потому что там встречаются вещи, которых в Бухгалтерии нет. Такие файлы движок должен отвергать с причиной, а не выгружать неверно, - это я тоже чиню.

Ни код, ни программу пока не выкладываю: сначала хочу понять, кому это нужно и в каком виде.

Вопросы к вам:

  • Пользовались бы вы выгрузкой и загрузкой из командной строки в CI вместо платформы?
  • Что нужнее: командная строка, библиотека или окно для просмотра и быстрой правки рядом со штатной средой?
  • На какой конфигурации проверить следующей? Назовите конфигурацию и версию: типовые прогоню сам и напишу в комментариях, сколько файлов совпало.

Пишите в комментариях.

Изображение для анонса создано нейросетью.

Вступайте в нашу телеграмм-группу Инфостарт

выгрузка в XML загрузка из XML файл конфигурации cf git CI DevOps EDT ibcmd скорость производительность многопоточность сравнение выгрузок хэш-таблица Бухгалтерия предприятия разработка инструментов

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Разработчик Платные (руб)

Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.

50000 руб.

10.09.2026    13206    104    0    

78

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    192515    383    296    

435

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    164984    1009    329    

492

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам.

50200 руб.

24.04.2015    211419    186    254    

303

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Переносите справочную информацию, остатки и документы из УПП 1.3 в Бухгалтерию 3.0 с помощью готовых правил. Переносится более 50 видов документов. Простой интерфейс и понятные настройки.

42000 руб.

15.12.2021    37097    268    68    

204

Операции по ВЭД Файловый обмен (TXT, XML, DBF), FTP Разработчик Бухгалтер 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Бухгалтерский учет Платные (руб)

Федеральная таможенная служба России давно поддерживает унифицированный формат электронных документов для обмена с информационными системами предприятий. xmlns="urn:customs.ru:Information:ExchangeDocuments:". Структура, утвержденная комиссией Таможенного союза. Осталось только сделать загрузку в 1С из этого формата. На выходе - два документа ГТД по импорту и Поступление (акты, накладные) Обработка актуализирована на начало 2026 года (ставка НДС 22%)

24400 руб.

09.08.2016    97811    380    379    

125

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 3, УНФ 3 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

27572 руб.

18.02.2016    209212    686    559    

565
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. gybson 15 27.10.26 22:12 Сейчас в теме
Так выгружается несколько файлов всего, если никто не додумался ConfigDumpInfo в гит засунуть. Вот загрузка да, если прям тупо забирать из гита изменения, то долго.
3. oyti 107 28.10.26 02:00 Сейчас в теме
(1) Спасибо за комментарий. Работа над производительностью загрузки в ближайшем треке
2. hdworker 3 28.10.26 01:17 Сейчас в теме
Как вы проверяете синтаксис и прочие правила целостности конфигурации?
Со всеми проверками и прирост?
4. oyti 107 28.10.26 02:13 Сейчас в теме
(2) Так же, как и оригинальный механизм:
- Отсутствие проверки синтаксиса при загрузке;
- Проверка ссылок на объекты, типы и состав конфигурации.

Логические проверки пока упрощены
5. PerlAmutor 162 28.10.26 06:46 Сейчас в теме
Мне такое нужно определенно для ERP. Опишу свой пайп-лайн подготовки к переходу на новый релиз типовой, за несколько месяцев до перехода тестирую обновление на копии:

- инициализация репозитория git (выгрузка 3-х конфигураций в xml: базовая поставщика, текущая рабочая, новая поставщика)
- мерж с конфигурацией поставщика
- попытка загрузки в Конфигуратор из XML без ConfigDumpInfo

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

Пока готовишь релиз неделями - рабочая конфигурация и конфигурация поставщика продолжают своё развитие. И вот уже через месяц-два тебе снова надо актуализировать выгрузку рабочей базы и взять обновленный релиз - снова загрузка/выгрузка и мерж.

Мне бы пригодилась такая утилита для прохождения промежуточных этапов. А уже на финальном этапе можно сделать обычную выгрузку XML средствами платформы, чтобы гарантировано получить нормальный результат.
7. gybson 15 28.10.26 11:46 Сейчас в теме
(5) можно через ibcmd грузить по одному объекту из git diff
13. PerlAmutor 162 28.10.26 18:25 Сейчас в теме
(7) У меня было несколько итераций подхода к использованию ibcmd и каждый раз в нем находились какие-то косяки, которые ломали конфигурацию. Поэтому я взял паузу в его использовании.
8. oyti 107 28.10.26 12:08 Сейчас в теме
(5) Спасибо. Именно для этого и делаю: загрузка не останавливается на первой ошибке, а за один прогон выдаёт все отказы с причинами.

ERP пока не проверена - она следующая. Какой у вас релиз?
12. PerlAmutor 162 28.10.26 18:19 Сейчас в теме
(8) Готовлюсь переходить с ERP 2.5.22.186 на 2.5.27.79 (.101-й потом буду докидывать обычным обновлением через конфигуратор)
6. Somebody1 68 28.10.26 11:04 Сейчас в теме
Коллега, для ERP и других монстров это было бы очень востребовано!
9. oyti 107 28.10.26 12:09 Сейчас в теме
(6) Спасибо! ERP - следующая в очереди на проверку.
Somebody1; Casey1984; +2 – Ответить
10. petrpk 28.10.26 14:48 Сейчас в теме
11. oyti 107 28.10.26 15:00 Сейчас в теме
(10) Сейчас много ресурсов уходит на отладчик и редактор форм.
В качестве приемки MVP рассчитываю на сквозной цикл разработки внешней обработки
14. vanya_gonchar 99 28.10.26 23:27 Сейчас в теме
Что насчёт разных версий БП? Там не все так очевидно как кажется
15. oyti 107 28.10.26 23:31 Сейчас в теме
(14) На данный момент нет цели победить всё и сразу. Я уважаю труд разработчиков платформы, особенно за поддержку того разнообразия, которое она умеет.

Уточните, пожалуйста, вас интересует какой-то конкретный вопрос прикладного значения?
16. vanya_gonchar 99 28.10.26 23:34 Сейчас в теме
(15) выгрущка в xml зависит от многих факторов конфигурации. Версия платформы, режим совместимости, формат едт/платформа
Интересно как учитываете эти все моменты в разработке движка, просто я сам занимаюсь движком по выгрузке, для своего решения по гит флоу для команд
18. oyti 107 29.10.26 00:12 Сейчас в теме
(16) Спасибо, вопрос по делу. Поддержку всех этих вариантов сразу цель не ставлю, у проекта задачи другие. Сейчас так:
- Версия платформы: эталон - выгрузка 8.5.1, формат 2.21. Другие версии формата пока не делаю.
- Режим совместимости движок читает из конфигурации. Где выгрузка от него зависит, смотрю, как ветвится сама платформа, а не подбираю по образцам.
- Формат EDT пока не поддерживаю, только формат Конфигуратора.
- Все, что движок не узнал, - отказ с причиной, а не выгрузка наугад. Каждую конфигурацию сверяю с выгрузкой платформы байт в байт.

Из БП пока проверен один релиз, 3.0.171.23. Прогоню более старый и более новый и напишу здесь.

У вас коммерческий проект? Если ваш движок уже все это умеет, возможно, имеет смысл организовать коллаборацию :)
20. vanya_gonchar 99 29.10.26 00:16 Сейчас в теме
(18) проект коммерческий, но движок пока не решил, очень большие планы на него у меня
Пока только разобрал бсп 1к1, дальше буду разбираться уже с режимами совместимости и выгрузок типовых конфигураций. В ближайшее время в профиле статья появиться
17. Casey1984 3 29.10.26 00:04 Сейчас в теме
Это определенно бомба! Очень нужная вещь!
19. oyti 107 29.10.26 00:15 Сейчас в теме
(17) Спасибо! А для каких задач он вам пригодился бы? Если назовете конфигурацию и версию, прогоню ее и напишу в комментариях, сколько файлов совпало.
Для отправки сообщения требуется регистрация/авторизация