В процессе разработки на платформе «1С:Предприятие», особенно в контексте обычных форм (характерных для версии 8.2), программисты часто сталкиваются с дилеммой: написать пять одинаковых процедур для пяти разных полей ввода или попытаться «схлопнуть» код в один универсальный обработчик. На первый взгляд, создание множества однотипных процедур кажется избыточным, но стандарты разработки диктуют свои правила. В этой статье мы подробно разберем, какой подход является наиболее правильным с точки зрения надежности, скорости разработки и стоимости дальнейшей поддержки программного продукта.
Рассмотрим типичную задачу: при вводе адреса, телефона или наименования контрагента необходимо гарантировать, что в строке не останется спецсимволов, недопустимых для формата XML, или лишних кавычек. Это критически важно для последующей выгрузки данных во внешние системы или на сайт. Простейшая логика очистки выглядит так: Значение = УдалитьНедопустимыеСимволыXMLиКавычки(Значение). Вопрос в том, где и как этот код разместить, если на форме у нас пять таких полей.
Согласно официальным стандартам разработки «1С», для каждого элемента управления рекомендуется создавать отдельный обработчик события. Давайте проанализируем, почему это считается правильным:
Если... ИначеЕсли.Пример реализации в стиле «стандарт»:
Процедура АдресПриИзменении(Элемент)
Объект.Адрес = УдалитьНедопустимыеСимволыXMLиКавычки(Объект.Адрес);
КонецПроцедуры
Процедура ТелефонПриИзменении(Элемент)
Объект.Телефон = УдалитьНедопустимыеСимволыXMLиКавычки(Объект.Телефон);
КонецПроцедуры
Программисты, стремящиеся минимизировать объем кода (принцип Don't Repeat Yourself — не повторяйся), часто назначают всем элементам одну и ту же процедуру. В обычных формах 1С 8.2 это технически реализуемо, так как объект Элемент передается в процедуру как параметр, и мы можем напрямую обратиться к его значению.
Разберем, как это может выглядеть:
// Назначаем эту процедуру в свойстве "ПриИзменении" для всех 5 элементов
Процедура ОбщийОбработчикПриИзменении(Элемент)
// В обычных формах значение доступно напрямую через элемент
Элемент.Значение = УдалитьНедопустимыеСимволыXMLиКавычки(Элемент.Значение);
КонецПроцедуры
Важное предостережение: Несмотря на элегантность, этот метод скрывает в себе риски. Как было отмечено в дискуссии, если кто-то из коллег удалит один из элементов и согласится на удаление обработчика, «сломаются» все остальные поля. Кроме того, поиск ссылок на объект Объект.Адрес не покажет, где именно он меняется, так как изменение происходит через универсальный параметр Элемент.
Как найти «золотую середину»? Мы можем сохранить прозрачность структуры (по одному обработчику на элемент) и при этом избежать дублирования логики обработки текста. Для этого используется вызов служебной функции внутри каждого обработчика.
Проанализируем этот алгоритм:
ПриИзменении вызываем эту функцию.Пример кода:
Процедура Поле1ПриИзменении(Элемент)
ОбработатьВводРеквизита(Элемент);
КонецПроцедуры
Процедура Поле2ПриИзменении(Элемент)
ОбработатьВводРеквизита(Элемент);
КонецПроцедуры
Процедура ОбработатьВводРеквизита(Элемент)
// Централизованная логика обработки
Элемент.Значение = УдалитьНедопустимыеСимволыXMLиКавычки(Элемент.Значение);
КонецПроцедуры
Стоит отметить нюанс, упомянутый при обсуждении версии 8.2. Если вы работаете в Обычных формах, свойство Элемент.Значение доступно. Однако, если вы переходите на Управляемые формы (стандарт 8.3), у элементов формы больше нет свойства Значение. Работа ведется через реквизиты, связанные с путем к данным.
В управляемом интерфейсе для достижения универсальности пришлось бы использовать более сложные конструкции:
&НаКлиенте
Процедура ОбщийОбработчикПриИзменении(Элемент)
ИмяРеквизита = Элемент.Имя; // Или анализ Элемент.ПутьКДанным
ЭтаФорма[ИмяРеквизита] = УдалитьНедопустимыеСимволыXMLиКавычки(ЭтаФорма[ИмяРеквизита]);
КонецПроцедуры
Такой код считается «хрупким», так как при изменении пути к данным (например, если реквизит перенесли в группу или в структуру объекта) код перестанет работать без ручного исправления имен.
Чтобы не изобретать «велосипед» при очистке символов XML, выясним, есть ли готовые инструменты. В современных конфигурациях на базе БСП существует функция ОбщегоНазначения.ЗаменитьНедопустимыеСимволыXML(). Вместо написания своих алгоритмов на регулярных выражениях или через СтрЗаменить, лучше использовать проверенный временем платформенный функционал.
Подводя итог обсуждению, сформулируем правила хорошего тона для разработчика 1С:
Таким образом, самым правильным вариантом будет создание индивидуальных обработчиков, вызывающих единую процедуру обработки. Это обеспечит и чистоту кода, и соответствие стандартам 1С, и легкость будущей поддержки.