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

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

  • автор:

Заполнение реквизитов нового документа

Частая задача — сделать так, чтобы форма нового объекта открывалась не «пустая», а уже заполненная некоторыми начальными данными. Для самых простых случаев можно использовать свойство ЗначениеЗаполнения , которое есть у реквизитов объектов конфигурации. В более сложных случаях можно использовать свойство ЗаполнятьИзДанныхЗаполнения . Если ни тот, ни другой способы не подходят, на встроенном языке можно описать собственный алгоритм начального заполнения данных нового объекта.

Свойство ЗначениеЗаполнения

Например, есть документ Накладная с реквизитом Склад . В подавляющем большинстве случаев товары приходуются на главный склад, и лишь в отдельных редких случаях они могут приходоваться на другие склады. Чтобы облегчить работу оператора и не заставлять его каждый раз выбирать один и тот же склад в новых накладных, можно поступить следующим образом.

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

Cвойство ЗаполнятьИзДанныхЗаполнения

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

Теперь будет происходить следующее. В режиме 1С:Предприятие пользователь отобрал список накладных по некоторому поставщику и некоторому складу. При вводе новой накладной с помощью команды «Создать» списка, поля Поставщик и Склад будут заполнены именно теми значениями, по которым отобран список накладных:

Собственный алгоритм заполнения реквизитов

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

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

Если же не менять стандартное значение этого параметра, то после выхода из этого обработчика платформа попытается самостоятельно заполнить реквизиты объекта, подлежащие заполнению. Незаполненными она будет считать те реквизиты, которые имеют стандартное значение своего типа. Например, для типа Число это значение 0, для типа Строка — пустая строка, а для типа Ссылка — пустая ссылка.

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

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

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

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

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

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

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

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

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

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

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

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

Например:

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

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

Например:

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

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

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

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

У объекта, который вводится на основании другого объекта (например, документа) существует обработчик события — ОбработкаЗаполнения

Данные обработчик имеет следующие параметры
  • ДанныеЗаполнения
  • ТекстЗаполнения
  • СтандартнаяОбработка

Описание:

Возникает при вводе документа на основании, а также при выполнении метода Заполнить, при вводе на основании, а также при интерактивном вводе нового. В процедуре-обработчике этого события должен быть описан сам алгоритм заполнения реквизитов документа на основании переданного значения.

Как отменить действие ОбработкаЗаполнения

Часто возникает вопрос, как отменить действие этого обработчика. Или проще говоря отказаться от процедуры заполнения объекта на основании. Как мы видим из описания выше, параметра Отказ у обработчика нет. А отказ от стандартной обработки (СтандартнаяОбработка = Ложь) не отменяет действие.

Для того, чтобы оповестить пользователя о причинах отказа, следует использовать исключение (это официальная рекомендация 1С, изложенная в документации):

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

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

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

ПоследовательностьСобытийДокументаОтменаПроведения_v1.1.png

ПередЗаписью(<Отказ>, <ПараметрыЗаписи>)
ОбработкаПроверкиЗаполненияНаСервере(<Отказ>, <ПроверяемыеРеквизиты>)
ОбработкаПроверкиЗаполнения(<Отказ>, <ПроверяемыеРеквизиты>)
ПередЗаписьюНаСервере(<Отказ>, <ТекущийОбъект>, <ПараметрыЗаписи>)
ПередЗаписью(<Отказ>, <ПараметрыЗаписи>)
ПриУстановкеНовогоНомера(<СтандартнаяОбработка>, <Префикс>)
ПриЗаписи(<Отказ>)
ОбработкаПроведения(<Отказ>, <РежимПроведения>) или
ОбработкаУдаленияПроведения(<Отказ>)
ПриЗаписиНаСервере(<Отказ>, <ТекущийОбъект>, <ПараметрыЗаписи>)
ПослеЗаписиНаСервере(<ТекущийОбъект>, <ПараметрыЗаписи>)
ПослеЗаписи(<ПараметрыЗаписи>)

ОбработкаПолученияФормы(<ВидФормы>, <Параметры>, <ВыбраннаяФорма>, <ДополнительнаяИнформация>, <СтандартнаяОбработка>)
<Активация модуля формы на сервере>
<Активация модуля объекта>
ПриЧтенииНаСервере(<ТекущийОбъект>) или
ПриКопировании(<ОбъектКопирования>) или
ОбработкаЗаполнения(<ДанныеЗаполнения>, <ТекстЗаполнения>, <СтандартнаяОбработка>)
ПриСозданииНаСервере(<Отказ>, <СтандартнаяОбработка>)
ПередЗагрузкойДанныхИзНастроекНаСервере(<Настройки>)
ПриЗагрузкеДанныхИзНастроекНаСервере(<Настройки>)
<Активация модуля формы на клиенте>
ПриОткрытии(<Отказ>)
ПриПовторномОткрытии()

Цвета: &НаКлиенте &НаСервере

Система позволяет расширить практически любой программный модуль, относящийся к управляемому приложению. Невозможно расширять глобальные серверные модули. Также следует помнить, что расширение привилегированного общего модуля будет выполняться в непривилегированном режиме (если иное не разрешено профилем безопасности). Кроме того, предоставляется возможность создавать собственные общие модули, которые не могут быть привилегированными и глобальными серверными. Работа с собственным общим модулем в расширении ничем не отличается от работы с общим модулем обычной конфигурации.

Работа с расширенным программным модулем имеет существенные особенности, которые будут рассмотрены в данном разделе.

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

В расширяющем модуле имеется возможность:

  1. Создавать собственные методы и переменные (если это допускает расширяемый модуль).
  2. Назначать собственные обработчики на события, которые не обрабатываются в расширяемой конфигурации.
  3. Перехватывать любой метод расширяемого модуля (в том числе и методы обработчиков событий), при этом имеется возможность:
    • полностью заменить оригинальный метод собственным;
    • создать методы, которые будут вызваны перед или после расширяемого метода.

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

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

В общем случае, аннотированный метод из программного модуля расширения выглядит следующим образом:

В данном примере Перед одна из трех возможных аннотаций, ИмяМетода имя расширяемого метода, Префикс_Имя имя расширяющего метода. Префикс_ это префикс расширения, который желательно указывать для всех методов расширения. Расширяться может как процедура, так и функция. Имя расширяющего метода должно подчиняться обычным правилам формирования имен процедур и функций. В частности, оно должно быть уникально.

Если расширяемый метод содержит какие-либо параметры, то:

  1. Все расширяющие методы обязаны иметь в точности такое же описание, как и расширяемый метод, с точностью до ключевых слов Знач в описаниях параметров методов.
  2. Значения параметров разделяются между всеми расширяющими методами из всех расширений и собственно расширяемым методом. Это значит, что если какой-либо расширяющий метод изменит значение параметра, все методы, которые получат управление после этого метода, получат измененное значение этого параметра.
  3. В расширяющем методе не имеет смысла указывать значения по умолчанию для параметров расширяемого метода. Значения по умолчанию будут определяться из описания расширяемого метода.

Также следует отметить, что если расширяется обработчик события, то расширяющий метод выполниться до того, как сработают подписки на «расширяемое» событие (см. здесь).

Исполнение до расширяемого метода (аннотация Перед)

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

Рис. 688. Схема исполнения «Перед»

Исполнение после расширяемого метода (аннотация После)

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

Рис. 689. Схема исполнения «После»

Обрамление расширяемого метода (аннотации Перед и После)

Если в расширяющем модуле созданы расширяющие методы, которые отмечены аннотациями Перед и После , то это означает, что вначале будет вызван метод, который отмечен аннотацией Перед , затем расширяемый метод и зачем метод расширения, отмеченный аннотацией После .

Рис. 690. Схема исполнения «Перед» и «После»

Замена метода (аннотация Вместо)

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

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

Рис. 691. Схема исполнения «Вместо»

Чтобы иметь возможность модифицировать результат работы расширяемого метода, предусмотрен метод глобального контекста ПродолжитьВызов(). В качестве параметров метода должны быть указаны фактические параметры, которые переданы в расширяющий метод.

Рис. 692. Схема исполнения «Вместо» совместно с ПродолжитьВызов()

В исходном тексте пример будет выглядеть следующим образом:

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

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

При выполнении команды Добавить в расширение происходит следующее:

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

      Следует учитывать, что если расширяемый метод обрамлен инструкциями препроцессора, то эти инструкции не будут перенесены в расширение.

      При проверке соответствия описания расширяемого метода и метода расширения проверяются следующие характеристики методов:

      • Количество параметров и признак передачи параметров «по значению» (ключевое слово Знач ).
      • Метод является процедурой или функцией. Если определение метода изменяется с процедуры на функцию, а до этого процедура была расширена с применением аннотаций Перед / После , то аннотация будет заменена на аннотацию Вместо
      • Если в модуле расширения присутствуют несколько методов с одинаковым именем, но которые обрамлены разными инструкциями препроцессора, то в расширении будет обновляться всегда первый из перечня таких методов.

      Еще одной особенностью редактирования программного модуля в расширении является то, что имеется возможность перехода к расширяемому методу непосредственно из расширения. Для этого следует поместить курсор на имя расширяемого метода в аннотации, а затем воспользоваться стандартной командой редактора Перейти к определению

      При разработке расширений следует исходить из следующих предположений:

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

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

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

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

      Рис. 693. Схема взаимодействия. Пример 1

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

      1. Будет вызван метод, отмеченный аннотацией Перед("Расширяемая") из Расширения2
      2. Затем будет вызван метод, отмеченный аннотацией Перед("Расширяемая") из Расширения1
      3. Затем будет вызван метод Расширяемая() из расширяемой конфигурации.
      4. Затем, в обратном порядке (относительно списка расширений, т. е. Расширение1 и Расширение2 ), будут вызваны методы, отмеченные аннотациями После("Расширяемая")

      Т.е. вначале вызываются те методы расширений, которые разработчик отметил как вызываемые до исполнения расширяемого метода, затем исполняется собственно расширяемый метод, а затем вызываются те методы, которые разработчик отметил как вызываемые после исполнения расширяемого метода.

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

      Рис. 694. Схема взаимодействия. Пример 2

      Так произошло потом, что метод, отмеченный аннотацией Вместо , полностью заменяет собой расширяемый метод. Следует особо отметить, что если в этом примере поменять порядок регистрации расширений (первым будет Расширение2 , а последним Расширение1 ), то единственным выполнившимся методом будет метод из Расширения1

      В связи с таким поведением «замещающего» метода расширения, рекомендуется не допускать ситуаций, когда какой-то метод расширяемой конфигурации расширяется с замещением (аннотация Вместо) более чем в одном одновременно работающим расширении. Другими словами, если в расширении, в модуле документа Документ1 замещается обработчик события ОбработкаПроведения , то рекомендуется не допускать ситуации, когда в информационной базе работает еще хотя бы одно расширение, которое каким-либо образом перехватывает обработчик события ОбработкаПроведения в документе Документ1 . Однако, если в «замещающем» методе расширения есть безусловный вызов метода ПродолжитьВызов() , то одновременное существование нескольких расширений с таким способом расширения вполне допустимо.

      Факт того, что расширение успешно подключено к расширяемой конфигурации, не означает, что все расширяющие методы, которые находятся в расширении, будут выполняться. Работоспособность методов расширения может быть изменена настройками профиля безопасности (подробнее см. здесь), который использует информационная база.

      Если прикладное решение работает в файловом варианте или в клиент-серверном варианте без профилей безопасности, то при подключении расширения:

      • В обычном режиме исполнения встроенного языка допустимо расширять как клиентские, так и серверные методы. Без ограничения места расположения методов.
      • В безопасном режиме исполнения встроенного языка будут расширяться только клиентские методы и серверные обработчики форм, которые установлены через панель свойств. К остальным серверным методам (аннотированные серверные методы модулей формы и серверные общие модули) расширение применяться не будет.

      Возможность расширения серверных общих модулей в клиент-серверном варианте регулируется профилем безопасности. Подробное описание см. здесь.

      • Выполняются перед подписками

        Все расширения обработчика события выполняются до выполнения подписок на это событие.
      • В обратном порядке (относительно списка расширений)

        (Самое нижнее расширение выполняется первым.) Порядок исполнения программных модулей определяется порядком регистрации расширений в информационной базе расширяемой системы. Первым используется расширение, которое зарегистрировано последним.
      • Согласно назначению (разные приоритет выполнения)
        Настройка порядка выполнения дополнительных модулей происходит исходя не только из времени добавления модуля (позже добавлено, позже исполняется), но и исходя из назначения доработки («Исправление» всегда будет идти прежде «Адаптации»).
      • При конфликте "$Вместо" последнее расширение затирает остальные

        Однако, если в «замещающем» методе расширения есть безусловный вызов метода ПродолжитьВызов(), то одновременное существование нескольких расширений с таким способом расширения вполне допустимо.

      ps: оригинальные изображения взяты из источников

      upd(ответ на комментарии Cyberhawk и Yashazz):

      "Отказ=Истина", выставленный в одной подписке, не мешает срабатывать другой (т.е. процесс не прерывается)

      утверждение верно для ОДНОГО события (в случае наличия нескольких подписок на одно и то же событие). Например, если есть 3 подписки на событие ПриЗаписи документа ПКО, то Отказ=Истина выставленный в одной из них не помешает срабатыванию других двух.

      Отказ для каждого события проверяется в двух местах
      1. После выполнения обработчика в модуле объекта/менеджера, включая все расширения.
      2. После обработки всех подписок, включая все их расширения.
      Т.е. если в п.1 выставили Отказ, то п.2 уже выполняться не будет. Думаю стоит это добавить в статью.

      (с) tormozit

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

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

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

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

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

      См. также

      Другие материалы по теме:

      Нас находят: 1с8 процедура обработка заполнения, обработка заполнения 1с, обработказаполнения 8 2, обработчик события ОбработкаЗаполнения, событие ОбработкаЗаполнения, обработказаполнения 1с, ОбработкаЗаполнения, 1с обработказаполнения, 1с запрет ввода на основании по условию, 1с 8 событие обработказаполнения

      Открыть форму нового объекта с заполнением

      В управляемых формах появилась очевидная проблема: Как открыть форму с объектом который я программно заполнил, но не сохранил еще в базу?
      ОТВЕТ: По умолчанию — никак.

      Единственное что можно заставить сделать систему по умолчанию, при открытии формы, это выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.

      Сначала небольшой кусок кода чтобы не забыть что какие ключи надо передавать при открытии формы.

      Данные = Новый Структура();
      Данные.Вставить(«Наименование», «ТЕСТ НАИМЕНОВАНИЯ»);
      Данные.Вставить(«Комментарий», «ТЕСТ»);
      Данные.Вставить(«Артикул», «ТЕСТ»);
      ПараметрыФормы = Новый Структура(«ЗначенияЗаполнения», Данные);
      ОткрытьФорму(«Справочник.Номенклатура.ФормаОбъекта», ПараметрыФормы);

      Собственно что здесь важно:

      • Данные — структура в которую мы пишем наименования полей открываемого объекта и их значения
      • ПараметрыФормы — тоже структура с ключом «ЗначенияЗаполнения» — это предопределенный ключ для параметров передаваемых в форму. Платформа при получении этого ключа выполнить стандартную функцию модуля объекта ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка), где ДанныеЗаполнения — это структура которую мы передали при открытии формы.

      ПРИМЕЧАНИЕ:

      В открывшейся форме все данные которые вы ей передадите будут так же лежать в переменной Параметры.ЗначенияЗаполнения в модуле формы объекта

      У переменной Параметры, есть еще несколько предопределенных ключей

      • Ключ — сюда ложим ссылку если хотим открыть форму существующего объекта
      • ЗакрыватьПриВыборе — для форм списков, что написано то и делает, после двойного щелчка по строке списка закрывает форму выбора
      • ЗакрыватьПриЗакрытииВладельца — если форма А владелец формы Б, то при закрытии А, закроется и Б.
      • ЗначениеКопирования — ссылка на объект копию которого мы хотим открыть. копия будет не сохранена.
      • ЗначенияЗаполнения — Это мы отобразили в самом начале. Структура с данными заполнения
      • Основание — ссылка на объект основание
      • ПараметрыВыбора — Содержит значения, по которым проверяется возможность выбора для форм, находящихся в режиме выбора.
      • РежимВыбора — Если Истина, открывает форму в режиме выбора.

      Передавать можно несколько параметров одновременно.

      ДОПОЛНИТЕЛЬНЫЙ ХАК

      Если по каким-то причинам, нет желания пихать логику заполнения в сам объект. Вот идея и немного кода для облегчения жизни:

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

      Обработчики событий 1С:Предприятие 8.3


      Особенностью обработки событий среде 1С:Предприятия 8 является то, что имя процедуры-обработчика в одних случаях должно совпадать с именем события, а в других случаях может от него отличаться.
      Процедуры-обработчики событий //its.1c.ru

      • Жизненный цикл управляемой формы. Шпаргалка разработчика Станислав Ганиев@infostart.ru Jun 2018

      Форма

      События жизненного цикла формы
      Открытие объекта в форме
      • ПриЧтенииНаСервере (<ТекущийОбъект>) — выполняется только для существующего объекта, подготовка доп.данных, зависящих от данных объекта. Объект — основной элемент открываемой формы;
        • ТекущийОбъект — объект, прочитанный из БД (доступны экспортные методы объекта)
        • ДанныеЗаполнения (ссылка на объект-основание либо структура отбора). В случае
        • СтандартнаяОбработка = Истина, после обработки заполнения, обрабатываются сначала ДанныеЗаполнения, затем ЗначенияЗаполнения
        • ПриСозданииНаСервере (<Отказ>, <СтандартнаяОбработка>) — Окончательная подготовка формы (ее представления) к открытию
          • форма, открытая для создания нового объекта, получает новый пустой несохраненный Объект, для которого метод Объект.ЭтоНовый() возвращает Истина
            • фактически этот метод приводит к ошибке » Метод объекта не обнаружен (ЭтоНовый) » и следует использовать ЗначениеЗаполнено(Объект.Ссылка)
            • ПриОткрытии (<Отказ>) — Действия, связанные с открытием, которые на сервере выполнить невозможно; выполняемые тогда, когда форма наверняка открывается. Последний обработчик перед открытием, в котором можно отказаться от открытия
            Запись объекта в форме
            • ПередЗаписью(<Отказ>) — Анализ готовности вспомогательных данных для записи объекта
            • ОбработкаПроверкиЗаполненияНаСервере(<Отказ>, <ПроверяемыеРеквизиты>) — Проверка данных, не относящихся к объекту.
              • ПроверяемыеРеквизиты содержит массив имен реквизитов формы
              • ОбработкаПроверкиЗаполнения(<Отказ>, <ПроверяемыеРеквизиты>) — Всё, что относится к проверкам реквизитов основного объекта БД.
                • ПроверяемыеРеквизиты содержит массив имен реквизитов объекта
                • ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) — Объект — основной реквизит формы объекта;
                  • ТекущийОбъект — объект, который реально будет записан в БД. Анализировать данные и дозаполнять реквизиты нужно через ТекущийОбъект, модификация Объекта ни к чему не приведет. Обработчик вызывается только при записи из формы
                  • ПередЗаписью(<Отказ>) — Вызывается при любом способе записи. Данные объекта записываются в БД, но транзакция не закрывается
                  • ПриЗаписи(<Отказ>) — Выполняются действия над доп.данными, которые неразрывно связаны с основными данными объекта
                  • ПриЗаписиНаСервере(<Отказ>, <ТекущийОбъект>, <ПараметрыЗаписи>) — Предназначение аналогично ПриЗаписи(), но при обработке доп.данных можно использовать данные формы.
                    • ТекущийОбъект — данные, которые были записаны в БД, работать следует именно с ним; Объект — данные основного реквизита формы, которые были до записи, его модификация бесполезна. Если это запись нового объекта, то у Объект свойство Ссылка пустое, а у ТекущийОбъект уже заполнено
                    • ПослеЗаписи(<ПараметрыЗаписи>) — Действия, которые невозможно выполнить на сервере, или требующие интерактивного взаимодействия с пользователем. Объект гарантированно записан
                    Режим проведения при записи документа

                    При записи документа в форме, расширение формы выполняет установку режима проведения и в случае оперативного изменяет значение реквизита .Дата . Повлиять на режим проведения возможно через присвоение реквизиту формы ИспользоватьРежимПроведения требуемого значения:

                    Подробно алгоритм реализации режима проведения описан в ИТС //its.1c.ru

                    Закрытие формы
                    • ПередЗакрытием(<Отказ>, <ЗавершениеРаботы>, <ТекстПредупреждения>, <СтандартнаяОбработка>) — Проверка, можно закрыть форму или нельзя. Если отключить стандартную обработку, то форма будет закрыта, независимо от модифицированности
                      • ЗавершениеРаботы
                        Тип: Булево.
                        В параметр передается признак того, что форма закрывается в процессе завершения работы приложения
                      • ПриЗакрытии(<ЗавершениеРаботы>) — Выполняется, если форма 100% закрывается. На момент вызова пользователь форму уже не видит
                        • ЗавершениеРаботы
                          Тип: Булево.
                          В параметр передается признак того, что форма закрывается в процессе завершения работы приложения: Истина — если в процессе завершения приложения; Ложь — если закрывается только форма.
                        События формы
                        ? Форма: ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

                        Событие вызывает метод ОповеститьОВыборе(<ЗначениеВыбора>) в подчиненной форме, при открытии которой был установлен Владелец.

                        Фокус формы и ТекущийЭлемент

                        Активный элемент формы «в фокусе» отслеживается через свойство ЭтаФорма.ТекущийЭлемент. Для события изменения текущего элемента формы обработчик не предусмотрен.

                        Оповещение формы

                        Всем открытым формам можно передать произвольные данные для любой дальнейшей обработки на их усмотрение. Передача осуществляется вызовом процедуры Оповестить(ИмяСобытия, Параметр, Источник)

                        • ИмяСобытия — Строка, содержит идентификатор вида оповещения
                        • Параметр — произвольные данные, передаваемые формам
                        • Источник — произвольные данные, передаваемые в качестве источника

                        Передача оповещения выполняется для тех форм, у которых определен обработчик событий в процедуре ОбработкаОповещения(ИмяСобытия, Параметр, Источник). Процедура обработчика вызывается с теми же параметрами, с которыми была вызвана процедура Оповестить(. ).

                        Кроме открытых форм оповещение может быть обработано модулем приложения или общим глобальным модулем, если оповещение было подключено процедурой ПодключитьОбработчикОповещения(<ИмяПроцедуры>).

                        Все описанные процедуры подключения, вызова и обработки выполняются &НаКлиенте:

                        АйТиБложик

                        &НаСервере
                        Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

                        // Если ссылка у объекта пустая, значит он еще не записан,
                        // а следовательно он является новым объектом.
                        ЭтоНовыйОбъект = Объект.Ссылка.Пустая();

                        // Если объект новый, то выполняем заполнение реквизитов.
                        Если ЭтоНовыйОбъект Тогда
                        Объект.Ответственный = Пользователи.ТекущийПользователь();
                        Объект.Комментарий = «Документ создан » + Формат(ТекущаяДата(), «ДФ=dd.MM.yyyy»);
                        КонецЕсли;

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

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

                        ЭтотОбъект.Ответственный = Пользователи.ТекущийПользователь();
                        ЭтотОбъект.Комментарий = «Документ создан » + Формат(ТекущаяДата(), «ДФ=dd.MM.yyyy»);

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

                        1С 8.3 : Последовательность событий при открытии формы нового элемента

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

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

                        Эти свойства позволяют визуально (в конфигураторе) задать правила, по которым реквизит будет заполняться данными при создании нового объекта.

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

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

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

                        При этом параметр Основание, передаваемый в этот обработчик, может иметь различные значения в зависимости от того, каким образом создается новый элемент.

                        Например, он может иметь тип ссылки, если новый объект вводится на основании.

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

                        Также этот параметр может иметь тип Неопределено, если новый элемент создается интерактивной командой из панели действий. То есть в своем алгоритме начального заполнения полезно анализировать этот параметр.

                        Что касается внешнего вида формы нового объекта, то им нужно управлять в обработчике события формы ПриСозданииНаСервере.

                        Это событие возникает и для новых, и для существующих объектов. Поэтому в нем нужно убедиться в том, что открывается форма именно нового объекта. Убедиться в этом можно проанализировав параметр формы Ключ.

                        Если объект новый, в этом параметре будет пустая ссылка. Если это существующий объект – в этом параметре будет ссылка на этот объект:

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

                        Для тех кто не хочет читать все что выше, код проверки на ЭтоНовый в Управляемом приложении:

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

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