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

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 178 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 178 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) Моё метод универсальнее )))
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день

Специалист техподдержки
Санкт-Петербург
зарплата от 100 руб. до 150 руб.
Полный день