Как запретить пользователям пометку на удаление заказов в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Почему не срабатывает событие «ПередУдалением»?

Важно различать два процесса: непосредственное удаление объекта из базы данных (физическое удаление) и установку пометки на удаление. Событие ПередУдалением в форме списка срабатывает только тогда, когда объект удаляется безвозвратно. Когда же пользователь нажимает правой кнопкой мыши и выбирает «Пометить на удаление», происходит обычная запись документа, в ходе которой изменяется реквизит ПометкаУдаления. Следовательно, стандартные события формы списка здесь не помогут.

Реализация контроля через событие «ПередЗаписью»

Для управления процессом пометки на удаление необходимо использовать событие ПередЗаписью в модуле объекта. Именно здесь мы можем перехватить попытку записи документа и проверить, меняется ли статус ПометкаУдаления.

Разберем алгоритм действий:

  1. Переходим в модуль объекта документа ЗаказПокупателя.
  2. Находим или создаем процедуру ПередЗаписью.
  3. Сравниваем текущую пометку объекта с той, что записана в базе данных, чтобы понять, происходит ли изменение пометки прямо сейчас.
  4. Устанавливаем Отказ = Истина, если пользователь не имеет соответствующих прав или если статус документа не допускает удаления.

Рассмотрим пример кода для реализации этой проверки:


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

Использование Подписки на события

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

Порядок действий:

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

Рекомендации по управлению правами

Никогда не прописывайте имена конкретных пользователей (например, «Илья» или «Саша») непосредственно в коде 1С. Это плохая практика, так как при увольнении или смене сотрудников вам придется постоянно корректировать исходный код. Вместо этого:

  1. Создайте в конфигураторе новую роль, например, УдалениеЗаказов.
  2. Назначьте эту роль необходимым пользователям в режиме «Конфигуратор».
  3. В коде используйте метод РолиДоступны("УдалениеЗаказов") для проверки прав.

Такой подход обеспечивает безопасность и профессиональный уровень разработки. Если вы столкнулись с ошибкой «Метод не обнаружен» при обращении к общим модулям, помните, что в разных версиях конфигураций структура объектов может отличаться. Всегда можно обратиться к данным напрямую через ЭтотОбъект.Ссылка.ПометкаУдаления — это самый надежный способ получения данных из базы для проверки.

← На главную