Как создать обработчик события 1с. Механизм основных форм

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

  • Записать
  • Провести
  • Провести и закрыть
  • Отмена проведения
Рассмотрим последовательность выполнения событий при каждом действии.

Действие Записать

Для непроведенного документа последовательность выполнения событий при записи документа из формы будет следующей:
  1. Модуль объекта - перед записью (начинается транзакция, документ еще не записан);
  2. Модуль формы (&НаСервере) - при записи на сервере (фиксация транзакции);
Заметим, что для расширения формы документа платформа 1С по-умолчанию устанавливает значение Истина для свойства ПриЗаписиПерепроводить , поэтому, при записи проведенного документа из формы платформа 1С выполнит автоматически его перепроведение. В этом случае для проведенного документа последовательность выполнения событий при записи из формы будет следующей:
  1. Модуль формы (&НаКлиенте) - перед записью;
  2. Модуль формы (&НаСервере) - обработка проверки заполнения на сервере;
  3. Модуль объекта - обработка проверки заполнения;
  4. Модуль формы (&НаСервере) - перед записью на сервере;
  5. Модуль объекта - перед записью (начало транзакции, документ еще не записан);
  6. Модуль объекта - при записи (документ записан);
  7. Модуль объекта - обработка проведения (формирование набора записей движений документа);
  8. Модуль формы (&НаСервере) - при записи на сервере (записан набор записей движений документа, фиксация транзакции);
  9. Модуль формы (&НаСервере) - после записи на сервере;
  10. Модуль формы (&НаКлиенте) - после записи.
Если для свойства ПриЗаписиПерепроводить установить значение Ложь , тогда последовательность выполнения событий при записи проведенного документа из формы будет такой же как и для непроведенного документа.

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

Действие Провести

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

Действие Провести и закрыть

Последовательность выполнения событий аналогична действию провести (см. рисунок 2).

Действие Отмена проведения

Данное действие инициирует запись документ и запускает следующую последовательность событий:
  1. Модуль формы (&НаКлиенте) - перед записью;
  2. Модуль формы (&НаСервере) - перед записью на сервере;
  3. Модуль объекта - перед записью (начало транзакции);
  4. Модуль объекта - обработка удаления проведения (удаление движений);
  5. Модуль объекта - при записи (движения удалены, документ записан);
  6. Модуль формы (&НаСервере) - после записи на сервере (фиксация транзакции);
  7. Модуль формы (&НаКлиенте) - после записи.
Если действия выполняются не из формы (выполняются программно), отличия состоя в том, что не выполняются события формы!

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

  • Записать
  • Провести
  • Провести и закрыть
  • Отмена проведения
Рассмотрим последовательность выполнения событий при каждом действии.

Действие Записать

Для непроведенного документа последовательность выполнения событий при записи документа из формы будет следующей:
  1. Модуль объекта - перед записью (начинается транзакция, документ еще не записан);
  2. Модуль формы (&НаСервере) - при записи на сервере (фиксация транзакции);
Заметим, что для расширения формы документа платформа 1С по-умолчанию устанавливает значение Истина для свойства ПриЗаписиПерепроводить , поэтому, при записи проведенного документа из формы платформа 1С выполнит автоматически его перепроведение. В этом случае для проведенного документа последовательность выполнения событий при записи из формы будет следующей:
  1. Модуль формы (&НаКлиенте) - перед записью;
  2. Модуль формы (&НаСервере) - обработка проверки заполнения на сервере;
  3. Модуль объекта - обработка проверки заполнения;
  4. Модуль формы (&НаСервере) - перед записью на сервере;
  5. Модуль объекта - перед записью (начало транзакции, документ еще не записан);
  6. Модуль объекта - при записи (документ записан);
  7. Модуль объекта - обработка проведения (формирование набора записей движений документа);
  8. Модуль формы (&НаСервере) - при записи на сервере (записан набор записей движений документа, фиксация транзакции);
  9. Модуль формы (&НаСервере) - после записи на сервере;
  10. Модуль формы (&НаКлиенте) - после записи.
Если для свойства ПриЗаписиПерепроводить установить значение Ложь , тогда последовательность выполнения событий при записи проведенного документа из формы будет такой же как и для непроведенного документа.

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

Действие Провести

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

Действие Провести и закрыть

Последовательность выполнения событий аналогична действию провести (см. рисунок 2).

Действие Отмена проведения

Данное действие инициирует запись документ и запускает следующую последовательность событий:
  1. Модуль формы (&НаКлиенте) - перед записью;
  2. Модуль формы (&НаСервере) - перед записью на сервере;
  3. Модуль объекта - перед записью (начало транзакции);
  4. Модуль объекта - обработка удаления проведения (удаление движений);
  5. Модуль объекта - при записи (движения удалены, документ записан);
  6. Модуль формы (&НаСервере) - после записи на сервере (фиксация транзакции);
  7. Модуль формы (&НаКлиенте) - после записи.
Если действия выполняются не из формы (выполняются программно), отличия состоя в том, что не выполняются события формы!

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

Проанализировав отзывы пользователей, разработчики в восьмерке реализовали новый объект, получивший название «Подписка на событие». В этой статье мы постараемся раскрыть:

  • Настройку подписок;
  • Создание;
  • Особенности функционирования.

Создание новой подписки

Как и любой другой объект метаданных, подписка на событие в 1С добавляется из конфигуратора.

Находится эти элементы в ветке дерева «Общие» (Рис.1).

Для добавления нового обработчика необходимо:


Рис.3

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

Особенности функционирования подписок

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

На примере процедуры ПриЗаписи() для любого документа можно увидеть порядок вызова обработчиков.

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

В случае, когда существует несколько объектов-подписок, одинаковых для одного источника и одного события, отследить порядок выполнения очень сложно. И, если в ходе выполнения, хотя бы одного обработчика, будет вызвана исключительная ситуация, часть процедур останется не выполненной.

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

  1. Обрабатываются события модуля объекта;
  2. Обрабатываются подписки, связанные непосредственно с текущим типом данных;
  3. Отрабатывается код, привязанный к общему типу.

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

Обработчик события открытия формы

Возрастающая популярность управляемых форм, используемых в 8 версии программы, а так же проблемы связанные с обновлением этих объектов с сохранением собственных изменений, привели к тому, что, начиная с платформы 8.2.15, в программе появилось событие ОбработкаПолученияФормы. Именно сюда можно вставлять код, изменяющий и заменяющий типовые формы.

Некоторые особенности данного обработчика:

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

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

Рис.4

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

Когда пользователь нажимает на ту или иную кнопку, открывается или закрывается форма, записывается документ – возникает событие.

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

Как это сделать?

Подписки на события 1С

Подписка на события 1С – это , он находится в ветке конфигурации Общие/Подписки на события 1С.

Подписка на событие 1С позволяет назначить обработчик при наступлении события у любого нескольких объектов (справочников, документов).

Добавим новую подписку на событие 1С, установим название.

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

В свойстве подписки на событие 1С Событие – нужно выбрать один из вариантов стандартных событий, которые могут произойти с выбранными документами и справочниками.

Мы упрощаем говоря «документы и справочники» — на самом деле можно использовать многие объекты 1С. К сожалению, нельзя подписаться на события 1С формы – например, при открытии формы, о чем жалеют многие программисты.

Набор возможных событий зависит от объекта. Будьте внимательны, так как если выбрать несколько (множество) объектов – то в списке событий будут только те события, которые могут быть у каждого из выбранных объектов (то есть общие для всех выбранных объектов события).

После этого остается создать функцию обработчик. Для этого в конфигурации должен быть с установленной в свойствах галочкой Серверный. При нажатии кнопки «лупа» будет создана функция – обработчик.

Все! Мы только что подписались на событие 1С ПередЗаписью для всех документов. Теперь при записи любого документа будет выполняться наша функция, в которой прописана проверка.

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

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Создание конфигураций 1С: добавляем обработку

Продолжаем изучение азов создания конфигураций на 1С.

На этом уроке мы вместе создадим новую обработку, а затем напишем для неё команды, которые демонстрируют работу со справочником "Сотрудники".

Возвращаемся в конфигуратор и открываем дерево конфигурации.

Добавляем новую обработку

Правой кнопкой нажимаем на разделе "Обработки" и выбираем пункт "Добавить":

Открылось окно создания новой обработки. Перейдём на закладку "Основные" и укажем в качестве имени обработки "ОбработкаСправочников":

Создаём форму для обработки

Перейдём на закладку "Формы" нажмём на зелёный плюсик, чтобы добавить новую форму (визуальное представление нашей обработки):

Появился конструктор создания формы. Оставим всё по умолчанию и нажмём "Готово":

Открылась новая форма:

Создаём новую команду для формы

Перейдём на закладку "Команды"->"Команды формы":

Добавим новую команду (зелёный плюсик):

И в свойствах новой команды укажем имя "ВыводВсехСотрудников":

Нажмём в её же свойствах на лупу рядом с полем "Действие", чтобы задать обработчик команды. Выберем вариант создания обработчика "НаКлиенте" и нажмём "ОК":

Нас перенесло в модуль формы в процедуру-обработчик команды "ВыводВсехСотрудников":

Пишем код обработчика команды

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

Сразу хочу сказать, что этот код нельзя писать прямо в процедуре "ВыводВсехСотрудников", так как она выполняется на клиенте (обратите внимание на специальную строчку перед процедурой "&НаКлиенте"). Попытка прочитать данные из базы в клиентской процедуре всегда будет приводить к ошибке (пока просто запомните это).

Поэтому давайте допишем в конце модуля процедуру такого вида:

Обратите внимание, что перед ней я указал признак "&НаСервере". Это означает, что она будет выполняться на сервере, а значит мы можем из неё читать данные справочника.

Теперь организуем вызов этой процедуры из клиентской "ВыводВсехСотрудников":

Тут логика такая:

  1. Пользователь вызывает команду "ВыводВсехСотрудников" (например, нажатием на кнопку, которой у нас ещё правда нет)
  2. Команда запускает одноименную процедуру-обработчик "ВыводВсехСотрудников" на клиенте (ведь кнопка, а значит и команда находятся на клиенте)
  3. Клиентская процедура "ВыводВсехСотрудников" делает вызов серверной процедуры "ВыводВсехСотрудниковНаСервере"
  4. Серверная процедура "ВыводВсехСотрудниковНаСервере" читает данные справочника из базы и выводит их в окно сообщений

Нам осталась самая малость - написать код процедуры "ВыводВсехСотрудниковНаСервере", который пробегается по элементам справочника "Сотрудники" и выводит их в окно сообщений.

Это на самом деле несложно. Обход всех справочников в 1С однотипен. А значит научившись это делать сейчас со справочником "Сотрудники", вы сможете делать также и с любыми другими справочниками.

Для доступа к данным справочника используется менеджер, доступ к которому осуществляется так:

Менеджер = Справочники. Сотрудники;

В этом предложении ключевая часть находится справа от знака равно. Слева - это просто переменная, в которую мы сохраняем менеджер, чтобы работать с ним дальше. Имя этой переменной могло быть не только "Менеджер", но и любое другое - хоть "Барабашка".

Что представляет из себя менеджер справочника? Менеджер - это ещё не сами данные справочника. Менеджер - это некоторый программный объект (можете представлять его себе в виде чёрного ящика), через который мы можем что-либо делать со справочником.

Менеджер справочника - это как бы такая прослойка между нашим кодом и данными справочника. И получается, что, если нам требуется прочитать все элементы справочника, то мы не можем этого сделать напрямую. Мы можем только попросить об этом нашу прослойку между нами и справочником, то есть менеджер.

Чтобы сделать это - необходимо вызвать встроенный в менеджер метод "Выбрать". Вызывается он через точку после имени переменной, в которой хранится менеджер, и возвращает коллекцию элементов справочника:

Менеджер = Справочники. Сотрудники; Выборка = Менеджер. Выбрать() ;

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

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

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

Чтобы получить очередную порцию данных из выборки, необходимо вызвать у выборки встроенный в неё метод "Следующий". Получение порций данных (одна порция соответствует одному элементу справочника) обычно происходит в цикле:

Когда данные (элементы справочника) в выборке закончатся, метод "Следующий" вернёт Ложь и цикл прекратится.

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

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