Как сделать проверку должности работника при записи документа

Версия для печатиPDF-версия

Урегулировал вопрос, чтобы один и тот же человек не был назначен на разные места в бригаде (чтобы красиво отвечало), но поставил себе задачу - проверять, а обладает ли назначаемый человек нужной должностью. То есть Перед записью документа проверяются все 3 человека в бригаде (в справочнике у каждого стоит Реквизит Должность типа Перечисление.Должность), и если будет человек с не той должностью (водителем например назначить грузчика), то должно вывестись сообщение и спросить пользователя, согласен ли он назначить этого человека с такой должностью на роль грузчика. Можно как бы сделать отбор, чтобы даже ВЫБРАТЬ нельзя было этого человека, но вдруг будет ситуация, что водителей нет на работе, а заказов много. Не менять же должность человеку. Потом еще буду решать вопрос, что назначить 2 человек вместо 3 (одно место свободным оставить или же сделать предопределенное значение, которое не делает записи в регистре).

В свойстве "Параметры выбора" у реквизита нужно установить отбор по должности.

Установка параметров выбора

Мне не нужен отбор по должности. Иначе нельзя будет выбрать вообще. Просто допустим форс мажор, что водитель заболел, но надо срочно выехать - надо формировать бригаду, но без водителя нельзя ехать. В вашем решении никак нельзя будет назначить грузчика как водителя. Поэтому думаю над созданием проверки.
 

А какая тогда может быть проверка? Если водитель болен, то и грузчик сойдёт?

Чтобы проверялось, все ли на своих должностях. И если не соответствие, то выводилось бы сообщение кто не на своем месте. и в конце "вы согласны с этим?". Если да - то записывается-проводится. Если нет - отказ.

Так вопрос-то какой сейчас?

Как организовать эту проверку (получается надо проверить 3 реквизита, у одного на соответствие человека должности водителя, у двух - на соответствие должности грузчика), потом выдать диалоговое сообщение, в котором будет находиться информация о том, КТО не на своем месте и КЕМ он назначен в бригаде. И вопрос - согласен ли пользователь с такой расстановкой в бригаде. Если согласен - дальше спокойно сохраняется-проводится.
Понятно, что если у всех должности соответствуют - никакой диалог не должен появляться

В форме документа добавляете обработчик события ПередЗаписью. Ниже приведён код, который нужно добавить в модуль формы.

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

&НаКлиенте
Процедура ПроверитьДолжностиНаКлиенте()
	ТекстВопроса = "";
	ПроверитьДолжностьРаботника(Объект.Водитель, ПредопределенноеЗначение("Перечисление.Должности.Водитель"), ТекстВопроса, "Водителя");
	ПроверитьДолжностьРаботника(Объект.Грузчик1, ПредопределенноеЗначение("Перечисление.Должности.Грузчик"), ТекстВопроса, "Грузчика1");
	ПроверитьДолжностьРаботника(Объект.Грузчик2, ПредопределенноеЗначение("Перечисление.Должности.Грузчик"), ТекстВопроса, "Грузчика2");
	Если ЗначениеЗаполнено(ТекстВопроса) Тогда
		ТекстВопроса = ТекстВопроса + "Всё равно записать?";
		ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьВопросОЗаписи", ЭтаФорма);
		ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет);
	Иначе 
		Записать(Новый Структура("НеЗаписывать", Ложь));
	КонецЕсли;
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ЗначениеРеквизитаОбъекта(Объект, ИмяРеквизита)
	Возврат Объект[ИмяРеквизита];
КонецФункции

&НаКлиенте
Процедура ОбработатьВопросОЗаписи(РезультатВопроса, ДополнительныеПараметры) Экспорт 
	НеЗаписывать = РезультатВопроса = КодВозвратаДиалога.Нет;
	Записать(Новый Структура("НеЗаписывать", НеЗаписывать));
КонецПроцедуры

Спасибо. Я совсем не понимаю еще структуру, пытаюсь все подобные задачи решать просто запросом. Ваш вариант довольно интересный и комплексный, постараюсь реализовать

У большинства новичков наоборот трудности с запросами. Пытаются всё через объектную модель делать.

Но тут к запросам обращаться особого смысла нет.

Прошел отладчиком. Интересная структура, но вызывает процесс проведения 2 раза, если использовать "провести и закрыть" из формы документа, потому сейчас буду экспериментировать и изменять. чтобы работало как надо. Спасибо за пищу для размышлений (потом всё равно придется перетаскивать всё в модуль объекта, потому что при проведении созданного документа из формы списка не вызывается же метод "ПередЗаписью" формы, оттого может быть ситуация.

 

З.Ы. понял проблему. Вызов вопроса (и соответственно обработка ответа) идет только после окончания процесса записи, что довольно неприятно с точки зрения реализации. Нет ли возможности вызвать вопрос ДО окончания записи? Чтобы не вызывать второй раз
Вообще начал все менять по одной причине - после записи вашим способом нельзя провести документ, потому что он остается заблокирован для изменений, из-за чего приходится перезаходить в клиент.

Решил этот вопрос вызовом события ПослеЗаписи, выставив  ЭтотОбъект.РазблокироватьДанныеФормыДляРедактирования();
 

1. Вызов проверки точно в обработчике ПередЗаписью формы документа вставили? Отказ = Истина; перед вызовом проверки стоит?

2. Если получится задавать вопрос из модуля объекта в управляемом приложении, то напишите как сделано. Очень интересно.