При работе со справочником Номенклатура в современных конфигурациях на базе 1С:Предприятие 8.3 (таких как УТ 11, ERP 2 или КА 2) пользователи иногда сталкиваются с парадоксальной ситуацией. В табличной части ДополнительныеРеквизиты у группы (папки) справочника оказывается записано значение, которое невозможно удалить обычными средствами. При попытке очистки строки или удаления объекта система выдает предупреждение: «Объект не подлежит изменению». В этой статье мы подробно разберем, почему возникает эта ошибка, как данные попадают в группы, вопреки логике системы, и какими способами можно произвести очистку.
Для начала проанализируем ситуацию с технической стороны. Механизм дополнительных реквизитов и сведений является частью Библиотеки стандартных подсистем (БСП). Согласно типовой логике разработчиков 1С, дополнительные реквизиты предназначены для уточнения характеристик конкретных товаров (элементов), а не их групп. Платформа 1С на уровне метаданных позволяет иметь табличные части как у элементов, так и у групп иерархических справочников, однако программный код БСП жестко ограничивает редактирование этих данных для папок.
Ошибка «Объект не подлежит изменению» возникает в тот момент, когда срабатывают подписки на события или код в модуле объекта при попытке записи. Система проверяет тип объекта (группа или элемент) и, обнаружив попытку изменить состав дополнительных реквизитов у группы, блокирует действие.
Рассмотрим, как «запрещенные» данные могли попасть в базу:
ОбменДанными.Загрузка = Истина. В этом режиме большинство проверок в модулях объектов игнорируется.Это самый доступный способ для администратора системы, не требующий написания кода. Однако стандартный запуск обработки может не помочь, так как она по умолчанию подчиняется правилам проверки объектов. Разберем по шагам, как правильно настроить инструмент:
Справочник: Номенклатура.Дополнительные реквизиты.Если стандартная обработка не справляется или вам нужно очистить большое количество групп по сложному алгоритму, рассмотрим программный метод. Мы воспользуемся встроенным языком 1С, чтобы принудительно очистить табличную часть объекта, установив режим загрузки.
Проанализируем пример кода, который можно выполнить во внешней обработке или через консоль кода:
// Определим ссылку на группу номенклатуры, которую нужно очистить
СсылкаНаГруппу = Справочники.Номенклатура.НайтиПоНаименованию("ИмяВашейГруппы");
Если Не СсылкаНаГруппу.Пустая() Тогда
// Получаем объект для редактирования
ОбъектГруппы = СсылкаНаГруппу.ПолучитьОбъект();
// Проверяем, есть ли записи в табличной части
Если ОбъектГруппы.ДополнительныеРеквизиты.Количество() > 0 Тогда
// Очищаем всю табличную часть дополнительных реквизитов
ОбъектГруппы.ДополнительныеРеквизиты.Очистить();
// Устанавливаем признак Загрузка, чтобы обойти проверки БСП
ОбъектГруппы.ОбменДанными.Загрузка = Истина;
Попытка
ОбъектГруппы.Записать();
Сообщить("Табличная часть группы успешно очищена.");
Исключение
Сообщить("Ошибка при записи объекта: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Дополнительные реквизиты у группы отсутствуют.");
КонецЕсли;
КонецЕсли;
Этот код напрямую обращается к объекту базы данных. Установка свойства ОбменДанными.Загрузка = Истина является критически важной, так как именно она сообщает системе, что объект не нужно проверять на соответствие бизнес-логике (в данном случае — проверять, можно ли группе иметь доп. реквизиты).
Существуют сторонние инструменты, такие как Универсальный редактор реквизитов (часто встречается на технических ресурсах для разработчиков). Эти обработки позволяют просматривать и редактировать содержимое любых табличных частей «как в Excel».
Рассмотрим порядок действий при использовании подобных инструментов:
ДополнительныеРеквизиты.Важно: Будьте осторожны при использовании универсальных редакторов, так как они позволяют изменять служебные данные, что при неосторожном обращении может нарушить целостность базы данных.
В некоторых обсуждениях (например, в Сообщении 2 форума) предлагается радикальный метод: создать новую группу, перенести в неё данные и удалить старую. Мы крайне не рекомендуем этот способ по следующим причинам:
Проанализировав ситуацию, мы видим, что наиболее безопасным и корректным решением является точечная очистка табличной части существующего объекта с использованием флага Загрузка.
Подводя итог, отметим, что появление дополнительных реквизитов в группах номенклатуры — это чаще всего следствие технических сбоев при обмене данными. Чтобы решить проблему, рассмотрите возможность использования режима ОбменДанными.Загрузка в любом удобном для вас инструменте (будь то типовая обработка или программный код). Это позволит быстро и безболезненно привести справочник в порядок, не нарушая работу типовых механизмов 1С.