При разработке конфигураций в системе «1С:Предприятие» часто возникает задача ограничить возможность создания документа на основании другого документа. На практике типовой механизм ввода на основании привязывается к структуре метаданных статически. Это означает, что кнопка «Создать на основании» отображается всегда, а проверка условий (например, по виду операции или статусу документа-основания) должна выполняться программно.
Рассмотрим, как правильно реализовать запрет создания документа при выполнении заданных условий, чтобы предотвратить ввод не только из интерфейса пользователя, но и при программном вызове.
Согласно стандартам разработки 1С, проверка условий ввода на основании должна выполняться в процедуре ОбработкаЗаполнения модуля объекта создаваемого документа.
Главная особенность этого обработчика заключается в отсутствии параметра Отказ. Установка флага СтандартнаяОбработка = Ложь лишь отменяет типовое заполнение реквизитов, но не прерывает создание самого объекта. Чтобы полностью заблокировать создание документа и информировать пользователя, используется оператор ВызватьИсключение.
Разберем по шагам реализацию этого способа:
ОбработкаЗаполнения.ДанныеЗаполнения. Если в качестве основания выступает нужный документ, выполним проверку его реквизитов.Проанализируем пример кода:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
// Проверяем условие, например, определенный вид операции
Если ДанныеЗаполнения.ВидОперации = Перечисления.ВидыОперацийПеремещениеТоваров.СписаниеНаРасходы Тогда
ТекстОшибки = НСтр("ru = 'Ввод данного документа на основании перемещения с видом операции ""Списание на расходы"" запрещен!'");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Преимущества подхода: этот метод универсален и гарантирует защиту от создания некорректного документа как в интерактивном режиме через интерфейс, так и при программном вызове метода Заполнить() в фоне или обменах данными.
Если требуется запретить ввод на основании только при интерактивных действиях пользователя и избежать вызова системного окна с исключением, проверку можно вынести в модуль формы создаваемого документа.
Рассмотрим порядок действий для формы документа:
ПриСозданииНаСервере.Параметры.ЗначениеЗаполнения или Параметры.Основание).Отказ = Истина и выводим предупреждение пользователю.Посмотрим на пример реализации в форме документа:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, открывается ли форма для нового документа на основании
Если Параметры.Ключ.Пустая() И ЗначениеЗаполнено(Параметры.ЗначениеЗаполнения) Тогда
Если ТипЗнч(Параметры.ЗначениеЗаполнения) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
Если Параметры.ЗначениеЗаполнения.ВидОперации = Перечисления.ВидыОперацийПеремещениеТоваров.СписаниеНаРасходы Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нельзя создать документ на основании данного вида операции!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Ограничение метода: данный способ блокирует создание документа только при работе пользователя в интерфейсе и не защищает от программного создания объектов сторонними обработками.
Если типовая конфигурация находится на поддержке и менять основной конфигурационный файл нельзя, вынесем проверку в расширение.
Для этого выполним следующие действия:
&Перед("ОбработкаЗаполнения") или &Вместо("ОбработкаЗаполнения").ВызватьИсключение.Пример кода в модуле объекта расширения:
&Перед("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
Если ДанныеЗаполнения.ВидОперации = Перечисления.ВидыОперацийПеремещениеТоваров.СписаниеНаРасходы Тогда
ВызватьИсключение "Создание документа на основании данного вида операции запрещено!";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Выяснив особенности работы платформы «1С:Предприятие», мы видим, что наиболее надежным способом ограничения ввода на основании является вызов метода ВызватьИсключение внутри процедуры ОбработкаЗаполнения модуля объекта. Это обеспечивает максимальную надежность информационной базы и предотвращает появление ошибочных данных.