Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. В случае если в силу каких-либо условий необходимо ограничивать ввод на основании по команде "Создать на основании", то такую проверку следует выполнять в обработчике ОбработкаЗаполнения модуля объекта (набора записей). Например, это могут быть проверки вида:
- Для команды "Создать на основании" не различимы группы и элементы справочников и планов видов характеристик: команда одинаково доступна в форме списка как для групп, так и для элементов. Требуется запретить ввод на основании групп.
- Требуется запретить ввод на основании непроведенных документов.
2. Для оповещения пользователя о причинах отказа, в обработчике ОбработкаЗаполнения следует использовать исключения:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Сотрудники") Тогда
Если ПолучитьЗначениеРеквизита(ДанныеЗаполнения, "ЭтоГруппа") = Истина Тогда
ВызватьИсключение "Ввод приказа о приеме на основании группы сотрудников невозможен!
|Выберите сотрудника. Для раскрытия группы используйте клавиши Ctrl и стрелку вниз";
КонецЕсли;
// обработка заполнения объекта по данным заполнения
При этом не рекомендуются какие-либо иные решения для подобных проверок. В частности, не следует создавать дополнительные команды для ввода на основании и размещать проверки в обработчиках этих команд.
Методическая рекомендация (полезный совет)
3. Рекомендуется придерживаться следующей логической структуры обработчика ОбработкаЗаполнения (отдельные шаги могут быть пропущены):
3.1. Выполнение специального заполнения в зависимости от типа параметра ДанныеЗаполнения .
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("Структура") Тогда
ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ЗаказКлиента") Тогда
ЗаполнитьДокументНаОснованииЗаказаКлиента(ДанныеЗаполнения);
// .
3.2. Выполнение общего заполнения, с целью заполнить значениями по умолчанию реквизиты, которые не были заполнены специальным заполнением. При этом необходимо предварительно проверять реквизит на заполненность.
Если Не ЗначениеЗаполнено(Подразделение) Тогда
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПоУмолчанию();
КонецЕсли;
Также при заполнении реквизитов значениями по умолчанию следует, по возможности, использовать свойство метаданных "Значение заполнения" . Значение, указанное в этом свойстве будет автоматически присваиваться реквизиту при выходе из обработчика ОбработкаЗаполнения , в случае если параметр СтандартнаяОбработка установлен в Истина , и реквизит не был заполнен в обработчике.
Выполнение данной рекомендации позволит уменьшить количество логических ошибок заполнения и повысит читаемость кода.
Продолжаю небольшую серию статей про открытие обычных и управляемых форм различными способами, предыдущая статья была посвящена реализации подбора в управляемом приложении, а сегодня на очереди открытие формы с заполнением.
Открытие формы с заполнением (передача в параметре открываемой формы и реализация метода «ОбработкаЗаполнения()») выполняется одинаково в управляемом и обычном приложении (проверял на платформе 8.3.5.1146 — управляемое приложение и на платформе 8.2.18.102 — обычное приложение).
В том месте кода, откуда нужно сделать открытие и заполнение формы нужно добавить приблизительно такой код:
В структуру «ПараметрыЗаполнения» записываются все нужные для заполнения данные, затем эта структура вставляется в другую структуру под названием «ПараметрыФормы».
Причем ключ, под которым структура «ПараметрыЗаполнения» вставляется в структуру «ПараметрыФормы», должен называться именно «ЗначенияЗаполнения» иначе, ничего не работать не будет.
Далее нужно реализовать событие модуля формы заполняемого объекта — «ОбработкаЗаполнения()». Я для этого использую следующую конструкцию, которая, на мой взгляд, изящно выглядит и позволяет избежать всех возможных ошибок (поправьте, если я ошибаюсь):
Напомню, что метод структуры «Свойство()» проверяет наличие в структуре элементы с именем, указанным в первом параметре и записывает найденное значение во второй параметр — в данном случае это реквизит заполняемого объекта (если элемент с указанным именем в структуре не найден, то во второй параметр записывается «Неопределено»).
На этом все, надеюсь данная статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Введение
В конфигурации "Управление торговлей" ред. 11 нет как таковых настроек пользователей для автозаполнения реквизитов создаваемых элементов справочников или документов как это было, например, в УТ версии 10.3 или УПП 1.3.
Теперь в конфигурации есть некоторые зачатки "разума", по которым программа самостоятельно определяет какое значение в реквизит документа нужно подставлять.
Далее рассмотрим принцип работы автозаполнения в конфигурации УТ 11.
"Интеллектуальная система"
Обратимся к документу "Заказ клиента". При его создании, вне зависимости от наличия документа-основания, выполняется процедура-обработчик модуля объекта:
"ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)"
Первым параметром передаются значения для заполнения нового документа в зависимости от основания и алгоритмов конфигурации. Второй параметр — это флаг стандартной обработки события.
Для документа "Заказ клиента" программный код обработчика заполнения следующий:
Нас интересует случай, когда данные заполнения пустые. Тогда заполнение выполняется не из данных заполнения, а с помощью специального алгоритма. На листинге выше он реализован в процедуре "ЗаполнитьПоЗначениямАвтозаполнения". Вот так выглядит программный код этого обработчика:
В случае, если данные заполнения не определены, то такие реквизиты как "Организация", "Склад" и "ХозяйственнаяОперация" заполняются автоматически с помощью процедуры "ЗаполнитьЗначенияСвойствАвтозаполнения" общего модуля "ОбщегоНазначенияУТ". При этом, если данные заполнения все же были переданы в виде структуры или документа, то при наличии значения заполнения в них, приоритет отдается данным заполнения.
Обратимся к процедуре "ЗаполнитьЗначенияСвойствАвтозаполнения":
В соответствии с описанием процедуры, первым параметром передается ссылка на документ, вторым — структура полей для автозаполнения. По тем полям в структуре, для которых не установлено значение заполнения, система формируем запрос на получение последних пяти элементов (в нашем случае документов "Заказ клиента"), в которых получает часто использованные значения заполнения. Вот пример запроса для документа "Заказ клиента":
Вот такой огромный, "страшный" запрос выполняется при каждом создании заказа клиента без документа-основания или других данных заполнения. Если кратко, то запрос получает 5 ближайших документов не помеченных на удаление, где автор документа — это текущий пользователь. Далее рассчитывается общий весь и вес каждого из значения реквизита. И в результате запрос возвращает значение, которое пользователь использовал наибольшее число раз.
В запросе выше описанная операция выполняется трижды, для каждого из реквизитов автозаполнения: для организации, для склада и для хоз. операции. На листинге процедуры " ЗаполнитьЗначенияСвойствАвтозаполнения" выше Вы также могли видеть, что автозаполнение для заказа покупателя выполняется для реквизитов "БанковскийСчет" и "Касса".
Такой способ автозаполнения документов возможно упрощает жизнь внедренцам или администраторам, заполняющим настройки пользователей, но ни в коем случае не делает работу пользователей более удобной. Если пользователь был только что создан, то автозаполнение не будет работать. Тем более в большинстве ситуаций пользователю необходимо заполнение документа одним единственным складов, вне зависимости от значений, которое он заполнял ранее.