Как удалить «зависший» реквизит из расширения 1С, если он уже удален в основной конфигурации?

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

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

Рассмотрим подробно, почему это происходит и какими способами можно очистить расширение от таких «фантомных» реквизитов.

Выясним причину возникновения проблемы

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

В некоторых случаях попытка взаимодействия с такими реквизитами может приводить даже к аварийному завершению работы конфигуратора (дампу), особенно на устаревших релизах платформы (например, 8.3.15–8.3.17).

Метод 1: «Финт ушами» через временное восстановление реквизита

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

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

  1. Создадим реквизит в основной конфигурации. Перейдем в основную конфигурацию и создадим в нужном объекте (например, в табличной части Товары документа РеализацияТоваровУслуг) реквизит с точно таким же именем и типом данных, который «завис» в расширении.
  2. Синхронизируем состояние. После создания реквизита в основной конфигурации откроем расширение. Теперь платформа должна «увидеть», что реквизит в расширении снова соответствует реквизиту в основной конфигурации.
  3. Удалим реквизит из расширения. Теперь, когда связь восстановлена, выделим проблемный реквизит в дереве метаданных расширения и нажмем клавишу Del. Платформа должна позволить выполнить это действие без ошибок.
  4. Удалим реквизит из основной конфигурации. Возвращаемся в основную конфигурацию и окончательно удаляем временно созданный реквизит.

Этот метод заставляет платформу корректно сопоставить идентификаторы объекта в обеих структурах и правильно зарегистрировать операцию удаления в таблицах метаданных базы данных.

Метод 2: Полное перестроение заимствованного объекта

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

Попробуем следующий алгоритм:

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

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

Метод 3: Очистка через выгрузку в XML-файлы

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

Выполним следующие действия:

  1. Выгрузим расширение в файлы: меню Конфигурация — Разработка конфигурации — Выгрузить конфигурацию в файлы.
  2. Перейдем в папку с выгруженными файлами и найдем XML-файл, соответствующий форме или объекту, где «завис» реквизит.
  3. Откроем файл любым текстовым редактором (например, Notepad++).
  4. Найдем упоминание проблемного реквизита. Обычно он находится в блоках <attributes> (для реквизитов формы) или <items> (для элементов интерфейса).
  5. Аккуратно удалим соответствующий узел XML целиком. Будьте внимательны с открывающими и закрывающими тегами.
  6. Сохраним файл и загрузим конфигурацию обратно из файлов через меню Загрузить конфигурацию из файлов.

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

Метод 4: Проверка скрытых связей и очистка кэша

Иногда удаление блокируется не отсутствием реквизита в основной базе, а тем, что на этот реквизит ссылаются другие объекты внутри самого расширения. Проанализируем возможные места:

Программное добавление реквизитов

Посмотрим на ситуацию, описанную в исходном сообщении: автор перешел к программному добавлению реквизитов. Это хорошая практика для динамических интерфейсов в УТ 11 или ERP. Если вы переходите на программное создание реквизитов формы, убедитесь, что в расширении не осталось никаких статических упоминаний этих полей. Программный код для добавления реквизитов обычно выглядит так:


// Пример программного добавления реквизита в форму
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("НовыйРеквизит", Новый ОписаниеТипов("Строка"), "Объект.Товары", "Заголовок", Истина));
ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

// Добавление элемента на форму для отображения реквизита
Элемент = Элементы.Добавить("НовыйРеквизит", Тип("ПолеФормы"), Элементы.Товары);
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "Объект.Товары.НовыйРеквизит";

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

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

Мы проанализировали проблему удаления зависших реквизитов в расширениях 1С и разобрали четыре способа ее решения: от простого «финта» с временным созданием реквизита до низкоуровневого редактирования XML-структуры. Наиболее рекомендуемым для повседневной практики является Метод 1, так как он минимизирует риск повреждения структуры расширения и не требует ручного редактирования файлов.

← На главную