Как удалить созданные элементы в 1С и почему они не отображаются в обработке «Удаление помеченных объектов»?

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

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

Почему обработка удаления не видит помеченные элементы

Разберем основные причины, по которым стандартный механизм платформы не выводит помеченные объекты в список на удаление:

  1. Недостаточно прав у текущего пользователя в роли. Для того чтобы объект попал в стандартную обработку удаления, у роли пользователя должно быть установлено право «Интерактивное удаление помеченных» для конкретного объекта метаданных. Если право снято, система скрывает такие записи из обработки удаления.
  2. Ограничения на уровне записей (RLS). Если в конфигурации настроены ограничения прав на чтение данных (RLS), и пользователь не имеет доступа к конкретной группе или реквизитам помеченного элемента, этот объект не попадет в выборку обработки.
  3. Разделение данных. В базах с включенным механизмом разделения данных объекты, созданные в другой области данных или в неразделенном режиме, не будут видны из сеанса с иным значением разделителя.

Для исправления ситуации в режиме «Конфигуратор» откроем роль текущего пользователя и проверим наличие флагов «Чтение», «Просмотр» и «Интерактивное удаление помеченных» для нужного справочника.

Программное удаление и установка пометки удаления

Выясним, какими способами можно управлять удалением данных непосредственно из встроенного языка 1С:

  1. Установка пометки на удаление: наиболее безопасный способ, при котором сохраняется ссылочная целостность базы данных.
  2. Прямое физическое удаление: полное удаление записи методом Объект.Удалить().

Посмотрим на пример установки пометки удаления и непосредственного удаления:


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

// Физическое удаление записи (с осторожностью!)
Если ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда
    Объект = СсылкаНаЭлемент.ПолучитьОбъект();
    // Внимание: перед прямым удалением следует убедиться в отсутствии ссылок на объект
    Объект.Удалить();
КонецЕсли;

Важно: прямой вызов метода Удалить() полностью игнорирует ссылочную целостность базы данных. Если на удаляемый элемент ссылаются документы или регистры, в базе появятся «битые» ссылки вида <Объект не найден...>. Для проверки наличия связей перед удалением рекомендуется использовать метод глобального контекста НайтиПоСсылкам().

Массовое создание элементов справочника в цикле

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


// Входные параметры обработки: ИсходноеНаименование (Строка), КоличествоЭлементов (Число)
НачатьТранзакцию();
Попытка
    Для Сч = 1 По КоличествоЭлементов Цикл
        НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
        НовыйЭлемент.Наименование = ИсходноеНаименование + " " + Сч;
        НовыйЭлемент.Записать();
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();
    Сообщить("Успешно создано элементов: " + КоличествоЭлементов);
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение "Ошибка при создании элементов: " + ОписаниеОшибки();
КонецПопытки;

Использование явной транзакции ускоряет выполнение алгоритма в разы, так как СУБД выполняет фиксацию на диске один раз для всего пакета записей, а не для каждого элемента по отдельности.

Работа с константами и обработка закрытия программы

Проанализируем распространенную ошибку при обращении к константам. Если написать Константы.ИмяКонстанты, система вернет менеджер константы, а не само сохраненное значение (тип Булево, Строка и т.д.). Попытка проверить такое выражение в условии приведет к ошибке: «Значение не является значением объектного типа».

Для чтения значения необходимо использовать метод Получить():


// Чтение значения константы
ФлагВопроса = Константы.ЗадаватьВопросПриЗакрытииПрограммы.Получить();

// Запись нового значения константы
Константы.ЗадаватьВопросПриЗакрытииПрограммы.Установить(Истина);

Разберем, как правильно реализовать проверку в модуле управляемого приложения в событии ПередЗавершениемРаботыСистемы. Обратим внимание, что в современных конфигурациях с отключенной модальностью вместо устаревшей функции Вопрос() следует использовать асинхронные методы (например, ВопросАсинх() с конструкцией Ждать или ПоказатьВопрос()):


&НаКлиенте
Процедура ПередЗавершениемРаботыСистемы(Отказ)
    
    // Получаем значение настройки с сервера
    Если ПолучитьНастройкуЗапросаЗакрытияСервер() Тогда
        
        // Синхронный пример (для баз с включенным режимом модальности)
        Ответ = Вопрос("Вы действительно хотите завершить работу с программой?", РежимДиалогаВопрос.ДаНет);
        Если Ответ = КодВозвратаДиалога.Нет Тогда
            Отказ = Истина;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ПолучитьНастройкуЗапросаЗакрытияСервер()
    Возврат Константы.ЗадаватьВопросПриЗакрытииПрограммы.Получить();
КонецФункции

Таким образом, мы рассмотрели все этапы работы: от проверки ролей и прав доступа для отображения помеченных объектов до оптимизированного программного создания элементов и корректного обращения к константам платформы 1С:Предприятие.

← На главную