Как запретить редактирование номера у определенных типов документов в 1С:ЗУП?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Способ 1. Использование стандартных ролей и прав доступа

Прежде чем приступать к написанию кода, проанализируем типовые возможности подсистемы управления доступом. В конфигурациях на базе БСП (Библиотека стандартных подсистем), к которым относится и ЗУП 3.1, существует специальная роль РедактированиеНомеровОбъектов.

Рассмотрим алгоритм действий по ограничению прав:

  1. Перейдем в раздел Администрирование — Настройки пользователей и прав — Профили групп доступа.
  2. Проанализируем используемые профили. По умолчанию право на редактирование номеров может входить в профили администраторов или старших кадровиков/расчетчиков.
  3. Создадим копию типового профиля и в списке разрешенных ролей снимем флажок с роли Редактирование номеров объектов.
  4. Назначим обновленный профиль пользователям.

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

Способ 2. Глобальная настройка в интерфейсе

Выясним, существует ли простая «галочка» в пользовательском режиме. В некоторых версиях конфигураций в разделе Администрирование — Общие настройки присутствует флаг Редактирование номеров документов. Если его снять, поле номера станет недоступным для изменения во всех формах для всех пользователей, кроме обладателей полных прав. Это самый быстрый и «дешевый» способ решения задачи без программирования.

Способ 3. Использование механизма БлокировкаИзмененияОбъектов

Если нам необходимо программное решение, которое интегрируется в логику типовой конфигурации, проанализируем модуль БлокировкаИзмененияОбъектов. Этот механизм БСП предназначен для защиты ключевых реквизитов (номер, дата, проведен) от случайного изменения.

Посмотрим на пример внедрения в модуле формы документа. Обычно в типовых документах ЗУП в процедуре ПриСозданииНаСервере уже есть вызов стандартного механизма:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Стандартные подсистемы
    БлокировкаИзмененияОбъектов.ПриСозданииНаСервереФормыОбъекта(ЭтотОбъект, Отказ, СтандартнаяОбработка);
    // Конец Стандартные подсистемы
КонецПроцедуры

Для реализации точечного запрета мы можем перехватить этот вызов. Если вы вносите изменения непосредственно в конфигурацию (без расширений), найдем общий модуль БлокировкаИзмененияОбъектовПереопределяемый и добавим логику запрета для конкретных типов документов в процедуру ПриОпределенииЗаблокированныхРеквизитовОбъекта. Это позволит стандартной кнопке «Разрешить редактирование реквизитов» управлять доступностью номера.

Способ 4. Программная блокировка в форме объекта

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

Рекомендуется использовать событие ПриСозданииНаСервере, так как это наиболее эффективный момент для настройки интерфейса. Рассмотрим пример кода:


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

Почему мы используем ТолькоПросмотр вместо Доступность = Ложь? Установка Доступность = Ложь делает поле серым и трудночитаемым, а также исключает его из навигации клавишей Tab. ТолькоПросмотр сохраняет визуальную четкость текста, но запрещает ввод.

Способ 5. Условное оформление формы

Для управляемых форм более гибким методом является использование Условного оформления. Это позволяет настроить доступность поля без написания явного кода блокировки в процедурах управления элементами.

Выполним следующие шаги в конфигураторе:

  1. Откроем форму нужного документа.
  2. Перейдем на вкладку Условное оформление.
  3. Добавим новый элемент оформления.
  4. В поле Оформление выберем ТолькоПросмотр = Истина.
  5. В поле Условие укажем: Объект.Ссылка Не Заполнено (или иное условие, например, проверку роли текущего пользователя).
  6. В поле Оформляемые поля выберем поле Номер.

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

Способ 6. Защита на уровне записи (Подписка на событие)

Если пользователи пытаются изменить номер не через форму, а с помощью обработки «Групповое изменение реквизитов» или программно, визуальные запреты в форме не помогут. В этом случае проанализируем ситуацию на уровне базы данных.

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


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

Этот метод гарантирует 100% защиту данных, так как проверка происходит непосредственно перед фиксацией изменений в СУБД.

Резюме

Мы рассмотрели различные подходы к решению задачи. Выбор метода зависит от ваших требований:

Сочетание визуальной блокировки в форме и контроля в подписке на событие обеспечит максимальную стабильность нумерации в вашей базе 1С:ЗУП.

← На главную