Как удалить предопределенный элемент в Справочнике Показатели расчета зарплаты?

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

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

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

Почему элемент не исчезает после удаления в Конфигураторе?

Проанализируем ситуацию: начиная с версии платформы 8.3.6, механизм работы с предопределенными данными изменился. Теперь связь между объектом в метаданных и записью в таблице базы данных является «мягкой». Когда вы удаляете элемент в Конфигураторе, платформа не удаляет саму запись в базе данных автоматически, чтобы избежать потери ссылочной целостности. Внутри записи в базе данных остается заполненным служебный реквизит ИмяПредопределенныхДанных. Пока он заполнен строковым идентификатором, элемент считается предопределенным, даже если в дереве конфигурации его уже нет.

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

Рассмотрим самый простой способ, который не требует написания кода. Воспользуемся стандартной обработкой «Групповое изменение реквизитов», которая присутствует в большинстве современных конфигураций (ЗУП 3.1, ERP, КА 2).

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

После этой операции элемент перестанет подсвечиваться специальной иконкой «шарика» в списке и станет обычным элементом справочника. Теперь его можно пометить на удаление и удалить стандартным способом через «Удаление помеченных объектов».

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

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

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


// Выбираем нужный элемент (например, по наименованию или ссылке)
ЭлементСсылка = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("ВашПоказатель");

Если Не ЭлементСсылка.Пустая() Тогда
    // Получаем объект для изменения
    ОбъектПоказатель = ЭлементСсылка.ПолучитьОбъект();
    
    // Очищаем имя предопределенных данных
    ОбъектПоказатель.ИмяПредопределенныхДанных = "";
    
    // Переименовываем для удобства поиска при удалении
    ОбъектПоказатель.Наименование = "УДАЛИТЬ_" + ОбъектПоказатель.Наименование;
    
    // Устанавливаем пометку удаления
    ОбъектПоказатель.ПометкаУдаления = Истина;
    
    // Включаем режим загрузки, чтобы обойти проверки бизнес-логики
    ОбъектПоказатель.ОбменДанными.Загрузка = Истина;
    
    // Записываем объект
    Попытка
        ОбъектПоказатель.Записать();
        Сообщить("Элемент успешно преобразован в обычный и помечен на удаление.");
    Исключение
        Сообщить("Ошибка при записи: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

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

Способ 3. Тестирование и исправление (штатный механизм)

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

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

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

Важное предостережение для ЗУП

Проанализируем риски. Справочник ПоказателиРасчетаЗарплаты — это не просто список строк. На эти показатели ссылаются:

Совет: Прежде чем окончательно удалять элемент, всегда используйте кнопку «Найти ссылки на объект». Если ссылки найдены в документах прошлых периодов, лучше не удалять показатель, а просто переименовать его в "НЕ ИСПОЛЬЗОВАТЬ (Удалить)" и очистить ИмяПредопределенныхДанных, чтобы он не мешался в коде, но сохранил целостность базы данных.

Таким образом, мы рассмотрели три основных способа решения проблемы. Наиболее эффективным для разового удаления является Способ 2 (программный), так как он гарантирует обход большинства блокировок платформы.

← На главную