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