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