Перейти к содержимому

1с обработка заполнения когда вызывается

  • автор:

Обработчик события ОбработкаЗаполнения

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. В случае если в силу каких-либо условий необходимо ограничивать ввод на основании по команде «Создать на основании», то такую проверку следует выполнять в обработчике ОбработкаЗаполнения модуля объекта (набора записей). Например, это могут быть проверки вида:

  • Для команды «Создать на основании» не различимы группы и элементы справочников и планов видов характеристик: команда одинаково доступна в форме списка как для групп, так и для элементов. Требуется запретить ввод на основании групп.
  • Требуется запретить ввод на основании непроведенных документов.

2. Для оповещения пользователя о причинах отказа, в обработчике ОбработкаЗаполнения следует использовать исключения:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

Если ТипЗнч(ДанныеЗаполнения) = Тип(«СправочникСсылка.Сотрудники») Тогда
Если ПолучитьЗначениеРеквизита(ДанныеЗаполнения, «ЭтоГруппа») = Истина Тогда
ВызватьИсключение «Ввод приказа о приеме на основании группы сотрудников невозможен!
|Выберите сотрудника. Для раскрытия группы используйте клавиши Ctrl и стрелку вниз»;
КонецЕсли;

// обработка заполнения объекта по данным заполнения

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

Методическая рекомендация (полезный совет)

3. Рекомендуется придерживаться следующей логической структуры обработчика ОбработкаЗаполнения (отдельные шаги могут быть пропущены):

3.1. Выполнение специального заполнения в зависимости от типа параметра ДанныеЗаполнения .

Например:

ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип(«Структура») Тогда
ЗаполнитьДокументПоОтбору(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип(«ДокументСсылка.ЗаказКлиента») Тогда
ЗаполнитьДокументНаОснованииЗаказаКлиента(ДанныеЗаполнения);
// .

3.2. Выполнение общего заполнения, с целью заполнить значениями по умолчанию реквизиты, которые не были заполнены специальным заполнением. При этом необходимо предварительно проверять реквизит на заполненность.

Например:

Если Не ЗначениеЗаполнено(Подразделение) Тогда
Подразделение = ЗначениеНастроекПовтИсп.ПодразделениеПоУмолчанию();
КонецЕсли;

Также при заполнении реквизитов значениями по умолчанию следует, по возможности, использовать свойство метаданных «Значение заполнения» . Значение, указанное в этом свойстве будет автоматически присваиваться реквизиту при выходе из обработчика ОбработкаЗаполнения , в случае если параметр СтандартнаяОбработка установлен в Истина , и реквизит не был заполнен в обработчике.

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

  • Перехват исключений в коде
  • Обращение из кода к автоматически формируемым элементам управления формы

1с обработка заполнения когда вызывается

А это нормально, что при получении объекта (МойДокумент.ПолучитьОбъект()) вызывается подписка на событие, в которой обработчик заполнения этого документа?

а подписка на какое событие, разрешите спросить?

(0) Ну может разработчик так специально сделал.

(1) На событие ОбработкаЗаполнения этого документа.

Не верю! (Станиславский)

если это подписка на самом деле на обработку заполнения, тогда ищи в модуле объекта команду Заполнить(), либо, ты не все рассказываешь.

ОбработкаЗаполнения в 8.2 вызывается также при Создании нового документа

ввод на основании, например

(6) ну. вроде бы МойДокумент.ПолучитьОбъект() подразумевает ссылку на уже существующий документ.

(8) да понятно, просто автор молчит и хз что там у него. пусть знает на будущее просто

Обработчик события ОбработкаПроверкиЗаполнения

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1.1. В данном обработчике модуля объекта выполняются действия, связанные с проверкой правильности заполнения значений реквизитов объектов (измерений, ресурсов, реквизитов табличных частей и т.п., далее: просто «реквизиты»).

1.2. Данным обработчиком следует пользоваться в случаях, когда для проверки корректности значений реквизитов обычной проверки на заполненность уже недостаточно (например, значение реквизита логически связано со значением другого реквизита), или же требование к тому, чтобы значение реквизита было заполнено не является безусловным.

Если проверка заполнения какого-либо реквизита — условная (т.е. зависит от значений других реквизитов или значения параметризированной функциональной опции) в обработчике следует предусмотреть код, который удаляет имя такого реквизита из массива проверяемых реквизитов ПроверяемыеРеквизиты . В общем виде, схема проверки заполнения выглядит следующим образом:

  • создать массив НепроверяемыеРеквизиты ;
  • в процессе проверки условий, добавлять в этот массив имена непроверяемых реквизитов (табличных частей);
  • вызвать процедуру для удаления непроверяемых реквизитов (текст процедуры УдалитьНепроверяемыеРеквизитыИзМассива приведен ниже).

При этом не рекомендуется использовать другие схемы проверки заполнения значений реквизитов, так как они затрудняют анализ логики работы конфигурации, поскольку скрывают из свойства «Проверка заполнения» случаи условной проверки заполнения значений объектов.
Например, неправильно:

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.'»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;

.

// Значение реквизита не должно быть пустым в зависимости от значения другого реквизита
Если ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо Тогда
// Для индивидуального предпринимателя должно быть сопоставлено физ. лицо
ПроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

НепроверяемыеРеквизиты = Новый Массив();
.

// Проверка значения реквизита на соответствие некоторым требованиям
Если НЕ ИННСоответствуетТребованиям(ИНН) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр(«ru = ‘ИНН задан неверно.'»);
Сообщение.Поле = «ИНН»;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
НепроверяемыеРеквизиты.Добавить(«ИНН»);
КонецЕсли;

.
// Значение реквизита не должно быть пустым в зависимости от другого реквизита
Если ЮрФизЛицо <> Перечисления.ЮрФизЛицо.ФизЛицо Тогда
НепроверяемыеРеквизиты.Добавить(«ИндивидуальныйПредприниматель»);
КонецЕсли;

Процедура УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) Экспорт

Для Каждого ЭлементМассива Из МассивНепроверяемыхРеквизитов Цикл

// перед удалением реквизита из массива необходимо проверить, что он там есть
// (не был удален ранее платформой или в коде).
ПорядковыйНомер = МассивРеквизитов.Найти(ЭлементМассива);
Если ПорядковыйНомер <> Неопределено Тогда
МассивРеквизитов.Удалить(ПорядковыйНомер);
КонецЕсли;

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

Методическая рекомендация (полезный совет)

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

Проверки, выполняемые в и вне транзакции записи объекта

2.1. Проверки в обработчике ОбработкаПроверкиЗаполнения выполняются вне транзакции записи объекта. Поскольку в случае некорректного заполнения объекта выполнение операции будет прервано еще до записи объекта в базу данных, то размещение проверок в этом обработчике является наиболее эффективным.

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

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

Для транзакционных проверок, в свою очередь, выделяются два случая:

  1. Проверка состояния движений, формируемых документами оперативного учета. Такие проверки довольно часто встречаются в приложениях с оперативным учетом.
  2. Проверка состояния других объектов информационной базы, ссылки на которых содержатся в текущем объекте. Такие проверки следует применять очень редко. Не следует злоупотреблять количеством проверок в транзакции записи объекта. Следует помнить, что внутри транзакции записи имеет смысл выполнять только проверки таких ресурсов или таких правил соответствия объектов друг другу, которые не изменяются без проверок всеми участниками процесса.

В первом случае, проверку остатков некоторого ресурса имеет смысл выполнять в транзакции записи только в том случае, если все документы выполняют такую же проверку в транзакции записи. Если хоть один из документов, изменяющих ресурс, делает это без проверок, выполнение проверок другими участниками процесса бессмысленно и такие проверки необходимо выполнять вне транзакции. Исключением может быть только случай, когда документ, который выполняет изменение контролируемого ресурса без проверок, вводится крайне редко. Например, не смотря на то, что документ «Инвентаризация товаров» изменяет остатки товаров без проверок, эта ситуация допустима в виду того, что он вводится крайне редко. Каждое такое исключение из правила должно быть оправданным.

Во втором случае, если при записи Подразделения в транзакции записи выполняется проверка, что сотрудник, выбранный в качестве руководителя подразделения, имеет должность «Руководитель», то при записи Сотрудника также должна выполняться и «встречная» проверка этого же правила: нельзя записать Сотрудника с должностью отличной от «Руководитель», если он указан руководителем того или иного подразделения. Поскольку правило, что «Сотрудник», выбранный руководителем подразделения, должен иметь должность «Руководитель», может быть нарушено как при записи подразделения, так и при записи сотрудника, то и проверка должна выполняться или в транзакции записи обоих объектов, или вне транзакции записи обоих объектов (а может и не выполняться вообще).

События при вводе на основании и при копировании

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

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

Следует учитывать, что этот обработчик будет использоваться не только при вводе на основании. Он будет вызываться и при вызове метода объекта Заполнить() :

НовыйДокумент = Документы.РасходнаяНакладная.СоздатьДокумент(); НовыйДокумент.Заполнить(ВыбранныйКлиент); ФормаДокумента = НовыйДокумент.ПолучитьФорму(); ФормаДокумента.ПараметрОснование = ВыбранныйКлиент; ФормаДокумента.Открыть();

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

Аналогично при копировании вызывается обработчик события ПриКопировании() , в котором можно дополнить стандартное заполнение данных выполняемое системой при копировании объекта. Этот обработчик вызывается, как при интерактивном копировании, так и при вызове метода Скопировать() .

Кроме того, расширения форм объектов предоставляют свойства ПараметрОснование и ПараметрОбъектКопирования , которые заполняются системой при выполнении стандартных команд ввода на основании и копирования. Значения этих свойств могут использоваться в обработчиках формы для определения того, что при открытии формы выполнялся ввод на основании или копирование.

Справка

ДокументСсылка.ИмяДокумента.Скопировать()
  • Тип: ДокументОбъект .
  • Создает новый документ копированием существующего. Использование метода не приводит к записи созданного объекта в базу данных.
  • Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер).
ДокументОбъект.ИмяДокумента.ПриКопировании(ОбъектКопирования)
  • ОбъектКопирования , тип ДокументОбъект . Исходный документ, который является источником копирования.
  • Возникает при создании документа копированием.
  • Конструктор ввода на основании
  • Как создать документ и открыть его форму?
  • Как при открытии формы определить, что создается новый элемент?
  • Как программно открыть и заполнить форму?
  • Как открыть форму существующего объекта?
  • Форма динамического списка с произвольным запросом
  • Как открыть форму списка с некоторым отбором?

Каталог оборудования

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Производители

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Функциональные группы

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Категории блога
Облако тегов

  • 1С:Предприятие (31)
  • API (29)
  • Bash (43)
  • CLI (124)
  • CMS (139)
  • CSS (50)
  • Frontend (75)
  • HTML (66)
  • JavaScript (150)
  • Laravel (72)
  • Linux (171)
  • MySQL (76)
  • PHP (125)
  • React.js (66)
  • SSH (27)
  • Ubuntu (69)
  • Web-разработка (509)
  • WordPress (73)
  • Yii2 (69)
  • БазаДанных (95)
  • Битрикс (66)
  • Блог (29)
  • Верстка (43)
  • ИнтернетМагаз… (84)
  • КаталогТоваров (87)
  • Класс (30)
  • Клиент (28)
  • Ключ (28)
  • Команда (88)
  • Компонент (60)
  • Конфигурация (66)
  • Корзина (32)
  • ЛокальнаяСеть (32)
  • Модуль (34)
  • Навигация (31)
  • Настройка (143)
  • ПанельУправле… (29)
  • Плагин (33)
  • Пользователь (26)
  • Практика (101)
  • Сервер (77)
  • Событие (28)
  • Теория (106)
  • Установка (67)
  • Файл (51)
  • Форма (58)
  • Фреймворк (192)
  • Функция (36)
  • ШаблонСайта (68)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *