Как восстановить конфигурацию поставщика в 1С, если базу обновляли некорректно?

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

Каждый опытный специалист по внедрению и сопровождению программных продуктов на платформе «1С:Предприятие» хотя бы раз сталкивался с ситуацией, когда конфигурация базы данных обновлялась нештатными методами. Наиболее распространенная ошибка неквалифицированных специалистов — накатывание новых релизов путем простого сравнения и объединения файлов конфигурации .cf без выполнения процедуры полноценного обновления поддержки.

В результате таких действий возникает опасный «рассинхрон»: основная конфигурация базы данных фактически соответствует новому релизу, в то время как конфигурация поставщика (информация о поддержке) застревает на старой версии. Например, версия конфигурации базы данных может быть актуальной (допустим, 3.0.25.1), а версия конфигурации поставщика в окне поддержки отображается как устаревшая (например, 3.0.19.3). Это приводит к тому, что последующие штатные обновления становятся невозможными: платформа «не видит» доступных обновлений, выдает ошибки при попытке сопоставить объекты или начинает некорректно отображать дважды измененные объекты.

В этой статье мы подробно разберем, как исправить эту проблему несколькими надежными способами, проанализируем внутренние механизмы сопоставления объектов платформы и выясним, как избежать подобных ситуаций в будущем.

Почему нельзя просто «накатить» CF-файл методом сравнения-объединения?

Для начала разберем причину возникновения проблемы. Платформа «1С:Предприятие» хранит внутри информационной базы три конфигурации:

  1. Конфигурация поставщика — это исходный эталонный код от фирмы «1С» (или другого вендора). На нее вешаются «замочки», определяющие правила поддержки.
  2. Основная конфигурация — это рабочая среда разработчика, в которую вносятся доработки. Именно ее мы редактируем в конфигураторе.
  3. Конфигурация базы данных — это скомпилированная и исполняемая структура, с которой непосредственно работают пользователи в режиме «1С:Предприятие» (ИБ).

Когда «обновлятор» делает простое сравнение-объединение с файлом .cf нового релиза, он заменяет код и объекты в основной конфигурации, но конфигурация поставщика при этом не обновляется. База формально начинает работать на новом коде, но механизм поддержки считает, что конфигурация всё еще находится на старом релизе. При попытке следующего штатного обновления платформа попытается обновить базу с версии поставщика, которая безнадежно отстала, что вызовет лавину конфликтов метаданных, дублирование предопределенных элементов и критические ошибки СУБД.


Решение 1. Выравнивание версии поставщика «в один шаг» (самый быстрый способ)

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

Разберем этот процесс по шагам:

  1. Обязательно создадим резервную копию информационной базы перед проведением любых манипуляций!
  2. Получим файл конфигурации .cf точно того же релиза, до которого фактически доведена основная конфигурация (в нашем примере это релиз 3.0.25.1). Обратите внимание: нужен именно полный файл конфигурации поставщика (типовой .cf), а не файл обновления .cfu.
  3. Откроем базу в конфигураторе, перейдем в меню Конфигурация — Поддержка — Обновить конфигурацию.
  4. В открывшемся окне выбора источника обновления выберем вариант Выбор файла обновления и укажем путь к нашему подготовленному типовому файлу .cf релиза 3.0.25.1.
  5. Платформа проанализирует файл и откроет стандартное окно сопоставления конфигураций.
  6. Критически важный шаг: В окне сравнения и объединения необходимо снять абсолютно все флажки со всех объектов метаданных! Мы можем сделать это, сняв самую верхнюю галочку у корня дерева конфигурации.
  7. Нажмем кнопку Выполнить.

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


Решение 2. Восстановление поддержки через временное ее снятие (если первый метод выдает ошибки)

Иногда при использовании первого метода платформа отказывается выполнять операцию, выдавая ошибки вида: «На удаляемый объект Подсистема.ИнтернетПоддержкаПользователей... есть ссылки в объектах основной конфигурации». Это происходит из-за того, что в старой конфигурации поставщика структура объектов сильно отличалась, и платформа пытается сопоставить их некорректно. В этом случае применим метод полного пересоздания связи с поддержкой.

Выполним следующие шаги:

  1. Подготовим типовой файл конфигурации .cf нужного нам актуального релиза (например, 3.0.25.1).
  2. Сохраним нашу текущую измененную конфигурацию в файл на диск. Для этого выберем пункт меню Конфигурация — Сохранить конфигурацию в файл... (назовем файл, например, custom_work.cf).
  3. Полностью снимем нашу базу с поддержки. Для этого перейдем в Конфигурация — Поддержка — Настройка поддержки... и нажмем кнопку Снять с поддержки. Согласимся с предупреждением платформы. Теперь все объекты нашей базы свободны от замков, но все УИДы (уникальные идентификаторы) объектов сохранены.
  4. Теперь свяжем базу с новой конфигурацией поставщика. Перейдем в меню Конфигурация — Сравнить, объединить с конфигурацией из файла... и выберем подготовленный ранее чистый типовой файл .cf актуального релиза.
  5. Платформа обнаружит, что база не стоит на поддержке, и выдаст вопрос: «Выполнить постановку на поддержку?». Обязательно нажимаем Да.
  6. В открывшемся окне сравнения и объединения мы снова снимаем все флажки. Нам не нужно переносить объекты из файла, нам нужно лишь зафиксировать связь по идентификаторам и поставить базу на поддержку.
  7. Нажимаем кнопку Выполнить. Платформа поставит все объекты на поддержку (по умолчанию они могут встать в режим «Редактируется с сохранением поддержки» или «Без возможности изменения» — это зависит от настроек).
  8. После завершения процедуры нам необходимо вернуть наши доработки, если они пострадали (хотя при снятии всех флагов они пострадать не должны). На всякий случай сделаем сравнение-объединение с ранее сохраненным файлом custom_work.cf, чтобы убедиться, что все наши уникальные изменения на месте.
  9. Сохраним изменения в базе данных, нажав клавишу F7 (Обновить конфигурацию базы данных).

Решение 3. Метод «чистой сборки» через пустую информационную базу

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

Рассмотрим алгоритм реализации этого метода:

  1. Выгрузим текущую рабочую конфигурацию ИБ в файл (например, corrupted_work.cf).
  2. Создадим на компьютере абсолютно пустую файловую информационную базу без конфигурации.
  3. Запустим конфигуратор этой пустой базы и загрузим в нее чистую типовую конфигурацию того релиза, который нам необходим для работы (например, 3.0.25.1) через меню Конфигурация — Загрузить конфигурацию из файла.... Обновим конфигурацию базы данных (F7).
  4. В этой чистой базе настроим правила поддержки: включим возможность изменения для тех объектов, которые были доработаны в нашей рабочей базе (снимем соответствующие замки).
  5. Выполним сравнение и объединение этой чистой базы с файлом corrupted_work.cf. При этом платформа перенесет все наши измененные объекты, формы, модули и реквизиты в новую конфигурацию, сохранив при этом идеальную структуру конфигурации поставщика.
  6. После успешного объединения и разрешения всех конфликтов выгрузим получившуюся конфигурацию в файл perfect_final.cf.
  7. Вернемся в нашу рабочую (продуктивную) базу данных, где работают пользователи.
  8. Перейдем в меню Конфигурация — Загрузить конфигурацию из файла... и выберем файл perfect_final.cf.

Важное предупреждение: Метод «Загрузить конфигурацию из файла» (F7) в рабочую базу безопасен только в том случае, если исходная конфигурация perfect_final.cf была получена на основе той же самой базы или путем корректного сопоставления объектов. Если уникальные идентификаторы (UUID) предопределенных объектов или реквизитов в загружаемом файле разойдутся с идентификаторами в физических таблицах СУБД рабочей базы, платформа при обновлении базы данных сотрет старые колонки/таблицы и создаст новые пустые. Это приведет к безвозвратной потере данных. Поэтому перед загрузкой конфигурации всегда проводите детальное сравнение загружаемого файла .cf с конфигурацией рабочей базы данных!


Важные аспекты сопоставления объектов по UUID и по Имени

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

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


Опасность «прыжков» через релизы и обработчики обновления данных

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

В процессе развития конфигураций разработчики 1С часто меняют структуру хранения данных. Например, они могут принять решение перенести данные из регистра сведений ПределыВычетовНДФЛ в новый регистр ПараметрыВычетовНДФЛ, а старый регистр переименовать в УдалитьПределыВычетовНДФЛ. Этот процесс всегда разделен на этапы:

  1. В релизе N создается новый регистр, старый переименовывается, и пишется обработчик обновления. При запуске базы в пользовательском режиме этот обработчик переносит все записи из старой структуры в новую.
  2. В релизе N+5 старый регистр с префиксом Удалить... полностью вырезается из метаданных конфигурации.

Если вы обновите конфигурацию базы данных сразу с релиза N-1 до релиза N+5 «в один шаг», минуя промежуточные запуски предприятия, то база данных сразу получит структуру релиза N+5, в которой старого регистра уже просто нет в метаданных (он физически удалится при обновлении ИБ). При запуске программы обработчики обновления попытаются запуститься, но они не найдут источник данных для переноса. Итог — полная потеря истории по данному разделу учета.

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


Современная альтернатива кастомизации — Расширения конфигурации

Чтобы раз и навсегда избавить себя от мучений с обновлением измененных конфигураций и «криворуких» предшественников, настоятельно рекомендуется использовать механизм Расширений конфигурации (файлы .cfe), который активно развивается в платформе 1С, начиная с версии 8.3.9.

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

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

← На главную