Как получить данные текущего элемента справочника в запросе на сервере в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

При разработке конфигураций на управляемых формах часто возникает задача: пользователь выбирает строку в списке справочника, нажимает кнопку, и необходимо выполнить запрос к базе данных, отфильтрованный по выбранному элементу. Поскольку работа с Элементы.ТекущиеДанные возможна только на клиенте, начинающие разработчики часто сталкиваются с вопросом: как корректно передать эти данные на сервер для выполнения запроса? Рассмотрим основные подходы к решению этой задачи.

Способ №1: Передача параметра при вызове функции

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

Рассмотрим, как это выглядит на практике:

  1. В клиентской процедуре, которая срабатывает при нажатии кнопки или активации строки, мы получаем данные текущего элемента.
  2. Передаем эти данные (обычно ссылку) в серверную процедуру.
  3. В процедуре на сервере используем переданный параметр в запросе.

Пример реализации:


&НаКлиенте
Процедура ЗаказыНаПроизводствоПриАктивизацииСтроки(Элемент)
    // Получаем ссылку на заказ из текущих данных
    ТекЗаказ = Элемент.ТекущиеДанные.Заказ;
    // Вызываем серверную процедуру с параметром
    ЗаполнитьЭтапыНаСервере(ТекЗаказ);
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЭтапыНаСервере(ТекЗаказ)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Таблица.Наименование,
        |   Таблица.Код
        |ИЗ
        |   Справочник.ЗаказыНаПроизводство КАК Таблица
        |ГДЕ
        |   Таблица.Ссылка = &ТекЗаказ";
    
    Запрос.УстановитьПараметр("ТекЗаказ", ТекЗаказ);
    // Далее обработка результата запроса...
КонецПроцедуры

Способ №2: Обращение к элементам формы на сервере

Если серверная процедура выполняется в контексте формы (то есть она не объявлена с ключевым словом &НаСервереБезКонтекста), у нас есть возможность получить данные напрямую через объект ЭтаФорма. Это позволяет избежать «пробрасывания» параметров через клиентский код, если вызов функции происходит из другого серверного контекста формы.

Важно помнить, что мы обращаемся к коллекции Элементы, доступной на сервере для управляемой формы.

Рассмотрим реализацию этого метода:


&НаСервере
Процедура ВыполнитьЗапросПоТекущейСтроке()
    // Получаем список из элементов формы
    Список = ЭтаФорма.Список;
    
    // Получаем ссылку на текущую строку
    ТекСсылка = Список.ТекущаяСтрока;
    
    Если ЗначениеЗаполнено(ТекСсылка) Тогда
        Запрос = Новый Запрос;
        Запрос.Текст = "... (текст запроса) ... ГДЕ Ссылка = &Ссылка";
        Запрос.УстановитьПараметр("Ссылка", ТекСсылка);
        Результат = Запрос.Выполнить();
    КонецЕсли;
КонецПроцедуры

Важные замечания и советы

При использовании прямого обращения к элементам формы на сервере, учитывайте следующие нюансы:

Выбирайте подходящий метод исходя из архитектуры вашей формы. Для стандартных команд печати или кнопок на форме наиболее предпочтительным остается Способ №1, так как он делает код более предсказуемым и легко поддерживаемым.

← На главную