новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Проверка наличия зависимых документов

  • Добавить свою публикацию
  • для этого требуется регистрация

Задача

Из-за частых ошибок ввода данных в базу была поставлена задача создания запрета отмены проведения документов, если на их основании введен хотя бы один проведенный документ.

Изображение

В тестовой конфигурации имеются три документа: "Заявка", "Расходный ордер" и "Приходный ордер". Связь между документами следующая:

Изображение

В соответствии с этой связью и нужно выполнить задание.

Способы реализации

Есть несколько путей решения. Например, мы можем в подписке на событие перед записью документа выполнять запрос на выборку документов, введенных на основании. Разумеется, для каждого документа нужно будет составлять свой запрос. Например, для документа "ПриходныйОрдер" из тестовой базы программный код проверки наличия связанных документов с проведенным статусом приведен в следующем листинге:

// Процедура-обработка подписки на событие "ПередЗаписью" для документов
//
Процедура ПроверкаЗависимыхДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт    	
	// Для уже записанного приходного ордера при отмене проведения 
	// выполняем проверку наличия зависимых документов
	Если НЕ Источник.ЭтоНовый() 
			И РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения
			И ТипЗнч(Источник) = Тип("ДокументОбъект.ПриходныйОрдер") Тогда 	
			
		// Выполняем запрос к таблице документов "РасходныеОрдера" с отбором по документу основания
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	РасходныйОрдер.Ссылка
		|ИЗ
		|	Документ.РасходныйОрдер КАК РасходныйОрдер
		|ГДЕ
		|	РасходныйОрдер.ПриходныйОрдер = &Документ
		|	И РасходныйОрдер.Проведен";    		
		Запрос.УстановитьПараметр("Документ", Источник.Ссылка);		
		Результат = Запрос.Выполнить();
		Если НЕ Результат.Пустой() Тогда
			Сообщить("На основании документа имеются проведенные документы!", СтатусСообщения.ОченьВажное);
			Отказ = Истина;
		КонецЕсли;	
		
	КонецЕсли;		
КонецПроцедуры

 Вариант рабочий, но тогда нам придется для каждого документа писать свой запрос. Даже если мы будем формировать текст запроса автоматически с учетом структуры метаданных и типов реквизитов документа, то мы не сможем обработать все возможные ситуации. Хотя бы потому, что мы не знаем точную связь между документами, а также по каким реквизитам она устанавливается.

 

Еще один вариант - использование критериев отбора. В одной из предыдущих статей "Критерии отбора на простом примере" был продемонстрирован простой пример работы с этим объектом конфигурации. Аналогично мы можем изменить программный код обработки проверки зависимых документов и получим более универсальное решение.

// Процедура-обработка подписки на событие "ПередЗаписью" для документов
//
Процедура ПроверкаЗависимыхДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт    	
	// Для уже записанного приходного ордера при отмене проведения 
	// выполняем проверку наличия зависимых документов
	Если НЕ Источник.ЭтоНовый() 
			И РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда 	
			
		// Выполняем запрос к виртуальной таблице критерия отбора "СвязанныеДокументы" с отбором по документу основания
		Запрос = Новый Запрос;
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	СвязанныеДокументы.Ссылка
		|ИЗ
		|	КритерийОтбора.СвязанныеДокументы(&Документ) КАК СвязанныеДокументы
		|ГДЕ
		|	СвязанныеДокументы.Ссылка.Проведен";    		
		Запрос.УстановитьПараметр("Документ", Источник.Ссылка);		
		Результат = Запрос.Выполнить();
		Если НЕ Результат.Пустой() Тогда
			Сообщить("На основании документа имеются проведенные документы!", СтатусСообщения.ОченьВажное);
			Отказ = Истина;
		КонецЕсли;	
		
	КонецЕсли;		
КонецПроцедуры

 В настройке критерия отметим лишь настройку его состава:

Изображение

Вариант будет работать, причем его реализация относительно универсальная. Проверка будет опираться на настройку состава используемого критерия отбора.

Заключение

Из рассмотренных двух вариантом наиболее оптимальным является второй - использование критерия отбора. С позиции разработчика реализация не займет много времени, а дальнейшая доработка будет простой. Однако при решении задач, где производительность - критический фактор, нужно описывать все необходимые действия проверки "вручную", а также возможно использовать дополнительные таблицы. Но эти способы выходят за рамки статьи.

 
0
Еще от автора
≡ к списку статей