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