Запрет изменения формы документа при указании определенного реквизита

1. MikeGorshkov 15.05.19 17:12 Сейчас в теме
Добрый день.
Конфигурация самописная на Управляемых формах.
Хочу на форме документа установить запрет изменения.
Документ содержит реквизит "Перечисление.Статус"
При установке определенного реквизита и сохранения изменений форма должна быть заблокирована от изменений.
Данное правило распространяется только на пользователей с определенной ролью. А у кого полные права могу менять.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. v.l. 434 15.05.19 19:20 Сейчас в теме
(1) Недавно делал такое же: некоторым пользователям разрешено было изменять несколько реквизитов.
Условие по ролям исполнителей и доступности роли прав доступа.

&НаСервере
Функция ДоступностьРоли(ИмяПроверяемойРоли)
	Возврат Пользователи.РолиДоступны(ИмяПроверяемойРоли, Пользователи.ТекущийПользователь());
КонецФункции

&НаКлиенте
Процедура УстановитьДоступностьФормы()
	
	// IDDQD для администратора
	Если ДоступностьРоли("ПолныеПрава") Тогда
		Возврат;
	КонецЕсли;
	
	// Для обычных пользователей в зависимости от ролей некоторые элементы оставить доступными для редактирования
	УстановитьФормуНаПросмотр = СуществуетПодчиненныйБизнесПроцесс();
	Если УстановитьФормуНаПросмотр Тогда
		ОтключитьОбработчикОжидания("УстановитьДоступностьФормы");
		
		Если ДоступностьРоли("ДобавлениеИзменениеЗаявокНаПлатежПоЛокации")
			ИЛИ ЭтоФинансовыйКонтролер() Тогда
			Для каждого Элемент Из ЭтаФорма.Элементы Цикл
				ИмяЭлемента = ВРег(Элемент.Имя);
				// Пропуск элементов и кнопки записи, доступных для редактирования пользователю с правом корректировки
				Если СтрНайти(ИмяЭлемента, ВРег("ФормаЗаписать")) > 0
					Или СтрНайти(ИмяЭлемента, ВРег("ФормаОтправитьНаСогласование")) > 0 // todo: нужна ли эта кнопка?
					Или СтрНайти(ИмяЭлемента, ВРег("ФункциональнаяСтруктура")) > 0
					Или СтрНайти(ИмяЭлемента, ВРег("НазначениеПлатежа")) > 0
					Или СтрНайти(ИмяЭлемента, ВРег("СтатьяДДС")) > 0
					Или СтрНайти(ИмяЭлемента, ВРег("ОбновитьОстатокБюджета")) > 0
					Или СтрНайти(ИмяЭлемента, ВРег("СоздатьНовыйБанковскийСчет")) > 0 Тогда
					Продолжить;
				КонецЕсли;
				Если СтрНайти(ИмяЭлемента, ВРег("КонтрагентБанковскийСчет")) > 0
					И Не ЗначениеЗаполнено(Объект.КонтрагентБанковскийСчет) Тогда
					Продолжить;
				КонецЕсли;
				Если ТипЗнч(Элемент) = Тип("ДекорацияФормы") Тогда
					Продолжить;
				КонецЕсли;
				Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда
					Продолжить;
				КонецЕсли;
				Если ТипЗнч(Элемент) = Тип("КнопкаФормы") Тогда
					Элемент.Доступность = Ложь;
				Иначе
					Элемент.ТолькоПросмотр = Истина;
				КонецЕсли;
			КонецЦикла;
		Иначе
			ЭтаФорма.ТолькоПросмотр = Истина;
		КонецЕсли;
		
	КонецЕсли;
КонецПроцедуры
Показать
Nad_kin; Bespechnii_kot; Shecurok; MikeGorshkov; +4 Ответить
8. MikeGorshkov 15.05.19 19:31 Сейчас в теме
(6)
вно делал такое же: некоторым пользователям разрешено было изменять несколько реквизитов.
Условие по ролям исполнителей и доступности роли прав доступа.

А куда вписывали? В форме или в объекте? при какой процедуре использовать? ПередЗаписью? или ПриОткрытии?
9. v.l. 434 15.05.19 21:50 Сейчас в теме
(8) Добавил в ПриОткрытии.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	УстановитьВидимостьЭлементов();
	УстановитьДоступностьФормы();
КонецПроцедуры

И потом еще по действиям некоторых важных кнопок. Например, после отправки на согласование тоже нам надо блокировать форму для редактирования, чтобы другие участники согласования работали с неизменяемым документом.
Bespechnii_kot; MikeGorshkov; +2 Ответить
2. Teut_Vlad 183 15.05.19 17:15 Сейчас в теме
	Если Не РольДоступна("ПолныеПрава") И Статус = Перечисления.СтатусСделки.УслугаОказана тогда
	ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;

Однако пользователи будут ругаться что не могут провалится и еще что нибудь))
Но вы пишете про "форму" а не запрет редактирования документа например. Там уже через ПередЗаписью
v.l.; MikeGorshkov; +2 Ответить
3. Ганс 15.05.19 17:30 Сейчас в теме
Возможно есть смысл при открытии выдавать сообщение о том что редактирование невозможно и перед записью давать отказ! Атак берите решение из (2)
MikeGorshkov; +1 Ответить
10. v.l. 434 15.05.19 21:52 Сейчас в теме
(3) Перед записью давать отказ в данном случае жёстко.
Пользователь забудет о предупреждении.
Будет писать, редактировать, заполнять "таблицу в тыщу строк и всё пропало".
MikeGorshkov; +1 Ответить
11. Ганс 16.05.19 12:53 Сейчас в теме
(10) Я согласен что жёстко, но тут уж надо выбрать либо пользователь не сможет посмотреть что за контрагент/договор в документе(в случае просмотра нельзя провалиться) либо будет отказ после добавления тысячи строк, с сообщением при открытии)
MikeGorshkov; +1 Ответить
12. v.l. 434 16.05.19 14:21 Сейчас в теме
(11) Либо обходить форму и банить все элементы кроме списка исключений.
MikeGorshkov; +1 Ответить
4. MikeGorshkov 15.05.19 18:47 Сейчас в теме
(2) Пока на Форме ошибку дает на РольДоступна.
Надо в модуле документа писать или в модуле формы?
5. Teut_Vlad 183 15.05.19 18:52 Сейчас в теме
(4) ой, пример на обычных.
MikeGorshkov; +1 Ответить
7. v.l. 434 15.05.19 19:24 Сейчас в теме
(4)
&НаСервере
Функция ДоступностьРоли(ИмяПроверяемойРоли)
	Возврат Пользователи.РолиДоступны(ИмяПроверяемойРоли, Пользователи.ТекущийПользователь());
КонецФункции
Ганс; MikeGorshkov; +2 Ответить
13. VZyryanov 16.05.19 14:58 Сейчас в теме
&НаКлиенте
Процедура ПередатьНаСогласование(Команда)
	ОчиститьСообщения();
	Объект.Статус=ПредопределенноеЗначение("Перечисление.СтатусыДокументов.НаСогласовании");
	ЭтаФорма.Записать(Новый Структура("РежимЗаписи",РежимЗаписиДокумента.Проведение));
	УстановитьДоступность();
КонецПроцедуры

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

&НаКлиенте
Процедура УстановитьПрава()
	УстановитьПраваНаСервере()
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступность()
	УстановитьПрава();
	ЭтоЧерновик=НЕ ЗначениеЗаполнено(Объект.Статус) ИЛИ (Объект.Статус=ПредопределенноеЗначение("Перечисление.СтатусыДокументов.Черновик"));
	НельзяРедактировать=Не ЭтоЧерновик
		ИЛИ (ПраваПодразделения=ПредопределенноеЗначение("Перечисление.ПраваНаДокументыПодразделений.НетПрав"))
		ИЛИ (ПраваПодразделения=ПредопределенноеЗначение("Перечисление.ПраваНаДокументыПодразделений.Просмотр"));
	НельзяСогласовать=ЭтоЧерновик
		ИЛИ (ПраваФилиала<>ПредопределенноеЗначение("Перечисление.ПраваНаДокументыФилиала.Согласование")
		И ПраваФилиала<>ПредопределенноеЗначение("Перечисление.ПраваНаДокументыФилиала.Управление"));
	Элементы.Факт.ИзменятьСоставСтрок=(ПраваФилиала=ПредопределенноеЗначение("Перечисление.ПраваНаДокументыФилиала.Согласование")
		ИЛИ ПраваФилиала=ПредопределенноеЗначение("Перечисление.ПраваНаДокументыФилиала.Управление"));
	Элементы.Дата.ТолькоПросмотр=НельзяРедактировать;
	Элементы.Номер.ТолькоПросмотр=НельзяРедактировать;
	Элементы.Примечание.ТолькоПросмотр=НельзяРедактировать И НельзяСогласовать;
	Элементы.ЗаполнятьНаТекущуюДату.ТолькоПросмотр=НельзяРедактировать;
	Элементы.Факт.ТолькоПросмотр=НельзяРедактировать;
	Элементы.Материалы.ТолькоПросмотр=НельзяРедактировать;
	Элементы.ОЗП.ТолькоПросмотр=НельзяРедактировать;
	Элементы.Акты.ТолькоПросмотр=НельзяРедактировать;
	Элементы.ФормаПередатьНаСогласование.Доступность=ЭтоЧерновик
		И (ПраваПодразделения=ПредопределенноеЗначение("Перечисление.ПраваНаДокументыПодразделений.ПередачаНаСогласование"));
	Элементы.ФормаВернутьНаДоработку.Доступность=Не НельзяСогласовать;
	Элементы.ФормаСогласовать.Доступность=(Объект.Статус=ПредопределенноеЗначение("Перечисление.СтатусыДокументов.НаСогласовании"))
		И Не НельзяСогласовать;
	Элементы.ФормаОтменитьСогласование.Доступность=(Объект.Статус=ПредопределенноеЗначение("Перечисление.СтатусыДокументов.Согласован"))
		И Не НельзяСогласовать;
	Если (Не Объект.Подразделение.Пустая()) И НельзяРедактировать И Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
		ПоказатьПредупреждение(,"У Вас нет прав на редактирование бюджетов подразделения "
			+Объект.Подразделение+". Измените подразделение или обратитесь в УЭ.");
	КонецЕсли;
	ЭтаФорма.Элементы.Экономист.ТолькоПросмотр=НельзяРедактировать;
	ЭтаФорма.Элементы.ПланЗаполнить.Доступность=Не НельзяРедактировать;
	ЭтаФорма.Элементы.КонтрагентыЗаполнить.Доступность=Не НельзяРедактировать;
	ЭтаФорма.Элементы.КонтрагентыЗаполнитьКонтрагенты.Доступность=Не НельзяРедактировать;
	ЭтаФорма.Элементы.МатериалыЗаполнить.Доступность=Не НельзяРедактировать;
	ЭтаФорма.Элементы.ОЗПЗаполнить.Доступность=Не НельзяРедактировать;
	ЭтаФорма.Элементы.АктыЗаполнить.Доступность=Не НельзяРедактировать;
	
	Попытка
		ЭтаФорма.КоманднаяПанель.ПодчиненныеЭлементы.ФормаПроведение.ПодчиненныеЭлементы.ФормаПровести.Доступность=Не НельзяРедактировать;
		ЭтаФорма.КоманднаяПанель.ПодчиненныеЭлементы.ФормаПровестиИЗакрыть.Доступность=Не НельзяРедактировать;
	Исключение
	КонецПопытки;
КонецПроцедуры
Показать
14. v.l. 434 17.05.19 15:09 Сейчас в теме
(13) Моё метод универсальнее )))
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот