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