Почему файл обновления 1С (cfu) стал слишком большим и как уменьшить его размер?

Программист 1С v8.3 (Управляемые формы) 1С:Розница IT и автоматизация бизнеса
← На главную

В процессе сопровождения и доработки типовых конфигураций 1С, таких как «1С:Розница» или «1С:Управление торговлей», разработчики часто сталкиваются с механизмом создания файлов поставки и обновлений. В норме файл обновления .cfu содержит только «дельту» — разницу между текущей и предыдущей версиями конфигурации. Однако иногда случается технический сбой, при котором даже минимальное изменение одной строки кода приводит к генерации огромного файла обновления размером в сотни мегабайт. Разберем, почему это происходит и как вернуть размер обновлений в норму.

Проблема: аномальный рост размера файла .cfu

Рассмотрим стандартную ситуацию: ведется разработка собственной поставки на базе типового решения. В течение долгого времени обновления (файлы .cfu) имели объем 1–3 Мб. Однако после масштабного объединения конфигурации с новой подсистемой (например, подсистемой ККТ или Библиотекой стандартных подсистем) размер последующих обновлений резко возрастает до 200–500 Мб. При этом не имеет значения объем вносимых изменений — даже коррекция одной буквы в комментарии заставляет платформу включать в файл обновления огромный массив данных.

Проанализируем ситуацию: почему платформа «пропихивает» в обновление лишние данные? Для этого нам нужно понять механизм формирования «дельты» в 1С.

Механизм формирования обновлений и причины их «раздувания»

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

  1. Двоичные данные в макетах. В современных конфигурациях (особенно в подсистемах работы с торговым оборудованием) часто используются общие макеты, содержащие драйверы устройств в виде Двоичных данных. При сравнении и объединении конфигураций эти макеты могут перезаписываться. Если платформа фиксирует изменение версии такого макета, он будет целиком попадать в каждое обновление.
  2. Шаблоны ограничений в ролях. Часто большой объем данных занимают шаблоны ограничений доступа на уровне записей (RLS). Любое изменение в роли или связанных с ней объектах может привести к пересчету и включению всех шаблонов в файл поставки.
  3. Идентификаторы объектов метаданных. Масштабные обновления затрагивают иерархию идентификаторов. Если в базе-разработчике процесс обновления идентификаторов не был завершен корректно или возникли дубли, 1С может пытаться передать изменения внутренних справочников через файлы поставки.
  4. Формы и XDTO-пакеты. Управляемые формы хранятся в формате XML. При изменении даже одного реквизита формы 1С включает в .cfu все описание формы, включая варианты для разных разрешений и настроек. То же касается тяжелых XDTO-пакетов.

Пошаговое решение: исправление поврежденной структуры конфигурации

Если размер файла обновления остается стабильно большим при минимальных изменениях, скорее всего, произошло повреждение внутренней структуры базы данных конфигурации. Обычные средства, такие как Тестирование и исправление (ТИИ) или утилита chdbfl.exe, в этом случае часто оказываются бессильны, так как они проверяют физическую целостность таблиц, а не логическую связность версий объектов в таблицах Config и ConfigSave.

Для решения проблемы воспользуемся методом «перезагрузки» конфигурации через файл .cf. Рассмотрим этот алгоритм подробнее:

  1. Создание эталонного файла конфигурации. В базе-разработчике перейдем в меню Конфигурация -> Сохранить конфигурацию в файл... и создадим актуальный файл .cf.
  2. Подготовка «чистой» базы. Создадим новую пустую информационную базу без конфигурации.
  3. Загрузка структуры. В новой базе откроем конфигуратор и выполним Конфигурация -> Загрузить конфигурацию из файла..., выбрав наш сохраненный .cf. После этого выполним Обновить конфигурацию базы данных.
  4. Выгрузка очищенной конфигурации. Из этой «чистой» базы снова выгрузим конфигурацию в новый файл .cf. На этом этапе платформа выполняет полную переиндексацию и реорганизацию внутренних таблиц, удаляя «мусорные» версии объектов и исправляя связи GUID-ов.
  5. Восстановление базы поставки. Вернемся в исходную рабочую базу-разработчик. Выполним полную загрузку (не объединение!) полученного «чистого» файла .cf через меню Конфигурация -> Загрузить конфигурацию из файла....

Важно: При выполнении полной загрузки .cf история изменений объектов внутри конфигуратора обнуляется, что заставляет платформу заново сопоставить объекты метаданных с их образами в файлах поставки. Это устраняет ложные пометки об «изменении» объектов, которые на самом деле не менялись.

Оптимизация процесса создания поставки

Чтобы в будущем избежать неоправданного роста .cfu, проанализируем настройки создания файлов обновления. При генерации обновления через меню Конфигурация -> Распределенная информационная база -> Создать файлы поставки и обновления конфигурации обратите внимание на следующие моменты:

Рассмотрим программный код, который часто приходится корректировать в модуле обновления ИБ (например, ОбновлениеИБРТ), чтобы корректно зарегистрировать изменения:


Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
    НовыйОбработчик = Обработчики.Добавить();
    НовыйОбработчик.Версия = "2.2.13.1"; // Указываем актуальную версию
    НовыйОбработчик.Процедура = "ОбщийМодуль.ОбновитьДанныеПользователей";
    НовыйОбработчик.Очередь = 1;
КонецПроцедуры

Выясним причину, почему даже при изменении одной строки в этом модуле файл получается большим. При создании .cfu крайне важно правильно выбрать список версий, для которых создается обновление. Если вы выбираете слишком много предыдущих версий, платформа включает в файл цепочку изменений для каждой из них. Старайтесь указывать только последнюю стабильную версию, чтобы минимизировать объем дельты.

Дополнительные рекомендации

Для поддержания базы-разработчика в оптимальном состоянии рекомендуется:

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

← На главную