Как правильно настроить запрет редактирования своих реквизитов через БСП, чтобы они блокировались сразу при открытии формы

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

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

Шаг 1. Регистрация реквизитов в модуле менеджера

Первым делом нам необходимо сообщить системе, какие именно реквизиты должны подлежать блокировке. Это делается в модуле менеджера объекта (справочника, документа и т.д.). Разберем ситуацию на примере добавления нового поля в справочник ДоговорыКонтрагентов.

Найдем или создадим в модуле менеджера функцию ПолучитьБлокируемыеРеквизитыОбъекта. Проанализируем пример кода:


Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт
    Результат = Новый Массив;
    
    // Добавляем типовые реквизиты
    Результат.Добавить("Организация");
    Результат.Добавить("ВалютаВзаиморасчетов");
    
    // Добавляем наш новый реквизит
    Результат.Добавить("ВариантСопровождения_СпецУсловие");
    
    Возврат Результат;
КонецФункции

Важный нюанс: Если вы используете расширение конфигурации, убедитесь, что вы используете аннотацию &После или &Вместо, чтобы не затереть список типовых реквизитов, которые уже определены в основной конфигурации. Механизм БСП собирает этот массив для определения состава «замороженных» полей.

Шаг 2. Инициализация запрета в форме объекта

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


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

Проанализируем ситуацию: если вызов ЗаблокироватьРеквизиты(ЭтаФорма) присутствует, но ваш реквизит все равно доступен, значит, либо имя элемента формы не совпадает с именем реквизита, либо состояние объекта (новый/записанный) определяется системой не так, как вы ожидаете. Механизм БСП по умолчанию не блокирует реквизиты в новых объектах, так как их в любом случае нужно заполнить перед первой записью.

Шаг 3. Подключение клиентских команд для разблокировки

Чтобы пользователь мог осознанно разрешить редактирование (нажать кнопку «Разрешить редактирование реквизитов»), на форме должна быть соответствующая команда. Выясним, как правильно прописать обработчик этой команды, чтобы форма обновлялась мгновенно.

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


&НаКлиенте
Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда)
    
    // Вызываем стандартный диалог БСП
    Если ЗапретРедактированияРеквизитовОбъектовКлиент.РазрешитьРедактированиеРеквизитовОбъекта(ЭтаФорма) Тогда
        
        // После подтверждения пользователем, принудительно обновляем доступность элементов
        ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы(ЭтаФорма);
        
    КонецЕсли;
    
КонецПроцедуры

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


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

Почему реквизит остается доступным? Анализ причин

Если вышеописанные шаги выполнены, но поле всё еще доступно для редактирования в записанном объекте, проанализируем следующие моменты:

  1. Соответствие имен: Механизм БСП ищет на форме элементы, путь к данным которых совпадает с именами из массива ПолучитьБлокируемыеРеквизитыОбъекта. Если ваш реквизит называется СпецУсловие, а элемент на форме — ДекорацияСпецУсловие или ГруппаСпецУсловие, автоматическая блокировка может не найти цель. Убедитесь, что Имя элемента формы совпадает с именем реквизита метаданных.
  2. Свойство «Изменяет данные»: Проверьте в свойствах элемента формы флаг ИзменяетДанные. Если он снят, платформа может исключать элемент из некоторых цепочек обработки событий.
  3. Конфликт с функциональными опциями: Если ваш реквизит привязан к функциональной опции, которая в данный момент выключена (или включена программно), это может переопределять видимость и доступность элемента в обход БСП.
  4. Кэширование: Параметры блокировки реквизитов кэшируются системой. При разработке обязательно перезапускайте сеанс «1С:Предприятия», а в некоторых случаях стоит очистить кэш конфигурации, чтобы изменения в функции ПолучитьБлокируемыеРеквизитыОбъекта вступили в силу.

Использование расширений и переопределяемых модулей

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

Для существующих справочников (таких как ДоговорыКонтрагентов) эта регистрация уже выполнена в самой конфигурации, поэтому достаточно только добавить реквизит в массив блокируемых в модуле менеджера. Однако, если вы обнаружили, что ЗаблокироватьРеквизиты(ЭтаФорма) внутри себя возвращает пустой список — проверьте именно переопределяемый модуль.

Заключение и итоговый чек-лист

Для успешной настройки блокировки своего реквизита выполните следующую проверку:

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

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

← На главную