При разработке конфигураций на управляемых формах часто возникает задача: пользователь выбирает строку в списке справочника, нажимает кнопку, и необходимо выполнить запрос к базе данных, отфильтрованный по выбранному элементу. Поскольку работа с Элементы.ТекущиеДанные возможна только на клиенте, начинающие разработчики часто сталкиваются с вопросом: как корректно передать эти данные на сервер для выполнения запроса? Рассмотрим основные подходы к решению этой задачи.
Самый логичный и часто используемый метод — передача ссылки на элемент в качестве параметра серверной функции. Этот способ является наиболее безопасным и понятным с точки зрения архитектуры управляемого приложения, так как он четко разграничивает клиентскую и серверную логику.
Рассмотрим, как это выглядит на практике:
Пример реализации:
&НаКлиенте
Процедура ЗаказыНаПроизводствоПриАктивизацииСтроки(Элемент)
// Получаем ссылку на заказ из текущих данных
ТекЗаказ = Элемент.ТекущиеДанные.Заказ;
// Вызываем серверную процедуру с параметром
ЗаполнитьЭтапыНаСервере(ТекЗаказ);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьЭтапыНаСервере(ТекЗаказ)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Наименование,
| Таблица.Код
|ИЗ
| Справочник.ЗаказыНаПроизводство КАК Таблица
|ГДЕ
| Таблица.Ссылка = &ТекЗаказ";
Запрос.УстановитьПараметр("ТекЗаказ", ТекЗаказ);
// Далее обработка результата запроса...
КонецПроцедуры
Если серверная процедура выполняется в контексте формы (то есть она не объявлена с ключевым словом &НаСервереБезКонтекста), у нас есть возможность получить данные напрямую через объект ЭтаФорма. Это позволяет избежать «пробрасывания» параметров через клиентский код, если вызов функции происходит из другого серверного контекста формы.
Важно помнить, что мы обращаемся к коллекции Элементы, доступной на сервере для управляемой формы.
Рассмотрим реализацию этого метода:
&НаСервере
Процедура ВыполнитьЗапросПоТекущейСтроке()
// Получаем список из элементов формы
Список = ЭтаФорма.Список;
// Получаем ссылку на текущую строку
ТекСсылка = Список.ТекущаяСтрока;
Если ЗначениеЗаполнено(ТекСсылка) Тогда
Запрос = Новый Запрос;
Запрос.Текст = "... (текст запроса) ... ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ТекСсылка);
Результат = Запрос.Выполнить();
КонецЕсли;
КонецПроцедуры
При использовании прямого обращения к элементам формы на сервере, учитывайте следующие нюансы:
ЗначениеЗаполнено(). Если пользователь не выбрал строку в списке, метод вернет пустую ссылку, что может привести к ошибкам в запросе или получению неверных данных.&НаСервереБезКонтекста, этот подход не подойдет — в этом случае используйте только передачу параметров (Способ №1).ЭтаФорма.Список.ТекущиеДанные. Это позволит получить структуру данных текущей строки, не выполняя лишних запросов к базе данных, если эти поля уже выведены в списке.Выбирайте подходящий метод исходя из архитектуры вашей формы. Для стандартных команд печати или кнопок на форме наиболее предпочтительным остается Способ №1, так как он делает код более предсказуемым и легко поддерживаемым.