По техзаданию клиента кнопки Блокировка/Разблокировка должны располагаться в Дополнительном меню ("Ещё").
Пример перемещения кнопки Разблокировать форму из Дополнительного меню в Командную панель подробно рассмотрен в статье //infostart.ru/1c/tools/1864324/
1. Новый реквизит и меню документа ОтражениеЗарплатыВФинансовомУчете
Добавлен реквизит ЗаблокированОтИзменений. Нет необходимости программно выводить его на форму документа.
Он изменяется обработчиками нажатия кнопок Заблокировать форму и Разблокировать форму.
Если ЗаблокированОтИзменений = Ложь, кнопка Заблокировать форму активна.
Если ЗаблокированОтИзменений = Истина, появляется кнопка Разблокировать форму и стандартная надпись о причинах блокировки. Кнопка «Заблокировать» не активна.
При анализе причины блокировки проверяется значение реквизита ЗаблокированОтИзменений.
2. ОбработчикиСобытийФормы документа ОтражениеЗарплатыВФинансовомУчете
Пример программного создания кнопок по списку имен добавленных команд.
Подключение функционала типового модуля БлокировкаИзмененияОбъектов выполнено на основании статьи //infostart.ru/1c/tools/1864324/
#Область ОбработчикиСобытийФормы
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Metronom_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокДобавленныхКоманд = Metronom_ДобавитьКомандыДляКнопокФормы();
Для Каждого ДобавленнаяКоманда Из СписокДобавленныхКоманд Цикл
Metronom_ДобавитьКнопкуНаФорму(ДобавленнаяКоманда.Значение, ДобавленнаяКоманда.Представление);
КонецЦикла;
// В форме нового документа выводит группу с информацией о причинах блокировки
БлокировкаИзмененияОбъектов.ПриСозданииНаСервереФормыОбъекта(ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецПроцедуры
&НаСервере
&После("ПриЧтенииНаСервере")
Процедура Metronom_ПриЧтенииНаСервере(ТекущийОбъект)
//В форме существующего документа выводит группу с информацией о причинах блокировки
БлокировкаИзмененияОбъектов.ПриЧтенииНаСервереФормыОбъекта(ЭтотОбъект, ТекущийОбъект);
КонецПроцедуры
&НаСервере
&После("ПослеЗаписиНаСервере")
Процедура Metronom_ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// В форме документа обновляет сведения о блокировках
БлокировкаИзмененияОбъектов.ПослеЗаписиНаСервереФормыОбъекта(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецПроцедуры
#КонецОбласти
3. ОбработчикиКомандФормы документа ОтражениеЗарплатыВФинансовомУчете
Metronom_ЗаблокироватьФормуОбъекта — обработчик команды, добавленной программно.
Подключаемый_РазблокироватьФормуОбъекта — обработчик команды из функционала типового модуля БлокировкаИзмененияОбъектов.
В обработчика команд кнопок Заблокировать/Разблокировать добавлен вызов процедуры Metronom_УстановитьСвойствоЗаблокирован(Истина/Ложь).
Изменяет реквизит объекта ЗаблокированОтИзменений для дальнейшего использования в общем модуле при анализе причин блокировки. См. описание кода общих модулей в статье //infostart.ru/1c/tools/1864324/
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Подключаемый_РазблокироватьФормуОбъекта(Команда)
//В этом примере с добавлением кнопки ЗаблокироватьФорму вызов данной процедуры не нужен
//так как в УстановитьДоступностьПоБлокировке вызывается БлокировкаИзмененияОбъектов.ПослеЗаписиНаСервереФормыОбъекта
//с аналогичным действием проверки причин блокировки
//БлокировкаИзмененияОбъектовКлиент.РазблокироватьФормуОбъекта(ЭтотОбъект, Объект.Ссылка);
Metronom_УстановитьСвойствоЗаблокирован(Ложь);
Metronom_УстановитьДоступностьПоБлокировке();
ЭтаФорма.Прочитать();
КонецПроцедуры
&НаКлиенте
Процедура Metronom_ЗаблокироватьФормуОбъекта(Команда)
Metronom_УстановитьСвойствоЗаблокирован(Истина);
Metronom_УстановитьДоступностьПоБлокировке();
ЭтаФорма.Прочитать();
КонецПроцедуры
#КонецОбласти
4. СлужебныеПроцедурыИФункции модуля формы документа ОтражениеЗарплатыВФинансовомУчете
Пример программного добавления команды ЗаблокироватьФормуОбъекта, добавление кнопок по списку имен команд.
#Область СлужебныеПроцедурыИФункции
&НаСервере
Функция Metronom_ДобавитьКомандыДляКнопокФормы()
СписокКоманд = Новый СписокЗначений;
//Команда блокировки формы объекта. Команда Разблокировать подключена из модуля БлокировкаИзмененияОбъектов
КомандаИмя = "Metronom_ЗаблокироватьФормуОбъекта";
Команда = ЭтаФорма.Команды.Добавить(КомандаИмя);
Команда.Действие = КомандаИмя;
Команда.Отображение = ОтображениеКнопки.КартинкаИТекст;
Команда.Картинка = БиблиотекаКартинок.МРМКладовщикаБлокировка;
Команда.Заголовок = "Заблокировать форму";
Команда.Подсказка = "Блокирует форму объекта от изменений";
ПоложениеКнопки = "ВДополнительномПодменю";
СписокКоманд.Добавить(КомандаИмя,ПоложениеКнопки);
//Здесь можно добавить команды, по их наименованиям в СписокКоманд будут созданы одноименные кнопки
//Например,на форму документа могут быть программно добавлены кнопки заполнения данных по нетиповому алгоритму
Возврат СписокКоманд;
КонецФункции
&НаСервере
Процедура Metronom_ДобавитьКнопкуНаФорму(ИмяКоманды, МестоВПанели)
Кнопка = ЭтаФорма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ЭтаФорма.КоманднаяПанель);
Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
Кнопка.ИмяКоманды = ИмяКоманды;
Кнопка.Видимость = Истина;
Если Объект.Metronom_ЗаблокированОтИзменений тогда
Кнопка.Доступность = Ложь;
КонецЕсли;
Если МестоВПанели = "ВКоманднойПанели" тогда
Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
ИначеЕсли МестоВПанели = "ВДополнительномПодменю" тогда
Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
Иначе
Кнопка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.Авто;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура Metronom_УстановитьСвойствоЗаблокирован(ЗначениеЗаблокирован)
обДок = Объект.Ссылка.ПолучитьОбъект();
обДок.Metronom_ЗаблокированОтИзменений = ЗначениеЗаблокирован;
обДок.Записать(РежимЗаписиДокумента.Запись);
КонецПроцедуры
&НаСервере
Процедура Metronom_УстановитьДоступностьПоБлокировке()
// В форме документа обновляем доступность и сведения о блокировках
//Для типовых кнопок, и для добавленных в СписокКоманд
БлокировкаИзмененияОбъектов.ПослеЗаписиНаСервереФормыОбъекта(ЭтотОбъект, Объект, Новый Структура);
Для Каждого Элемент из Элементы Цикл
Если ТипЗнч(Элемент) = Тип("КнопкаФормы") тогда
Если СтрНайти(Элемент.ИмяКоманды, "Metronom_") тогда
Элемент.Доступность = Объект.Metronom_ЗаблокированОтИзменений;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//Рабочий вариант без цикла по перебору Элементов представлен ниже,
//однако нужно указывать поименно добавленные дополнительно кнопки
//а не один раз указать ИмяКоманды(кнопки) в процедуре добавления новых команд
//ДобавленнаяКнопка = Элементы.Найти("Metronom_ЗаблокироватьФормуОбъекта");
//ДобавленнаяКнопка.Доступность = Объект.Metronom_ЗаблокированОтИзменений;
КонецПроцедуры
#КонецОбласти
Проверено на следующих конфигурациях и релизах:
- 1С:Комплексная автоматизация 2, релизы 2.5.21.128