Как запретить редактирование табличной части документа, если он введен на основании?

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

В процессе работы в 1С:Комплексная автоматизация 1.1 часто возникает задача контроля целостности бизнес-процессов. В частности, если менеджер вводит документ Реализация товаров и услуг на основании Заказа покупателя, важно сохранить резерв товаров и не допустить произвольного изменения табличной части пользователем. Разберем, как реализовать такой запрет, чтобы менеджеры не могли «снимать» резервы без согласования.

Метод 1: Интерфейсный запрет через форму

Первый уровень защиты — визуальный. Мы должны сделать так, чтобы пользователь сразу видел ограничение и не тратил время на попытки изменить заблокированные строки. Реализуем это в модуле формы.

Для этих целей лучше всего использовать событие ПриСозданииНаСервере. В этот момент мы проверяем наличие документа-основания и, если он есть, устанавливаем для колонок табличной части свойство ТолькоПросмотр или Доступность.

Рассмотрим, как это выглядит в коде:


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

Также можно использовать обработчики ПриПолученииДанных, если логика запрета зависит от содержимого конкретной строки (например, разрешить менять товары, не попавшие в резерв, но заблокировать те, что из заказа).

Метод 2: Серверный контроль в модуле объекта

Интерфейсные ограничения легко обойти, если использовать групповые обработки или внешние отчеты. Чтобы обеспечить надежную защиту, необходимо добавить проверку в модуле объекта. Мы используем процедуру ПередЗаписью.


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

Метод 3: Использование подписки на событие

Если вам нужно внедрить контроль сразу для нескольких видов документов, наиболее правильным решением будет Подписка на событие. Создайте подписку на событие ПередЗаписью для всех необходимых документов.

  1. Создайте общую процедуру в модуле обычного приложения или общем модуле.
  2. В этой процедуре получайте текущий документ через Источник.
  3. Проверяйте наличие ссылки на Заказ покупателя.
  4. Если условия нарушены, устанавливайте Отказ = Истина.

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

Важные рекомендации по реализации

Чтобы система работала максимально эффективно и не раздражала пользователей, придерживайтесь следующих правил:

Комбинируя эти подходы — интерфейсную блокировку и жесткий серверный контроль — вы создадите надежный барьер против некорректных действий пользователей в вашей 1С.

← На главную