В процессе разработки и поддержки конфигураций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с механизмом расширений. Это мощный инструмент, однако он накладывает определенные ограничения на последовательность действий при изменении метаданных. Типичная проблема возникает, когда реквизит (например, реквизит табличной части), заимствованный в расширение, удаляется из основной конфигурации. В этот момент в расширении он может «зависнуть»: система не позволяет его удалить, так как связь с объектом-основанием нарушена, а сам объект в расширении помечен как заимствованный.
Рассмотрим подробно, почему это происходит и какими способами можно очистить расширение от таких «фантомных» реквизитов.
Когда мы добавляем реквизит из основной конфигурации в расширение, платформа создает внутреннюю связь между ними на уровне уникальных идентификаторов (UUID). В XML-структуре расширения фиксируется, что данный объект является «заимствованным». Если в основной конфигурации реквизит удаляется, то в расширении ссылка на него становится «битой». Платформа зачастую блокирует удаление такого объекта в конфигураторе, так как логика расширений предполагает, что заимствованный объект должен существовать в основной базе.
В некоторых случаях попытка взаимодействия с такими реквизитами может приводить даже к аварийному завершению работы конфигуратора (дампу), особенно на устаревших релизах платформы (например, 8.3.15–8.3.17).
Проанализируем самый простой и безопасный способ, который помог автору темы. Суть метода заключается в том, чтобы на время восстановить целостность связей метаданных, выполнить удаление и снова вернуться к исходному состоянию основной конфигурации.
Разберем этот процесс по шагам:
Товары документа РеализацияТоваровУслуг) реквизит с точно таким же именем и типом данных, который «завис» в расширении.Del. Платформа должна позволить выполнить это действие без ошибок.Этот метод заставляет платформу корректно сопоставить идентификаторы объекта в обеих структурах и правильно зарегистрировать операцию удаления в таблицах метаданных базы данных.
Если манипуляции с конкретным реквизитом не помогают, проанализируем ситуацию на уровне владельца реквизитов (например, объекта Объект на форме или самого документа). Иногда реквизит невозможно удалить из-за того, что он жестко привязан к форме расширения.
Попробуем следующий алгоритм:
Объект).Рассмотрим полезную функцию редактора формы: кнопка «Обновить расширение формы» в командной панели редактора формы расширения. Иногда простое нажатие этой кнопки заставляет платформу пересчитать связи и убрать лишние элементы, ссылающиеся на удаленные метаданные.
Рассмотрим радикальный, но крайне эффективный способ, если визуальные средства конфигуратора бессильны. Этот метод позволяет напрямую редактировать структуру метаданных расширения.
Выполним следующие действия:
Конфигурация — Разработка конфигурации — Выгрузить конфигурацию в файлы.<attributes> (для реквизитов формы) или <items> (для элементов интерфейса).Загрузить конфигурацию из файлов.Этот способ позволяет очистить расширение от любых «фантомных» записей, которые могут быть не видны в интерфейсе конфигуратора, но мешают обновлению или работе системы.
Иногда удаление блокируется не отсутствием реквизита в основной базе, а тем, что на этот реквизит ссылаются другие объекты внутри самого расширения. Проанализируем возможные места:
/ClearCache.Посмотрим на ситуацию, описанную в исходном сообщении: автор перешел к программному добавлению реквизитов. Это хорошая практика для динамических интерфейсов в УТ 11 или ERP. Если вы переходите на программное создание реквизитов формы, убедитесь, что в расширении не осталось никаких статических упоминаний этих полей. Программный код для добавления реквизитов обычно выглядит так:
// Пример программного добавления реквизита в форму
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("НовыйРеквизит", Новый ОписаниеТипов("Строка"), "Объект.Товары", "Заголовок", Истина));
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// Добавление элемента на форму для отображения реквизита
Элемент = Элементы.Добавить("НовыйРеквизит", Тип("ПолеФормы"), Элементы.Товары);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "Объект.Товары.НовыйРеквизит";
Использование программного метода позволяет избежать проблем с заимствованием метаданных при обновлениях, так как код гибок и не создает жестких ссылок в файлах конфигурации. Однако перед внедрением программного метода обязательно нужно полностью вычистить все следы старого статического реквизита из расширения одним из способов, описанных выше.
Мы проанализировали проблему удаления зависших реквизитов в расширениях 1С и разобрали четыре способа ее решения: от простого «финта» с временным созданием реквизита до низкоуровневого редактирования XML-структуры. Наиболее рекомендуемым для повседневной практики является Метод 1, так как он минимизирует риск повреждения структуры расширения и не требует ручного редактирования файлов.