Пишу свой движок выгрузки конфигураций 1С в XML: зачем, что уже работает и первые цифры

21.10.26

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

Штатный ibcmd тратит больше десяти минут, чтобы превратить CF типовой ERP в XML, хотя по сути это распаковка архива и перевод одного формата в другой. Я начал писать свой движок на Rust, который выдаёт тот же XML, что и платформа, байт в байт. В статье: зачем он нужен, как устроены контейнер v8 и скобочный формат, как проверять совпадение со штатной выгрузкой и сколько файлов уже совпадает.

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

Недавно я наконец начал. Это первая статья о том, зачем я за это взялся, что уже работает и сколько это стоит по времени.

Зачем

Платформа медленная там, где могла бы быть быстрой. Несколько замеров ibcmd на 8.3.27.2214, файловая база, Ryzen 5 5600G, 32 ГБ, NVMe:

Операция УТ 11.6 ERP 2.6
Размер CF 1,7 ГБ 2,9 ГБ
Файлов в XML-выгрузке 51 595 125 046
Объём выгрузки 2,78 ГБ 9,75 ГБ
Полная выгрузка базы в файлы (config export) 0:52 3:00
CF → XML (временная база, загрузка CF, выгрузка) 3:22 10:38
Полная загрузка из файлов 2:34–3:15 5:52–6:47

Больше всего раздражает строка «CF → XML». Чтобы просто посмотреть CF-файл в виде исходников, платформе нужно создать временную базу, загрузить в неё конфигурацию и только потом выгрузить. На ERP это больше десяти минут, хотя по сути нужно распаковать архив и перевести один формат в другой.

Работа без платформы. Для любой операции нужна установленная 1С нужной версии. Для разбора файла она не нужна в принципе.

Интерес. Внутренний формат 1С — это контейнеры, deflate и скобочные структуры {…}. Разобраться, как из этого получается тот XML, который мы видим в выгрузке, — хорошая задача сама по себе.

Что именно я пишу

Движок, который на входе получает файл (CF, CFE, EPF, ERF) или базу, а на выходе отдаёт тот же XML, что и штатная выгрузка. Не «похожий», не «свой удобный формат», а файл в файл, байт в байт. Иначе его нельзя подложить вместо ibcmd: git тут же покажет тысячи изменённых файлов.

Пишу на Rust: большие бинарные файлы, один exe без рантайма и полный контроль над памятью.

Главное правило движка: всё незнакомое — отказ. Если встретилась структура, которую я ещё не сверил со штатной выгрузкой, движок не пытается угадать, а честно отвечает «не умею» и показывает место расхождения. Тогда выгрузку делает платформа. Тихо выгрузить чуть-чуть не то гораздо хуже, чем не выгрузить вообще.

Что уже работает

1. Контейнер v8

CF, CFE, EPF и ERF — это контейнеры: оглавление, цепочки блоков, заголовки элементов, сжатие raw deflate, внутри могут быть вложенные контейнеры. Есть 32-битный и 64-битный формат. Интересная деталь: CF 8.3 — это на самом деле два контейнера подряд. Сначала маленький 32-битный, за ним 64-битный со всей конфигурацией.

Файл отображается в память, а не читается целиком. CF УТ размером 1,8 ГБ движок прочитал целиком, со всеми вложенными контейнерами и распаковкой, за 16 секунд.

Важно: это только чтение контейнера, а не выгрузка в XML. Сравнивать эти 16 секунд с тремя минутами штатного «CF → XML» нельзя: самую сложную часть, превращение внутренних структур в XML, движок для конфигурации ещё не делает. Цифра показывает другое: распаковка CF занимает секунды, а значит, основное время штатного пути уходит не на неё.

2. Скобочный формат

Почти всё внутри контейнера записано в скобочном формате 1С:

{1,{2,"строка ""в кавычках""",…},…}

Парсер работает без копирования и без рекурсии, с ограничением глубины. Он понимает строки с удвоенными кавычками, многострочный base64, пустые значения вида {2,uuid,} и несколько списков на верхнем уровне (так устроен configinfo расширения).

Проверка — на корпусе: разбираются все скобочные файлы из нескольких внешних обработок и отчётов, двух расширений, БСП (7 064 файла) и БПО. Ни одного отказа.

3. Первые объекты в XML: внешние обработки

Начал с самого простого — внешних обработок. Сейчас движок выгружает объект обработки, реквизиты (основные типы: булево, строка, число, СписокЗначений, ТаблицаЗначений, ДеревоЗначений, КомпоновщикНастроек, ссылки), модуль объекта, описание форм и модули форм.

Разбор устроен через «образцы»: для каждой структуры записана известная форма с местами для значений. Если запись хоть чем-то отличается от образца, это отказ с указанием места. Так в XML попадает только то, что уже сверено со штатной выгрузкой.

Как я проверяю

Есть корпус из 208 внешних обработок и отчётов из реальной жизни. Для каждого файла стенд делает две выгрузки:

  • штатную — конфигуратором 8.3.27 (/DumpExternalDataProcessorOrReportToFiles, иерархический формат);
  • своим движком.

Потом каталоги сравниваются побайтово. Совпадение «почти» не засчитывается.

Ещё одна важная мелочь: стенд дважды выгружает штатно и сравнивает две штатные выгрузки между собой. Если платформа сама с собой не совпадает (порядок, время, какие-нибудь GUID), то сравнение с движком в этом случае ничего не доказывает.

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

Текущий счёт

Этап Результат
Первая версия выгрузки EPF движок принял 4 файла из 208, все 4 совпали со штатной выгрузкой
Реквизиты и модуль объекта 18 из 208 совпадают файл в файл, остальные 190 — честный отказ
Ошибок (выгрузил, но не то) 0

18 из 208 — немного. Но для меня важнее последняя строка: движок ни разу не выдал неверный результат. Каждый отказ — это конкретное место в конкретном файле, то есть готовый список задач.

Что дальше

  1. Элементы форм. Это главная причина отказов на обработках: почти у всех есть формы с элементами.
  2. Внешние отчёты, затем расширения (CFE).
  3. Полная конфигурация из CF и формат выгрузки 2.21.
  4. Чтение напрямую из базы, без промежуточного CF.

На каждом шаге — тот же стенд и тот же критерий: файл в файл со штатной выгрузкой на всём корпусе, иначе отказ. Когда дойду до CF типовых конфигураций, будет вторая статья с таблицей «штатный против своего» по времени.

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

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

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

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

См. также

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

27633 руб.

12.06.2017    165215    1009    329    

493

SALE! 10%

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

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

42000 37800 руб.

15.12.2021    37210    270    68    

204

Перенос данных 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    209407    686    559    

566

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактическим удержаниям, НДФЛ, вычетам, страховым взносам из базы Парус 10 учреждений (далее Парус) в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (далее 1С) и начать с ней работать с любого месяца года.

85400 руб.

05.10.2022    14596    17    8    

17

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

Специализированные обработки для загрузки кассовых чеков в локальных базах: 1С:БП 3.0, 1С:УНФ 3.0, 1С:Розница 3.0, 1С:КА. 2.5, 1С:ERP Управление предприятием 2.5 и 1С:УТ 11.5. Вы просто сканируете QR коды с бумажных и электронных чеков c помощью мобильного приложения ФНС или сканера штрихкодов и чеки автоматически (без ручного ввода) загружаются в документы 'Авансовый отчет', 'Расходы предпринимателя', 'Путевой лист', 'Приходная накладная', 'Поступление (акты, накладные, УПД)', 'Приобретение товаров и услуг', 'Отчет о розничных продажах', 'Поступление денежных документов' и 'Реестры выплат самозанятым'. Обработка будет работать на любой версии конфигурации управляемые формы: базовой, ПРОФ или КОРП. Для загрузки чеков самозанятых достаточно только ссылки на чек.

6990 руб.

19.08.2020    83889    383    93    

269

SALE! 10%

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

Перенос данных из 1С:Комплексной автоматизации 1.1 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях КА 1.1 (1.1.115.1) и БП 3.0 (3.0.210.x). Правила подходят для версии ПРОФ и КОРП.

40000 36000 руб.

11.07.2019    30989    129    32    

38

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 07.10.2026, версия 9.5.0 - 10.9.0)

20740 руб.

20.11.2015    179876    430    401    

546
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 2178 22.10.26 09:07 Сейчас в теме
Если выгорит, то будет славно, удачи!

В качестве пожеланий: было бы очень удобно подавать на вход имена объектов, которые нужно выгрузить, порой такого не хватает.
2. vanya_gonchar 101 22.10.26 10:17 Сейчас в теме
(1) Спасибо! Выборочная выгрузка по именам объектов есть в планах.

Штатно это уже можно сделать:

ibcmd — подкоманда objects:
ibcmd infobase config export objects --db-path=<каталог базы> --out=<каталог> --recursive Справочник.Номенклатура Документ.ЗаказКлиента

--recursive выгружает и подчинённые объекты (формы, макеты, команды); --extension=<имя> — то же для расширения.

Конфигуратор — ключ -listFile у выгрузки:
1cv8.exe DESIGNER /F <каталог базы> /DumpConfigToFiles <каталог> -listFile objects.txt

В objects.txt — по одному объекту на строку.

Такая выгрузка не обновляет ConfigDumpInfo.xml целиком.
Rafaraf; ixijixi; +2 – Ответить
6. ixijixi 2178 22.10.26 16:19 Сейчас в теме
(2) Спасибо. А есть такое - выгрузить объекты по подсистеме?
7. vanya_gonchar 101 22.10.26 16:22 Сейчас в теме
(6)
А есть такое - выгрузить объекты по подсистеме?


По подсистеме штатного отбора нет, cостав подсистемы лежит в её XML (Subsystems/<Имя>.xml, раздел Content) — его можно превратить в список для objects / -listFile.

Вложенные подсистемы придётся обходить отдельно.
3. SerVer1C 1146 22.10.26 10:31 Сейчас в теме
(1) Может быть такое подойдёт?
5. ixijixi 2178 22.10.26 16:01 Сейчас в теме
(3) Примерно) Но лучше как в (2)
4. gybson 15 22.10.26 14:38 Сейчас в теме
Главное чтобы в итоге вы не пришли к "Аааааааааааааааааааа, вот почему 10 минут".
SerVer1C; +1 – Ответить
8. fishca 1317 22.10.26 18:21 Сейчас в теме
9. ArtGT969 26.10.26 00:28 Сейчас в теме
Уже есть аналогичный проект, лучше объединить усилия и наработки https://github.com/Untru/ibcmd-rs
10. triviumfan 103 30.10.26 00:23 Сейчас в теме
Не непонятно для какого сценария это нужно... cf-файл без платформы мало кому интересен.
Ради эксперемента на своей "тачке" решил выгрузить CF -> XML двумя способами:
1. Через конфигуратор заняло 2:00
2. Через ibcmd заняло 1:00
Win10, ryzen7700, ssd, mssql
Демо-база 1С:ERP Управление предприятием 2 (2.5.22.114), 1С:Предприятие 8.3 (8.3.27.2074)

На какой-нибудь юникс-подобной системе за счет файловой системы наверняка в 1.5 раза быстрее было бы.
Не уверен, что "овчинка стоит выделки"...
Для отправки сообщения требуется регистрация/авторизация