Как правильно организовать обработчики событий для множества однотипных элементов в 1С 8.2?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Проблема: Очистка «мусора» при вводе данных

Рассмотрим типичную задачу: при вводе адреса, телефона или наименования контрагента необходимо гарантировать, что в строке не останется спецсимволов, недопустимых для формата XML, или лишних кавычек. Это критически важно для последующей выгрузки данных во внешние системы или на сайт. Простейшая логика очистки выглядит так: Значение = УдалитьНедопустимыеСимволыXMLиКавычки(Значение). Вопрос в том, где и как этот код разместить, если на форме у нас пять таких полей.

Подход №1: Строгое соблюдение стандартов (Раздельные обработчики)

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

  1. Прозрачность графа вызовов: Глядя в модуль формы, вы четко видите, какой процедурой обрабатывается конкретный реквизит.
  2. Безопасность при рефакторинге: Если вы решите удалить один элемент с формы, платформа предложит удалить и его обработчик. Если этот обработчик был общим для десяти других элементов, вы получите ошибку во всех оставшихся полях.
  3. Индивидуальная логика в будущем: Часто бывает так, что сегодня требования к полям одинаковые, а завтра для одного из них нужно добавить проверку длины или маску. В раздельных процедурах это сделать проще, не загромождая код лишними условиями Если... ИначеЕсли.

Пример реализации в стиле «стандарт»:


Процедура АдресПриИзменении(Элемент)
    Объект.Адрес = УдалитьНедопустимыеСимволыXMLиКавычки(Объект.Адрес);
КонецПроцедуры

Процедура ТелефонПриИзменении(Элемент)
    Объект.Телефон = УдалитьНедопустимыеСимволыXMLиКавычки(Объект.Телефон);
КонецПроцедуры

Подход №2: Универсальный обработчик (Принцип DRY)

Программисты, стремящиеся минимизировать объем кода (принцип Don't Repeat Yourself — не повторяйся), часто назначают всем элементам одну и ту же процедуру. В обычных формах 1С 8.2 это технически реализуемо, так как объект Элемент передается в процедуру как параметр, и мы можем напрямую обратиться к его значению.

Разберем, как это может выглядеть:


// Назначаем эту процедуру в свойстве "ПриИзменении" для всех 5 элементов
Процедура ОбщийОбработчикПриИзменении(Элемент)
    // В обычных формах значение доступно напрямую через элемент
    Элемент.Значение = УдалитьНедопустимыеСимволыXMLиКавычки(Элемент.Значение);
КонецПроцедуры

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

Подход №3: Компромисс через «Обертки» (Wrapper)

Как найти «золотую середину»? Мы можем сохранить прозрачность структуры (по одному обработчику на элемент) и при этом избежать дублирования логики обработки текста. Для этого используется вызов служебной функции внутри каждого обработчика.

Проанализируем этот алгоритм:

  1. Создаем в модуле формы или в общем модуле одну функцию, отвечающую за очистку текста.
  2. В каждом обработчике события ПриИзменении вызываем эту функцию.

Пример кода:


Процедура Поле1ПриИзменении(Элемент)
    ОбработатьВводРеквизита(Элемент);
КонецПроцедуры

Процедура Поле2ПриИзменении(Элемент)
    ОбработатьВводРеквизита(Элемент);
КонецПроцедуры

Процедура ОбработатьВводРеквизита(Элемент)
    // Централизованная логика обработки
    Элемент.Значение = УдалитьНедопустимыеСимволыXMLиКавычки(Элемент.Значение);
КонецПроцедуры

Различия между Обычными и Управляемыми формами

Стоит отметить нюанс, упомянутый при обсуждении версии 8.2. Если вы работаете в Обычных формах, свойство Элемент.Значение доступно. Однако, если вы переходите на Управляемые формы (стандарт 8.3), у элементов формы больше нет свойства Значение. Работа ведется через реквизиты, связанные с путем к данным.

В управляемом интерфейсе для достижения универсальности пришлось бы использовать более сложные конструкции:


&НаКлиенте
Процедура ОбщийОбработчикПриИзменении(Элемент)
    ИмяРеквизита = Элемент.Имя; // Или анализ Элемент.ПутьКДанным
    ЭтаФорма[ИмяРеквизита] = УдалитьНедопустимыеСимволыXMLиКавычки(ЭтаФорма[ИмяРеквизита]);
КонецПроцедуры

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

Использование Библиотеки Стандартных Подсистем (БСП)

Чтобы не изобретать «велосипед» при очистке символов XML, выясним, есть ли готовые инструменты. В современных конфигурациях на базе БСП существует функция ОбщегоНазначения.ЗаменитьНедопустимыеСимволыXML(). Вместо написания своих алгоритмов на регулярных выражениях или через СтрЗаменить, лучше использовать проверенный временем платформенный функционал.

Выводы и рекомендации

Подводя итог обсуждению, сформулируем правила хорошего тона для разработчика 1С:

  1. Здравый смысл превыше всего: Если элементов два-три, проще написать две-три процедуры. Если их 20 — стоит задуматься об автоматизации.
  2. Соблюдайте стандарты: Старайтесь, чтобы у каждого элемента в свойствах был указан свой уникальный обработчик. Это сэкономит время вашим коллегам при анализе кода.
  3. Выносите общую логику: Саму «математику» обработки (удаление кавычек, фильтрация символов) всегда выносите в отдельную процедуру или функцию. Это позволит изменить логику во всех полях одновременно, поправив код всего в одном месте.
  4. Документируйте неявное: Если вы все же решили использовать один общий обработчик, обязательно добавьте комментарий, чтобы при удалении одного «ненужного» поля случайно не удалили логику работы всей формы.

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

← На главную