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