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