Как удалить дополнительный реквизит из группы номенклатуры при ошибке «Объект не подлежит изменению»?

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

При работе со справочником Номенклатура в современных конфигурациях на базе 1С:Предприятие 8.3 (таких как УТ 11, ERP 2 или КА 2) пользователи иногда сталкиваются с парадоксальной ситуацией. В табличной части ДополнительныеРеквизиты у группы (папки) справочника оказывается записано значение, которое невозможно удалить обычными средствами. При попытке очистки строки или удаления объекта система выдает предупреждение: «Объект не подлежит изменению». В этой статье мы подробно разберем, почему возникает эта ошибка, как данные попадают в группы, вопреки логике системы, и какими способами можно произвести очистку.

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

Для начала проанализируем ситуацию с технической стороны. Механизм дополнительных реквизитов и сведений является частью Библиотеки стандартных подсистем (БСП). Согласно типовой логике разработчиков 1С, дополнительные реквизиты предназначены для уточнения характеристик конкретных товаров (элементов), а не их групп. Платформа 1С на уровне метаданных позволяет иметь табличные части как у элементов, так и у групп иерархических справочников, однако программный код БСП жестко ограничивает редактирование этих данных для папок.

Ошибка «Объект не подлежит изменению» возникает в тот момент, когда срабатывают подписки на события или код в модуле объекта при попытке записи. Система проверяет тип объекта (группа или элемент) и, обнаружив попытку изменить состав дополнительных реквизитов у группы, блокирует действие.

Рассмотрим, как «запрещенные» данные могли попасть в базу:

  1. Обмен данными: При синхронизации с другими конфигурациями или внешними сайтами данные записываются с установленным признаком ОбменДанными.Загрузка = Истина. В этом режиме большинство проверок в модулях объектов игнорируется.
  2. Некорректная программная запись: Использование внешних обработок или расширений, которые принудительно записывают значения в табличную часть группы.
  3. Групповое изменение реквизитов: В старых версиях платформы или при определенных настройках стандартная обработка могла позволить выбрать группы для изменения состава реквизитов.

Способ 1. Использование обработки «Групповое изменение реквизитов»

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

  1. Откроем обработку Групповое изменение реквизитов (обычно находится в разделе НСИ и администрирование — Обслуживание — Корректировка данных).
  2. Выберем объект Справочник: Номенклатура.
  3. Настроим отбор так, чтобы в список попала только нужная нам группа (папка). Важно убедиться, что выбрана именно группа, а не элементы внутри неё.
  4. Нажмем кнопку Дополнительные параметры. Здесь кроется главный секрет: необходимо установить флаг Записывать объекты с установленным признаком ОбменДанными.Загрузка. Именно это позволит нам обойти проверку БСП и ошибку «Объект не подлежит изменению».
  5. В списке реквизитов найдем табличную часть Дополнительные реквизиты.
  6. Установим действие «Очистить» или выберем конкретную строку для удаления, если инструмент это позволяет.
  7. Нажмем Изменить реквизиты.

Способ 2. Программная очистка через внешний код

Если стандартная обработка не справляется или вам нужно очистить большое количество групп по сложному алгоритму, рассмотрим программный метод. Мы воспользуемся встроенным языком 1С, чтобы принудительно очистить табличную часть объекта, установив режим загрузки.

Проанализируем пример кода, который можно выполнить во внешней обработке или через консоль кода:


// Определим ссылку на группу номенклатуры, которую нужно очистить
СсылкаНаГруппу = Справочники.Номенклатура.НайтиПоНаименованию("ИмяВашейГруппы");

Если Не СсылкаНаГруппу.Пустая() Тогда
    // Получаем объект для редактирования
    ОбъектГруппы = СсылкаНаГруппу.ПолучитьОбъект();
    
    // Проверяем, есть ли записи в табличной части
    Если ОбъектГруппы.ДополнительныеРеквизиты.Количество() > 0 Тогда
        
        // Очищаем всю табличную часть дополнительных реквизитов
        ОбъектГруппы.ДополнительныеРеквизиты.Очистить();
        
        // Устанавливаем признак Загрузка, чтобы обойти проверки БСП
        ОбъектГруппы.ОбменДанными.Загрузка = Истина;
        
        Попытка
            ОбъектГруппы.Записать();
            Сообщить("Табличная часть группы успешно очищена.");
        Исключение
            Сообщить("Ошибка при записи объекта: " + ОписаниеОшибки());
        КонецПопытки;
        
    Иначе
        Сообщить("Дополнительные реквизиты у группы отсутствуют.");
    КонецЕсли;
КонецЕсли;

Этот код напрямую обращается к объекту базы данных. Установка свойства ОбменДанными.Загрузка = Истина является критически важной, так как именно она сообщает системе, что объект не нужно проверять на соответствие бизнес-логике (в данном случае — проверять, можно ли группе иметь доп. реквизиты).

Способ 3. Использование «Универсального редактора реквизитов»

Существуют сторонние инструменты, такие как Универсальный редактор реквизитов (часто встречается на технических ресурсах для разработчиков). Эти обработки позволяют просматривать и редактировать содержимое любых табличных частей «как в Excel».

Рассмотрим порядок действий при использовании подобных инструментов:

  1. Откроем редактор и выберем нашу группу номенклатуры.
  2. Перейдем к просмотру табличной части ДополнительныеРеквизиты.
  3. Удалим лишние строки непосредственно в интерфейсе редактора.
  4. Перед сохранением убедимся, что в настройках редактора включен режим ОбменДанными.Загрузка.
  5. Сохраним изменения.

Важно: Будьте осторожны при использовании универсальных редакторов, так как они позволяют изменять служебные данные, что при неосторожном обращении может нарушить целостность базы данных.

Почему не стоит пересоздавать группу?

В некоторых обсуждениях (например, в Сообщении 2 форума) предлагается радикальный метод: создать новую группу, перенести в неё данные и удалить старую. Мы крайне не рекомендуем этот способ по следующим причинам:

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

Заключение и рекомендации

Подводя итог, отметим, что появление дополнительных реквизитов в группах номенклатуры — это чаще всего следствие технических сбоев при обмене данными. Чтобы решить проблему, рассмотрите возможность использования режима ОбменДанными.Загрузка в любом удобном для вас инструменте (будь то типовая обработка или программный код). Это позволит быстро и безболезненно привести справочник в порядок, не нарушая работу типовых механизмов 1С.

← На главную