воскресенье, 14 января 2018 г.

Модуль объекта

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

  • Модуль объекта справочника:
    • ПриУстановкеНовогоКода
    • ПриКопировании
    • ОбработкаЗаполнения
    • ПередЗаписью
    • ПриЗаписи
    • ПередУдалением
    • ОбработкаПроверкиЗаполнения
  • Модуль объекта документа:
    • ОбработкаПроведения
    • ОбработкаЗаполнения
    • ПриУстановкеНовогоНомера
    • ПриКопировании
    • ПередЗаписью
    • ПриЗаписи
    • ПередУдалением
    • ОбработкаУдаленияПроведения
    • ОбработкаПроверкиЗаполнения
  • Модуль объекта отчета:
    • ОбработкаПроверкиЗаполнения
    • ПриКомпоновкеРезультата
    • УстановитьЗаголовкиПолей
  • Модуль объекта обработки:
    • ОбработкаПроверкиЗаполнения
  • Модуль объекта плана вида характеристик:
    • ПриУстановкеНовогоКода
    • ПриКопировании
    • ОбработкаЗаполнения
    • ПередЗаписью
    • ПриЗаписи
    • ПередУдалением
    • ОбработкаПроверкиЗаполнения
  • Модуль объекта плана счетов:
    • ПриКопировании
    • ОбработкаЗаполнения
    • ПередЗаписью
    • ПриЗаписи
    • ПередУдалением
    • ОбработкаПроверкиЗаполнения
  • Модуль объекта плана видов расчетов:
    • ПриКопировании
    • ОбработкаЗаполнения
    • ПередЗаписью
    • ПриЗаписи
    • ПередУдалением
    • ОбработкаПроверкиЗаполнения
  • Модуль объекта бизнес-процесса:
    • ПриУстановкеНовогоНомера
    • ПриКопировании
    • ОбработкаЗаполнения
    • ПередЗаписью
    • ПриЗаписи
    • ПередУдалением
    • ОбработкаИнтерактивнойАктивации
    • ОбработкаПроверкиЗаполнения
  • Модуль объекта задачи:
    • ПриУстановкеНовогоНомера
    • ПриКопировании
    • ОбработкаЗаполнения
    • ПередЗаписью
    • ПриЗаписи
    • ПередУдалением
    • ОбработкаИнтерактивнойАктивации
    • ОбработкаПроверкиВыполнения
    • ПередВыполнением
    • ПередИнтерактивнымВыполнением
    • ПриВыполнении
    • ОбработкаПроверкиВыполнения
***
Вопрос 06.18 экзамена 1С:Профессионал по платформе. Где располагаются процедуры-обработчики событий прикладных объектов, например, ПриЗаписи, ПередУдалением?
  1. В модуле формы
  2. В модуле объекта
  3. В модуле приложения
  4. Таких событий у прикладных объектов нет
Разбор выше.

***
Вопрос 06.41 экзамена 1С:Профессионал по платформе. С помощью команды "ДобавитьОбработчик" можно назначить обработчик события на:
  1. COM объект
  2. экземпляр объекта 1С:Предприятие (назначать на события модуля объекта)
  3. экземпляр объекта "Форма"
  4. верны 1,2 ответы
  5. верны 1,2,3 ответы
Обратимся к синтакс-помощнику. В примерах разобраны экземпляры объектов, и COM объекты.
ДобавитьОбработчик (AddHandler)
Синтаксис:
ДобавитьОбработчик <Событие>, <ОбработчикСобытия>;
Параметры:
<Событие>
Событие, которому добавляется обработчик. 
Событие задается в форме <Выражение>.<Имя_события>, где:

<Выражение> - произвольное выражение на встроенном языке, результатом которого должен быть объект, к событию которого добавляется обработчик;
<Имя_события> - идентификатор (имя) события.

<ОбработчикСобытия>
Процедура/функция-обработчик события. 
Обработчиком события может являться метод объекта встроенного языка. Тогда <ОбработчикСобытия> задается как <Выражение>.<Имя_обработчика>, где:

<Выражение> - произвольное выражение на встроенном языке, результатом которого должен быть объект, метод которого служит обработчиком события;
<Имя_обработчика> - имя метода обработчика события.

Также в качестве обработчика события может быть задана процедура/функция, находящаяся в области видимости. В этом случае обработчик события задается как имя процедуры/функции.
Описание:
Добавляет обработчик события.
При добавлении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначаемого в качестве обработчика.
Пример:

Обработка = Обработки.КонтрольДокумента.Создать(); Накладная = Документы.Накладная.СоздатьДокумент(); ДобавитьОбработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента;  msword = Новый COMОбъект("Word.Application"); ДобавитьОбработчик msword.DocumentChange, ПриИзмененииДокумента;
Процедура ПриИзмененииДокумента() Сообщить("Документ изменен"); КонецПроцедуры

***
Вопрос 06.36 экзамена 1С:Профессионал по платформе. При определении обработчика события на COM объект количество параметров в процедуре - обработчике:
  1. равно количеству параметров соответствующего события объекта
  2. на один параметр больше, чем у соответствующего события объекта (первый параметр содержит сам COM объект)
  3. на один параметр больше, чем у соответствующего события объекта (последний параметр содержит сам COM объект)
  4. у такой процедуры не будет параметров
  5. всегда один параметр (сам COM объект)
Правильный ответ первый, При добавлении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначаемого в качестве обработчика.

***
Вопрос 06.37 экзамена 1С:Профессионал по платформе. При определении подписки на событие количество параметров в процедуре - обработчике:
  1. равно количеству параметров соответствующего обработчика события, располагаемого в модуле объекта
  2. на один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (первый параметр содержит сам объект)
  3. на один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (последний параметр содержит сам объект)
  4. у такой процедуры не будет параметров
  5. всегда один параметр (сам объект, для которого определялась подписка)
Правильный ответ первый. Пример кода в обработчике события:
Процедура ПриИзмененииДокумента(Отказ)
КонецПроцедуры
Пример кода процедуры-обработчика:
Процедура ПриИзмененииДокумента(Источник, Отказ)
КонецПроцедуры

***
Вопрос 06.38 экзамена 1С:Профессионал по платформе. При определении обработчика события на экземпляр объекта 1С:Предприятие количество параметров в процедуре - обработчике:
  1. равно количеству параметров соответствующего обработчика события, располагаемого в модуле объекта
  2. на один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (первый параметр содержит сам объект)
  3. на один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (последний параметр содержит сам объект)
  4. у такой процедуры не будет параметров
  5. всегда один параметр (сам объект, для которого определялась подписка)
Правильный ответ второй, аналогично прошлому вопросу.

***
Вопрос 06.40 экзамена 1С:Профессионал по платформе. При назначении обработчика события на объект (экземпляр объекта 1С:Предприятие, COM объект) процедура, отвечающая за отработку данного события должна быть расположена:
  1. обязательно в глобальном общем модуле
  2. обязательно в не глобальном общем модуле
  3. обязательно в модуле приложения
  4. выбор модуля не важен, в "пределах видимости"
Правильный ответ четвертый, см. выдержку из синтакс-помощника.

13 комментариев:

  1. 6,37 Написано правильный ответ первый, а выделен жирным второй. Какой верный?

    ОтветитьУдалить
    Ответы
    1. Верный второй: на один параметр больше, чем у соответствующего обработчика события, располагаемого в модуле объекта (первый параметр содержит сам объект)

      Удалить
  2. Мне не совсем понятен вопрос 6.38(При определении обработчика события на экземпляр объекта 1С:Предприятие количество параметров в процедуре - обработчике). Где это назначается? Что здесь понимается под экземпляром объекта?

    ОтветитьУдалить
    Ответы
    1. Этот комментарий был удален автором.

      Удалить
    2. Разобрался. В синтаксис-помощнике есть пример:

      Обработка = Обработки.КонтрольДокумента.Создать();
      Накладная = Документы.Накладная.СоздатьДокумент();

      ДобавитьОбработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента;

      Так вот, в модуле обработки "КонтрольДокумента" должна быть создана процедура:

      ПриЗаписи(Источник, Отказ)

      Заметьте, что первым параметром идет "Источник". Название этого параметра может быть любым. В него передается, в данном случае, ДокументОбъект. А остальные параметры должны быть такие же как и у события объекта "Накладная", в данном случае "Отказ".

      Изначально я думал, что в модуле обработки "КонтрольДокумента" должна быть процедура ПриЗаписи(Отказ). Замететьте, без параметра "Источник". Так думал потому что в синтаксис-помощнике написано:
      "При добавлении обработчика события производится проверка соответствия числа параметров события числу параметров метода, назначаемого в качестве обработчика."
      Теперь понял, что число параметров должно быть на один больше.

      Удалить
    3. Этот комментарий был удален автором.

      Удалить
    4. А я не понял почему (вернее зачем) на 1 параметр больше?

      Удалить
  3. есть вопрос 6.39 (При определении подписки на событие процедура обработчик должна располагаться: в не глобальном общем модуле) и вопрос 6.40 (выбор модуля не важен, в "пределах видимости"). Такое впечатление, что правильные ответы на эти вопросы противоречат друг-другу. Поясните кто-нибудь, а то каша в голове.. :)

    ОтветитьУдалить
    Ответы
    1. Подписка на событие это одно, а обработчик - другое. Речь о разном.

      Удалить
  4. ДобавитьОбработчик
    В синтакс-помощнике не дописали код для экземпляра объекта.
    После строк
    Обработка = Обработки.КонтрольДокумента.Создать();
    Накладная = Документы.Накладная.СоздатьДокумент();
    ДобавитьОбработчик Накладная.ПриЗаписи, Обработка.ПриЗаписиДокумента;
    надо было дописать что в модуле обработки должно быть
    Процедура ПриЗаписиДокумента(Источник, Отказ) Экспорт
    Сообщить("Документ изменен");
    КонецПроцедуры
    А дальше записываем документ
    Документ.Записать();
    Итог - сообщение "Документ изменен".
    Сразу понятн и про экземпляр объекта, и назначение обработчика на экземпляр объекта, и почему +1 параметр.

    ОтветитьУдалить
    Ответы
    1. П.С.
      Документ.Записать();
      читать как
      Накладная.Записать();

      Удалить
    2. Ну и почему на 1 параметр больше-то?

      Удалить
  5. Вопрос 06.18 поменялся
    Где располагаются процедуры-обработчики событий прикладных объектов (например СправочникОбъектИмя справочника), такие как ПередЗаписью, ПередУдалением?
    В модуле формы
    В модуле объекта
    В модуле приложения
    Таких событий у прикладных объектов нет
    В модуле менеджера

    Ответ - 2.

    ОтветитьУдалить