При обновлении сильно кастомизированных баз 1С программисты часто сталкиваются с ситуацией, когда после, казалось бы, успешного переноса доработок, расширения перестают работать, выдавая ошибку: «Значение контролируемого свойства ОбъектаРасширяемойКонфигурации не совпадает со значением в расширяемой конфигурации». Рассмотрим подробнее, почему это происходит, и проанализируем правильную методику обновления, которая гарантирует сохранность данных и работоспособность расширений.
Для понимания проблемы нам необходимо заглянуть «под капот» платформы 1С:Предприятие. Каждый объект в конфигурации — будь то справочник ДоверенностьКонтрагентов или реквизит в документе РеализацияТоваровУслуг — обладает уникальным внутренним идентификатором (GUID), изучить который поможет информер по метаданным. Для платформы именно этот скрытый код является «паспортом» объекта, а не его строковое имя.
Разберем ситуацию, описанную в теме: при попытке перенести реквизит через обычное копирование (Ctrl-C / Ctrl-V) из одной конфигурации в другую, платформа 1С всегда генерирует новый GUID для вставленного объекта. Несмотря на то что имя реквизита осталось прежним, с точки зрения системы это абсолютно другой объект. Расширения конфигурации «привязываются» к объектам основной конфигурации именно по этим идентификаторам. Когда вы «накатываете» конфигурацию с новыми GUID через операцию «Загрузка конфигурации», связи в расширении обрываются (выявить такие разрывы поможет инструмент для анализа зависимостей), что и приводит к ошибке контроля свойств.
Давайте проанализируем, к каким последствиям приводит ручное копирование объектов метаданных между базами:
.cf файла, где реквизиты были созданы копипастом, платформа считает, что старый реквизит был удален, а новый — создан. При обновлении конфигурации базы данных 1С попытается удалить колонку в таблице БД и создать новую пустую. В итоге данные, накопленные пользователями, исчезнут.Вместо опасных манипуляций с созданием «чистых» баз и копированием объектов, мы разберем по шагам стандартный и безопасный метод обновления через механизм сравнения и объединения (для крупных систем также полезно автоматическое обновление конфигурации).
Прежде всего, убедитесь, что ваша рабочая база находится на поддержке. Для обновления нам понадобится файл нового релиза (обычно это .cfu или полный .cf обновляемой конфигурации), для работы с которыми можно использовать специальный распаковщик конфигураций.
Переходим в меню Конфигурация — Поддержка — Обновить конфигурацию. Выбираем файл обновления. После того как платформа сопоставит объекты, откроется окно «Сравнение и объединение».
Проанализируем окно сравнения. Здесь крайне важно правильно расставить флажки:
ДоверенностьКонтрагентов) будут отмечены как отсутствующие в новой конфигурации поставщика. Убедитесь, что галочки на них стоят — это сохранит их в новой версии с исходными GUID.РеализацияТоваровУслуг, где добавлен реквизит) платформа предложит вариант объединения.Важный совет: Если вы все же решили использовать промежуточную базу для подготовки .cf файла, никогда не используйте копирование. Вместо этого используйте функцию Сравнить, объединить с конфигурацией из файла. Именно этот механизм переносит объекты вместе с их «родными» GUID.
Если вы сомневаетесь, сохранились ли идентификаторы после ваших манипуляций, воспользуйтесь хитростью опытных разработчиков. Запустите сравнение конфигураций (например, основной и файла поставки) и в окне настройки сравнения снимите галочку «Разрешить сопоставление по именам». Если после этого объект (справочник или реквизит) отображается как «удаленный» в одной части и «новый» в другой — значит, их GUID различаются, и объединение по именам здесь не поможет, нужно восстанавливать соответствие вручную.
Если ошибка «Значение контролируемого свойства не совпадает» уже возникла, рассмотрим способы ее решения:
Иногда полезно программно проверить внутренние идентификаторы, чтобы убедиться в проблеме. Рассмотрим пример, как можно получить идентификатор типа объекта метаданных (хотя GUID конкретного реквизита в рантайме получить сложнее, понимание структуры метаданных помогает в отладке):
// Пример получения имени таблицы и метаданных для анализа
ИмяТаблицы = ОбъектыМетаданных.Справочники.ДоверенностьКонтрагентов.Имя;
Сообщить("Работаем с объектом: " + ИмяТаблицы);
// В расширениях важно проверять наличие реквизита перед обращением,
// если конфигурация часто обновляется динамически
Если Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Найти("ДоверенностьКонтрагентов") = Неопределено Тогда
ВызватьИсключение "Критическая ошибка: Реквизит не найден в основной конфигурации!";
КонецЕсли;
Для успешного обновления без «затыков» и ошибок расширений необходимо придерживаться трех правил:
Ctrl-C / Ctrl-V для переноса объектов между конфигурациями.Соблюдение этих правил сэкономит вам десятки часов на восстановлении «отвалившихся» расширений и поиске пропавших данных в таблицах SQL.