Как запретить ввод документа на основании в 1С в зависимости от условий?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке конфигураций в системе «1С:Предприятие» часто возникает задача ограничить возможность создания документа на основании другого документа. На практике типовой механизм ввода на основании привязывается к структуре метаданных статически. Это означает, что кнопка «Создать на основании» отображается всегда, а проверка условий (например, по виду операции или статусу документа-основания) должна выполняться программно.

Рассмотрим, как правильно реализовать запрет создания документа при выполнении заданных условий, чтобы предотвратить ввод не только из интерфейса пользователя, но и при программном вызове.

Способ 1. Использование процедуры ОбработкаЗаполнения в модуле объекта (Рекомендуемый способ)

Согласно стандартам разработки 1С, проверка условий ввода на основании должна выполняться в процедуре ОбработкаЗаполнения модуля объекта создаваемого документа.

Главная особенность этого обработчика заключается в отсутствии параметра Отказ. Установка флага СтандартнаяОбработка = Ложь лишь отменяет типовое заполнение реквизитов, но не прерывает создание самого объекта. Чтобы полностью заблокировать создание документа и информировать пользователя, используется оператор ВызватьИсключение.

Разберем по шагам реализацию этого способа:

  1. Откроем модуль объекта подчиненного (создаваемого) документа.
  2. Найдем или создадим обработчик события ОбработкаЗаполнения.
  3. Проанализируем тип передаваемого параметра ДанныеЗаполнения. Если в качестве основания выступает нужный документ, выполним проверку его реквизитов.
  4. При выявления запрещенных условий сформируем понятное текстовое сообщение и вызовем исключение.

Проанализируем пример кода:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
		
		// Проверяем условие, например, определенный вид операции
		Если ДанныеЗаполнения.ВидОперации = Перечисления.ВидыОперацийПеремещениеТоваров.СписаниеНаРасходы Тогда
			
			ТекстОшибки = НСтр("ru = 'Ввод данного документа на основании перемещения с видом операции ""Списание на расходы"" запрещен!'");
			ВызватьИсключение ТекстОшибки;
			
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры

Преимущества подхода: этот метод универсален и гарантирует защиту от создания некорректного документа как в интерактивном режиме через интерфейс, так и при программном вызове метода Заполнить() в фоне или обменах данными.

Способ 2. Проверка в обработчике ПриСозданииНаСервере модуля формы

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

Рассмотрим порядок действий для формы документа:

  1. В модуле управляемой формы откроем обработчик ПриСозданииНаСервере.
  2. Проверим наличие параметров заполнения, передаваемых в форму при вводе на основании (параметр Параметры.ЗначениеЗаполнения или Параметры.Основание).
  3. При выполнении условий устанавливаем параметр Отказ = Истина и выводим предупреждение пользователю.

Посмотрим на пример реализации в форме документа:


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

КонецПроцедуры

Ограничение метода: данный способ блокирует создание документа только при работе пользователя в интерфейсе и не защищает от программного создания объектов сторонними обработками.

Способ 3. Перехват через расширение конфигурации

Если типовая конфигурация находится на поддержке и менять основной конфигурационный файл нельзя, вынесем проверку в расширение.

Для этого выполним следующие действия:

  1. Добавим создаваемый документ в расширение конфигурации.
  2. В модуле объекта создадим аннотацию &Перед("ОбработкаЗаполнения") или &Вместо("ОбработкаЗаполнения").
  3. Выполним проверку реквизитов документа-основания и при необходимости вызовем ВызватьИсключение.

Пример кода в модуле объекта расширения:


&Перед("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
		
		Если ДанныеЗаполнения.ВидОперации = Перечисления.ВидыОперацийПеремещениеТоваров.СписаниеНаРасходы Тогда
			ВызватьИсключение "Создание документа на основании данного вида операции запрещено!";
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры

Итоги

Выяснив особенности работы платформы «1С:Предприятие», мы видим, что наиболее надежным способом ограничения ввода на основании является вызов метода ВызватьИсключение внутри процедуры ОбработкаЗаполнения модуля объекта. Это обеспечивает максимальную надежность информационной базы и предотвращает появление ошибочных данных.

← На главную