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