При разработке сложных интерфейсов на управляемых формах 1С:Предприятие 8.3 часто возникает задача создания динамических таблиц. Это особенно актуально для инструментов загрузки данных из внешних источников (например, Excel), где состав колонок заранее неизвестен и зависит от структуры файла. Основная сложность здесь заключается не только в создании самих реквизитов, но и в обеспечении реакции системы на действия пользователя в этих колонках.
В этой статье мы подробно разберем, как реализовать механизм обработки события ПриИзменении для элементов, которых изначально нет в дизайнере формы, и как правильно организовать архитектуру такого решения.
Рассмотрим ситуацию: мы загружаем данные в таблицу значений, где количество и состав колонок определяются «на лету». Нам нужно, чтобы при изменении значения в любой из этих динамических колонок срабатывал код, проверяющий корректность ввода и обновляющий статус строки (например, удаляющий сообщение об ошибке, если данные исправлены). Поскольку мы не можем заранее написать отдельную процедуру для каждой возможной колонки, мы применим стратегию единого универсального обработчика.
Прежде чем назначать события, нам необходимо создать саму структуру данных. На сервере мы используем метод ИзменитьРеквизиты. Важно помнить, что для корректной работы полей ввода необходимо правильно описывать типы данных.
Проанализируем пример создания колонки и элемента формы:
// 1. Формируем массив добавляемых реквизитов
НовыеРеквизиты = Новый Массив;
ТипСтрока = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(150));
НовыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяКолонки, ТипСтрока, "ТаблицаЗагрузки", "ЗаголовокКолонки"));
// 2. Добавляем реквизиты на форму
ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
// 3. Создаем элемент формы (поле ввода) в привязке к новой колонке
мЭлемент = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Элементы.ТаблицаЗагрузки);
мЭлемент.Вид = ВидПоляФормы.ПолеВвода;
мЭлемент.ПутьКДанным = "ТаблицаЗагрузки." + ИмяКолонки;
Для того чтобы элемент формы начал реагировать на действия пользователя, мы используем метод УстановитьДействие. Главный секрет здесь в том, что всем динамическим колонкам мы назначаем одну и ту же процедуру-обработчик, которая уже должна быть прописана в модуле формы.
Добавим строку назначения действия в наш код:
мЭлемент.УстановитьДействие("ПриИзменении", "ВыполнитьДействиеПриИзмененииДанных");
Важное ограничение: метод УстановитьДействие работает в контексте клиента, однако само создание элементов обычно происходит на сервере. 1С позволяет вызывать этот метод и в серверном коде при инициализации элементов, но сама процедура ВыполнитьДействиеПриИзмененииДанных обязана иметь компиляцию &НаКлиенте.
Теперь разберем, как понять, в какой именно колонке и в какой строке были изменены данные. В процедуру ПриИзменении система автоматически передает параметр Элемент, который содержит ссылку на поле формы, вызвавшее событие.
Рассмотрим пример клиентской процедуры:
&НаКлиенте
Процедура ВыполнитьДействиеПриИзмененииДанных(Элемент)
// Получаем текущие данные строки
ТекущиеДанные = Элементы.ТаблицаЗагрузки.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Имя колонки совпадает с именем элемента, если мы их так создавали
ИмяКолонки = Элемент.Имя;
НовоеЗначение = ТекущиеДанные[ИмяКолонки];
// Вызываем серверную логику для проверки данных
ПроверитьКорректностьДанныхНаСервере(ТекущиеДанные.ПолучитьИдентификатор(), ИмяКолонки);
КонецПроцедуры
Использование Элементы.ИмяТаблицы.ТекущиеДанные — это наиболее эффективный способ получения доступа к значениям текущей строки на клиенте без лишних вызовов сервера.
Выясним причины, по которым динамические формы могут работать медленно или некорректно, и как этого избежать:
ОписаниеТипов при создании реквизитов. Если оставить тип неопределенным, пользователь не увидит кнопок выбора или календаря в динамической ячейке.ИзменитьРеквизиты позволяет передать массив удаляемых путей вторым параметром.УсловноеОформление. Его также можно настраивать программно, добавляя элементы в коллекцию ЭтаФорма.УсловноеОформление.Если ваши динамические колонки должны содержать ссылки на справочники, вам может потребоваться программная установка действия НачалоВыбора. Это делается аналогично ПриИзменении:
мЭлемент.УстановитьДействие("НачалоВыбора", "ДинамическаяКолонкаНачалоВыбора");
Внутри этого обработчика вы сможете настраивать параметры выбора или связи параметров выбора в зависимости от того, какой именно тип данных ожидается в данной колонке.
Таким образом, использование метода УстановитьДействие в сочетании с анализом свойств передаваемого элемента позволяет создавать гибкие и интерактивные интерфейсы, способные адаптироваться под любые входящие данные без необходимости изменения конфигурации в режиме "Конфигуратор".