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