Как правильно обновить доработанную конфигурацию 1С и избежать ошибок в расширениях из-за GUID

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

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

Выясняем причину: магия внутренних идентификаторов (GUID)

Для понимания проблемы нам необходимо заглянуть «под капот» платформы 1С:Предприятие. Каждый объект в конфигурации — будь то справочник ДоверенностьКонтрагентов или реквизит в документе РеализацияТоваровУслуг — обладает уникальным внутренним идентификатором (GUID), изучить который поможет информер по метаданным. Для платформы именно этот скрытый код является «паспортом» объекта, а не его строковое имя.

Разберем ситуацию, описанную в теме: при попытке перенести реквизит через обычное копирование (Ctrl-C / Ctrl-V) из одной конфигурации в другую, платформа 1С всегда генерирует новый GUID для вставленного объекта. Несмотря на то что имя реквизита осталось прежним, с точки зрения системы это абсолютно другой объект. Расширения конфигурации «привязываются» к объектам основной конфигурации именно по этим идентификаторам. Когда вы «накатываете» конфигурацию с новыми GUID через операцию «Загрузка конфигурации», связи в расширении обрываются (выявить такие разрывы поможет инструмент для анализа зависимостей), что и приводит к ошибке контроля свойств.

Почему Ctrl-C и Ctrl-V — это опасно?

Давайте проанализируем, к каким последствиям приводит ручное копирование объектов метаданных между базами:

  1. Потеря данных в SQL-таблицах. При загрузке .cf файла, где реквизиты были созданы копипастом, платформа считает, что старый реквизит был удален, а новый — создан. При обновлении конфигурации базы данных 1С попытается удалить колонку в таблице БД и создать новую пустую. В итоге данные, накопленные пользователями, исчезнут.
  2. Конфликты в расширениях. Как мы уже выяснили, расширение хранит ссылку на GUID. Если GUID изменился, расширение больше не видит «свой» объект.
  3. Проблемы с обменами. Если база участвует в обмене данными (РИБ или через универсальный формат), несоответствие идентификаторов приведет к дублированию объектов или ошибкам десериализации.

Алгоритм правильного обновления доработанной конфигурации

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

Шаг 1. Подготовка конфигурации поставщика

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

Шаг 2. Запуск процедуры обновления

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

Шаг 3. Сохранение своих доработок

Проанализируем окно сравнения. Здесь крайне важно правильно расставить флажки:

  1. Ваши добавленные объекты (например, справочник ДоверенностьКонтрагентов) будут отмечены как отсутствующие в новой конфигурации поставщика. Убедитесь, что галочки на них стоят — это сохранит их в новой версии с исходными GUID.
  2. Для измененных типовых объектов (например, документ РеализацияТоваровУслуг, где добавлен реквизит) платформа предложит вариант объединения.
  3. Если вы используете расширения, проверьте, не изменились ли типы данных в основной конфигурации, которые вы заимствовали.

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

Как проверить идентичность объектов?

Если вы сомневаетесь, сохранились ли идентификаторы после ваших манипуляций, воспользуйтесь хитростью опытных разработчиков. Запустите сравнение конфигураций (например, основной и файла поставки) и в окне настройки сравнения снимите галочку «Разрешить сопоставление по именам». Если после этого объект (справочник или реквизит) отображается как «удаленный» в одной части и «новый» в другой — значит, их GUID различаются, и объединение по именам здесь не поможет, нужно восстанавливать соответствие вручную.

Исправление ошибок в расширении

Если ошибка «Значение контролируемого свойства не совпадает» уже возникла, рассмотрим способы ее решения:

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

Пример анализа через программный код

Иногда полезно программно проверить внутренние идентификаторы, чтобы убедиться в проблеме. Рассмотрим пример, как можно получить идентификатор типа объекта метаданных (хотя GUID конкретного реквизита в рантайме получить сложнее, понимание структуры метаданных помогает в отладке):


// Пример получения имени таблицы и метаданных для анализа
ИмяТаблицы = ОбъектыМетаданных.Справочники.ДоверенностьКонтрагентов.Имя;
Сообщить("Работаем с объектом: " + ИмяТаблицы);

// В расширениях важно проверять наличие реквизита перед обращением,
// если конфигурация часто обновляется динамически
Если Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Найти("ДоверенностьКонтрагентов") = Неопределено Тогда
    ВызватьИсключение "Критическая ошибка: Реквизит не найден в основной конфигурации!";
КонецЕсли;

Подведем итоги

Для успешного обновления без «затыков» и ошибок расширений необходимо придерживаться трех правил:

Соблюдение этих правил сэкономит вам десятки часов на восстановлении «отвалившихся» расширений и поиске пропавших данных в таблицах SQL.

← На главную