Процедуры-обработчики событий
Особенностью обработки событий среде 1С:Предприятия 8 является то, что имя процедуры-обработчика в одних случаях должно совпадать с именем события, а в других случаях может от него отличаться. Данная статья написана, чтобы внести ясность в этом вопросе.
Обратите внимание, что термин «Предопределенная процедура», который использовался в версии 7.х, теперь заменен на «процедура-обработчик события» или просто «обработчик события».
| ПРАВИЛО №1. Если процедура-обработчик события относится к форме или элементу управления, то ее обязательно нужно указывать в палитре свойств для формы или элемента управления. |
Ниже показана палитра свойств для формы элемента справочника «Номенклатура» с несколькими назначенными обработчиками событий:
За информацией о приемах работы с этой частью палитры свойств обращайтесь к документации: книга «Конфигурирование и администрирование», «Глава 3. Объекты конфигурации => Свойства элементов управления => Категория свойств События» (стр. 1 — 204)
Обратите внимание на важный момент, имя процедуры-обработчика событий может не совпадать с именем события . Для элементов управления чаще всего так и бывает, например, процедура «ТипЦенПриИзменении» обрабатывает событие «ПриИзменении» поля ввода для реквизита «ТипЦен», как показано на следующем рисунке:

Как правило, процедура-обработчик имеет тот же набор параметров, что и событие. Если у нее нет соответствующих параметров, то обработка события может получиться неполной. Поэтому рекомендуется создавать процедуры-обработчики конструктором через палитру свойств, нажимая кнопку с лупой или выбирая процедуру из выпадающего списка.
Есть еще одна интересная возможность: одна и та же процедура может «обслуживать» несколько событий формы или элементов управления, в том числе от разных источников. Элемент управления, который инициировал событие, передается в качестве первого параметра в эту процедуру-обработчик (параметр «Элемент»), и при необходимости алгоритм может проанализировать, откуда пришло событие, и выполнить соответствующие действия.
| ПРАВИЛО №2. Процедуры-обработчики событий, расположенные в модуле приложения, модуле внешнего соединения, модуле прикладного объекта должны называться точно так, как называются соответствующие события. |
Поясним это правило на конкретных примерах:
1. Процедуры-обработчики событий, расположенные в модуле приложения или модуле внешнего соединения, совпадают с именами событий:
- ПередНачаломРаботыСистемы
- ПриНачалеРаботыСистемы
- ПриЗавершенииРаботыСистемы
- ПередЗавершениемРаботыСистемы
- ОбработкаВнешнегоСобытия
2. Имена процедур-обработчиков событий, расположенных в модуле объекта, тоже строго соответствуют именам событий:
для модуля документа (события объекта типа «ДокументОбъект»)
- ПередЗаписью
- ПриЗаписи
- ПриУдалении
- ПриКопировании
- ОбработкаЗаполнения (для обработки «ввода на основании»)
- ОбработкаПроведения
- ОбработкаУдаленияПроведения
- ПриУстановкеНовогоНомера
Аналогичные обработчики событий могут располагаться в модуле справочника и модулях других прикладных объектов.
3. Есть также модуль набора записей для всех видов регистров, который подобен модулям прикладных объектов. Модуль набора записей может содержать следующие процедуры-обработчики событий (имена процедур должны совпадать с именами событий):
- ПередЗаписью
- ПриЗаписи
Ниже приведены несколько важных моментов, которые полезно помнить при работе с событиями:
Примечание 1. Событие ПередЗаписью прикладного объекта отличается от события ПередЗаписью формы, связанной с этим прикладным объектом. Обработчик события в модуле формы вызывается при интерактивной записи, а обработчик в модуле объекта при любом способе записи элемента в базу данных.
Примечание 2. Если в процедурах-обработчиках модуля объекта нужно обратиться к самому объекту (текущий элемент справочника, текущий документ и т.д.), то для этого можно использовать свойство ЭтотОбъект. Оно содержит объект типа «СправочникОбъект», «ДокументОбъект» и т.д.
Примечание 3. Считается грубой ошибкой в процедурах-обработчиках событий объектов вызывать такие интерактивные команды, как Вопрос и Предупреждение. Эти команды показывают на экране диалоговое окно и ждут реакции пользователя. Так как событие обрабатывается в рамках транзакции, то это вызовет значительную задержку в обработке события и часть данных (или вся таблица) будет заблокирована на время ожидания.
Какой параметр в обработчике события передает объект события которое обрабатывается
Для взаимодействия с пользователем в Windows Forms используется механизм событий. События в Windows Forms представляют стандартные события на C#, только применяемые к визуальным компонентам и подчиняются тем же правилам, что события в C#. Но создание обработчиков событий в Windows Forms все же имеет некоторые особенности.
Прежде всего в WinForms есть некоторый стандартный набор событий, который по большей части имеется у всех визуальных компонентов. Отдельные элементы добавляют свои события, но принципы работы с ними будут похожие. Чтобы посмотреть все события элемента, нам надо выбрать этот элемент в поле графического дизайнера и перейти к вкладке событий на панели форм. Например, события формы:

Чтобы добавить обработчик, можно просто два раза нажать по пустому полю рядом с названием события, и после этого Visual Studio автоматически сгенерирует обработчик события. Например, нажмем для создания обработчика для события Load :

И в этом поле отобразится название метода обработчика события Load. По умолчанию он называется Form1_Load .
Если мы перейдем в файл кода формы Form1.cs, то увидим автосгенерированный метод Form1_Load:
public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void Form1_Load(object sender, EventArgs e) < >>
И при каждой загрузке формы будет срабатывать код в обработчике Form1_Load.
Как правило, большинство обработчиков различных визуальных компонентов имеют два параметра: sender — объект, инициировавший событие, и аргумент, хранящий информацию о событии (в данном случае EventArgs e ).
Но это только обработчик. Добавление же обработчика, созданного таким образом, производится в файле Form1.Designer.cs:
namespace HelloApp < partial class Form1 < private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) < if (disposing && (components != null)) < components.Dispose(); >base.Dispose(disposing); > private void InitializeComponent() < this.SuspendLayout(); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Name = "Form1"; // добавление обработчика this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); >> >
Для добавления обработчика используется стандартный синтаксис C#: this.Load += new System.EventHandler(this.Form1_Load)
Поэтому если мы захотим удалить созданный подобным образом обработчик, то нам надо не только удалить метод из кода формы в Form1.cs, но и удалить добавление обработчика в этом файле.
Однако мы можем добавлять обработчики событий и програмно, например, в конструкторе формы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); this.Load += LoadEvent; >private void Form1_Load(object sender, EventArgs e) < >private void LoadEvent(object sender, EventArgs e) < this.BackColor = Color.Yellow; >> >
Кроме ранее созданного обработчика Form1_Load здесь также добавлен другой обработчик загрузки формы: this.Load += LoadEvent; , который устанавливает в качестве фона желтый цвет.
Обработка события элемента управления (Windows Forms .NET)
События для элементов управления (и для форм) обычно задаются с помощью визуального конструктора Visual Studio для Windows Forms. Настройка события с помощью визуального конструктора называется обработкой события во время разработки. Вы также можете динамически обрабатывать события в коде — это называется обработкой событий во время выполнения. Событие, созданное во время выполнения, позволяет динамически подключать обработчики событий на основе текущих действий приложения.
Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.
Обработка события — конструктор
В Visual Studio используйте визуальный конструктор для управления обработчиками событий элементов управления. Визуальный конструктор создаст код обработчика и добавит его в событие.
Установка обработчика
Используйте панель Свойства, чтобы добавить или задать обработчик события:
- Откройте визуальный конструктор формы, содержащей элемент управления, который нужно изменить.
- Выберите элемент управления.
- Измените режим панели Свойства на События, нажав кнопку событий (
). - Найдите событие, к которому нужно добавить обработчик, например событие Click:

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

- Щелкните событие правой кнопкой мыши и выберите Сбросить.
Обработка события — код
Обычно обработчики событий добавляются в элементы управления во время разработки с помощью визуального конструктора. Однако, можно создавать элементы управления во время выполнения, что требует добавления обработчиков событий в код. Добавление обработчиков в код также дает возможность добавить несколько обработчиков в одно и то же событие.
Добавление обработчика
В следующем примере показано, как создать элемент управления и добавить обработчик событий. Этот элемент управления создается в обработчике событий Button.Click другой кнопкой. При нажатии Кнопки1. Код перемещает новую кнопку и изменяет ее размер. Событие новой кнопки Click обрабатывается методом MyNewButton_Click . Чтобы появилась новая кнопка, она добавляется в коллекцию формы Controls . Существует также код для удаления обработчика события Button1.Click , который рассматривается в разделе Удаление обработчика.
private void button1_Click(object sender, EventArgs e) < // Create and add the button Button myNewButton = new() < Location = new Point(10, 10), Size = new Size(120, 25), Text = "Do work" >; // Handle the Click event for the new button myNewButton.Click += MyNewButton_Click; this.Controls.Add(myNewButton); // Remove this button handler so the user cannot do this twice button1.Click -= button1_Click; > private void MyNewButton_Click(object sender, EventArgs e)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'Create and add the button Dim myNewButton As New Button() With 'Handle the Click event for the new button AddHandler myNewButton.Click, AddressOf MyNewButton_Click Me.Controls.Add(myNewButton) 'Remove this button handler so the user cannot do this twice RemoveHandler Button1.Click, AddressOf Button1_Click End Sub Private Sub MyNewButton_Click(sender As Object, e As EventArgs) End Sub
Чтобы выполнить этот код, выполните следующие действия в форме с помощью визуального конструктора Visual Studio:

- Добавьте новую кнопку в форму и назовите ее Кнопка1.
- Измените режим панели Свойства на События, нажав кнопку событий ().
- Дважды щелкните по событию Нажать, чтобы создать обработчик. Это действие открывает окно кода и создает пустой метод Button1_Click .
- Замените код метода приведенным выше кодом.
Дополнительные сведения о событиях C# см. в разделе События (C#). Дополнительные сведения о событиях Visual Basic см. в разделе События» (Visual Basic)
Удаление обработчика
В разделе Добавление обработчика использовался код для демонстрации добавления обработчика. Этот код также содержит вызов для удаления обработчика:
button1.Click -= button1_Click;
RemoveHandler Button1.Click, AddressOf Button1_Click
Этот синтаксис можно использовать для удаления любого обработчика событий из любого события.
Дополнительные сведения о событиях C# см. в разделе События (C#). Дополнительные сведения о событиях Visual Basic см. в разделе События» (Visual Basic)
Использование нескольких событий с одним и тем же обработчиком
На панели Свойства визуального конструктора Visual Studio можно выбрать тот же обработчик, который уже используется другим событием. Следуйте указаниям в разделе Настройка обработчика, чтобы выбрать существующий обработчик вместо создания нового.
В C# обработчик присоединяется к событию элемента управления в коде конструктора формы, который был изменен с помощью визуального конструктора. Дополнительные сведения о событиях C# см. в разделе Events (C#)
Visual Basic
В Visual Basic обработчик присоединяется к событию элемента управления в файле кода программной части формы, где объявляется код обработчика событий. В код обработчика событий можно добавить несколько ключевых слов Handles , чтобы использовать его с несколькими событиями. Визуальный конструктор создаст ключевое слово Handles и добавит его в обработчик событий. Однако, это можно легко сделать самостоятельно для любого события и обработчика событий элемента управления, если сигнатура метода обработчика соответствует событию. Дополнительные сведения о событиях Visual Basic см. в разделе События (Visual Basic)
В этом коде показано, как один и тот же метод можно использовать в качестве обработчика для двух разных событий Button.Click :
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click 'Do some work to handle the events End Sub
См. также
- События элементов управления
- Общие сведения о событиях
- Использование событий мыши
- Использование событий клавиатуры
- System.Windows.Forms.Button
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
.NET Desktop feedback
The .NET Desktop documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Обработка событий в среде .NET Framework

В C# разрешается формировать какие угодно разновидности событий. Но ради совместимости программных компонентов со средой .NET Framework следует придерживаться рекомендаций, установленных для этой цели корпорацией Microsoft. Эти рекомендации, по существу, сводятся к следующему требованию: у обработчиков событий должны быть два параметра. Первый из них — ссылка на объект, формирующий событие, второй — параметр типа EventArgs, содержащий любую дополнительную информацию о событии, которая требуется обработчику. Таким образом, .NET-совместимые обработчики событий должны иметь следующую общую форму:
void обработчик(object отправитель, EventArgs е) < //. >
Как правило, отправитель — это параметр, передаваемый вызывающим кодом с помощью ключевого слова this. А параметр е типа EventArgs содержит дополнительную информацию о событии и может быть проигнорирован, если он не нужен.
Сам класс EventArgs не содержит полей, которые могут быть использованы для передачи дополнительных данных обработчику. Напротив, EventArgs служит в качестве базового класса, от которого получается производный класс, содержащий все необходимые поля. Тем не менее в классе EventArgs имеется одно поле Empty типа static, которое представляет собой объект типа EventArgs без данных.
В среде .NET Framework предоставляется встроенный обобщенный делегат под названием EventHandler . В данном случае тип TEventArgs обозначает тип аргумента, передаваемого параметру EventArgs события.
Для обработки многих событий параметр типа EventArgs оказывается ненужным. Поэтому с целью упростить создание кода в подобных ситуациях в среду .NET Framework внедрен необобщенный делегат типа EventHandler. Он может быть использован для объявления обработчиков событий, которым не требуется дополнительная информация о событиях.
Ниже приведен пример программы, в которой формируется .NET-совместимое событие:
// Реализуем программу реагирующую на события // нажатия клавиш - вызывающих специализированные команды консоли using System; namespace ConsoleApplication1 < // Производный класс от EventArgs class MyEventArgs : EventArgs < public char ch; >class KeyEvent < // Создадим событие, используя обобщенный делегат public event EventHandlerKeyDown; public void OnKeyDown(char ch) < MyEventArgs c = new MyEventArgs(); if (KeyDown != null) < c.ch = ch; KeyDown(this, c); >> > class Program < static void Main() < KeyEvent evnt = new KeyEvent(); evnt.KeyDown += (sender, e) => < switch (e.ch) < case 'C': < MyColor(true); break; >case 'B': < MyColor(false); break; >case 'S': < Console.Write("\nВведите длину: "); try < int Width = int.Parse(Console.ReadLine()) / 8; Console.Write("Введите ширину: "); int Height = int.Parse(Console.ReadLine()) / 8; Console.WindowWidth = Width; Console.WindowHeight = Height; Console.WriteLine(); >catch (FormatException) < Console.WriteLine("Неверный формат!"); >catch (ArgumentOutOfRangeException) < Console.WriteLine("Окно настолько не растянется!"); >break; > case 'T': < Console.Write("\nВведите новый заголовок: "); string s = Console.ReadLine(); Console.Title = s; Console.WriteLine(); break; >case 'R': < Console.ForegroundColor = ConsoleColor.White; Console.BackgroundColor = ConsoleColor.Black; Console.WriteLine(); break; >case 'E': < Console.Beep(); break; >default: < Console.WriteLine("\nТакая команда не найдена!"); break; >> >; ConsoleTitle(); char ch; do < Console.Write("Введите комманду: "); ConsoleKeyInfo key; key = Console.ReadKey(); ch = key.KeyChar; evnt.OnKeyDown(key.KeyChar); >while (ch != 'E'); > // Несколько вспомогательных методов static void ConsoleTitle() < CC(ConsoleColor.Green); Console.WriteLine("***************************\n\nПрограмма настройки консоли" + "\n___________________________\n"); CC(ConsoleColor.Yellow); Console.WriteLine("Управляющие команды: \n"); Command("C", "Поменять цвет текста"); Command("B", "Поменять цвет фона"); Command("S", "Поменять размер окна"); Command("T", "Поменять заголовок"); Command("R", "Сбросить изменения"); Command("E", "Выход"); Console.WriteLine(); >static void CC(ConsoleColor color) < Console.ForegroundColor = color; >static void Command(string s1, string s2) < CC(ConsoleColor.Red); Console.Write(s1); CC(ConsoleColor.White); Console.Write(" - " + s2+"\n"); >static void MyColor(bool F_or_B) < link1: Console.Write("\nВведите цвет: "); string s = Console.ReadLine(); switch (s) < case "Black": < if (F_or_B) Console.ForegroundColor = ConsoleColor.Black; else Console.BackgroundColor = ConsoleColor.Black; break; >case "Yellow": < if (F_or_B) Console.ForegroundColor = ConsoleColor.Yellow; else Console.BackgroundColor = ConsoleColor.Yellow; break; >case "Green": < if (F_or_B) Console.ForegroundColor = ConsoleColor.Green; else Console.BackgroundColor = ConsoleColor.Green; break; >case "Red": < if (F_or_B) Console.ForegroundColor = ConsoleColor.Red; else Console.BackgroundColor = ConsoleColor.Red; break; >case "Blue": < if (F_or_B) Console.ForegroundColor = ConsoleColor.Blue; else Console.BackgroundColor = ConsoleColor.Blue; break; >case "Gray": < if (F_or_B) Console.ForegroundColor = ConsoleColor.Gray; else Console.BackgroundColor = ConsoleColor.Gray; break; >case "White": < if (F_or_B) Console.ForegroundColor = ConsoleColor.White; else Console.BackgroundColor = ConsoleColor.White; break; >default: < Console.WriteLine("Такой цвет я не знаю :("); goto link1; >> Console.WriteLine("Цвет изменился!"); > > >

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