Как привязать параметр запроса динамического списка к реквизиту обработки в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Понимание основ работы динамического списка и его параметров

Прежде чем приступить к реализации, давайте вспомним, что динамический список в 1С:Предприятии представляет собой мощный инструмент для отображения больших объемов данных, основанный на Системе Компоновки Данных (СКД). Данные для него формируются с помощью запроса, в котором могут быть определены параметры. Эти параметры служат для фильтрации или изменения логики запроса в зависимости от внешних условий, например, значений, введенных пользователем на форме. Наша задача — научиться программно управлять этими параметрами из кода формы обработки, связывая их со значениями реквизитов формы. При необходимости можно воспользоваться руководством по гибкой настройке динамических списков через СКД.

Шаг 1: Определение параметра в запросе динамического списка

Первым и самым важным шагом является правильное создание параметра в запросе вашего динамического списка. Этот запрос создается в конфигураторе для элемента формы типа "Динамический список".

Давайте представим, что мы хотим отфильтровать список по некоторому значению, например, по количеству полных лет. В тексте запроса нам необходимо явно указать этот параметр.

Мы будем использовать стандартный синтаксис для параметров запроса 1С – амперсанд (&) перед именем параметра:


ВЫБРАТЬ
    Сотрудники.Ссылка КАК Сотрудник,
    Сотрудники.ДатаРождения КАК ДатаРождения,
    РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекущаяДата, ГОД) КАК ПолныхЛет
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекущаяДата, ГОД) >= &ПолныхЛет

В этом примере мы определили два параметра: &ТекущаяДата и &ПолныхЛет. Именно &ПолныхЛет мы и будем привязывать к реквизиту нашей обработки. Важно убедиться, что имя параметра в запросе точно соответствует тому, которое мы будем использовать в коде.

Шаг 2: Получение ссылки на динамический список на форме

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

Допустим, на вашей форме есть элемент, представляющий динамический список, и его имя (в свойствах элемента формы) — СписокСотрудников. В коде модуля формы мы будем обращаться к нему по этому имени.

Шаг 3: Установка значения параметра динамического списка

Теперь, когда у нас есть параметр в запросе и ссылка на динамический список, мы можем установить значение для нашего параметра. Для этого используется метод УстановитьЗначениеПараметра(), который доступен через свойство Параметры объекта динамического списка.

Синтаксис этого метода следующий:


ИмяДинамическогоСписка.Параметры.УстановитьЗначениеПараметра("ИмяПараметра", Значение);

Где:

Рассмотрим пример. Предположим, у нас на форме обработки есть реквизит с именем ПолныхЛетДляФильтра типа "Число", и мы хотим привязать его к параметру &ПолныхЛет в динамическом списке СписокСотрудников:


СписокСотрудников.Параметры.УстановитьЗначениеПараметра("ПолныхЛет", ПолныхЛетДляФильтра);

Важно отметить, что метод УстановитьЗначениеПараметра() не только присваивает значение, но и автоматически устанавливает свойство Использование для данного параметра в Истина, гарантируя, что параметр будет учтен при формировании запроса. Если параметр с указанным именем не найден, платформа выдаст исключение.

Шаг 4: Выбор места для вызова кода установки параметра

Выбор места вызова кода для установки значения параметра является критически важным и зависит от логики вашей обработки. Рассмотрим наиболее распространенные сценарии, которые мы можем использовать.

  1. При создании формы на сервере (ПриСозданииНаСервере):

    Этот обработчик идеально подходит для первоначальной установки параметров при открытии формы. Например, если форма открывается с уже заданными параметрами, переданными ей при создании (через объект Параметры формы), или если необходимо установить значения по умолчанию для фильтрации.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Предполагаем, что Параметры.НачалоПериода и Параметры.КонецПериода
        // были переданы в форму при ее открытии как параметры запуска
        Если Параметры.Свойство("НачалоПериода") Тогда
            СписокДокументов.Параметры.УстановитьЗначениеПараметра("НачалоПериода", Параметры.НачалоПериода);
        КонецЕсли;
        Если Параметры.Свойство("КонецПериода") Тогда
            СписокДокументов.Параметры.УстановитьЗначениеПараметра("КонецПериода", Параметры.КонецПериода);
        КонецЕсли;
                
        // Установка значения из реквизита формы по умолчанию, если оно еще не задано
        Если ПолныхЛетДляФильтра = Неопределено Тогда
            ПолныхЛетДляФильтра = 18; // Например, по умолчанию от 18 лет
        КонецЕсли;
        СписокСотрудников.Параметры.УстановитьЗначениеПараметра("ПолныхЛет", ПолныхЛетДляФильтра);
                
        // После первоначальной установки параметров, динамический список может быть обновлен,
        // если это необходимо сразу после открытия формы.
        Элементы.СписокСотрудников.Обновить();
    КонецПроцедуры
    
  2. При изменении реквизита формы (ПриИзменении):

    Если значение параметра должно меняться динамически в зависимости от действий пользователя на форме (например, при изменении значения в поле ввода, которое привязано к реквизиту формы), то код установки параметра следует вызывать в обработчике события ПриИзменении соответствующего реквизита. Важно помнить, что изменение реквизитов формы часто происходит на клиенте, а методы работы с динамическим списком (такие как УстановитьЗначениеПараметра() и Обновить()) требуют серверного контекста.

    
    &НаКлиенте
    Процедура ПолныхЛетДляФильтраПриИзменении(Элемент)
        // Мы вызываем серверную процедуру для установки параметра и обновления списка
        УстановитьПараметрПолныхЛетНаСервере();
    КонецПроцедуры
    
    &НаСервере
    Процедура УстановитьПараметрПолныхЛетНаСервере()
        // Устанавливаем значение параметра динамического списка из реквизита формы
        СписокСотрудников.Параметры.УстановитьЗначениеПараметра("ПолныхЛет", ПолныхЛетДляФильтра);
        // После установки параметра ОБЯЗАТЕЛЬНО нужно обновить динамический список,
        // чтобы изменения вступили в силу и данные перечитались
        Элементы.СписокСотрудников.Обновить();
    КонецПроцедуры
    
  3. По кнопке или другом пользовательском действии:

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

    
    &НаКлиенте
    Процедура ПрименитьФильтрНажатие(Элемент)
        // Вызываем серверную процедуру для применения фильтра
        УстановитьФильтрСервер();
    КонецПроцедуры
    
    &НаСервере
    Процедура УстановитьФильтрСервер()
        // Устанавливаем параметр из реквизита формы
        СписокСотрудников.Параметры.УстановитьЗначениеПараметра("ПолныхЛет", ПолныхЛетДляФильтра);
        // Обновляем динамический список
        Элементы.СписокСотрудников.Обновить();
    КонецПроцедуры
    

Шаг 5: Обновление динамического списка после изменения параметра

Критически важно! После того как мы изменили значение параметра динамического списка с помощью метода УстановитьЗначениеПараметра(), сам список не обновится автоматически. Для того чтобы он перечитал данные с учетом нового значения параметра и отобразил актуальную информацию, необходимо принудительно вызвать метод Обновить() для элемента формы, который представляет динамический список.

Элементы.ИмяЭлементаДинамическогоСписка.Обновить();

Этот вызов должен выполняться на сервере, поскольку именно на сервере происходит перестроение запроса к базе данных. Поэтому, если ваш код установки параметра вызывается на клиенте (например, в обработчике ПриИзменении реквизита формы), убедитесь, что вызов Обновить() также происходит в серверной процедуре, как показано в примерах выше.

Без вызова Обновить() динамический список будет продолжать отображать старые данные, игнорируя только что установленное значение параметра, что может привести к путанице и некорректному поведению приложения.

Важные нюансы и дополнительные возможности

При работе с параметрами динамических списков мы можем столкнуться с некоторыми особенностями и использовать дополнительные возможности для упрощения разработки:

  1. Обработка ошибок: Если параметр с указанным именем (например, "ПолныхЛет") не определен в запросе динамического списка (то есть в запросе нет &ПолныхЛет), попытка установить его значение через УстановитьЗначениеПараметра() приведет к исключению. Это важно учитывать при разработке, чтобы избежать неожиданных ошибок в пользовательском режиме. Всегда перепроверяйте имена параметров на предмет опечаток и их наличие в запросе.

  2. Передача таблиц значений: Запросы в динамических списках, основанные на СКД, имеют определенные ограничения. Одним из них является невозможность напрямую передать таблицу значений в качестве параметра. Если вам требуется фильтровать данные по списку значений, который формируется динамически (например, список выбранных элементов, ИНН контрагентов и т.д.), вам придется искать обходные пути. Это может включать в себя формирование текста запроса динамически (что не всегда удобно или возможно), использование временных таблиц в запросе СКД (если схема компоновки данных позволяет их расширять) или, в крайнем случае, фильтрацию уже полученных данных на клиенте, что, однако, значительно менее эффективно для больших объемов и не рекомендуется.

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

  4. Использование БСП: При работе с типовыми конфигурациями, использующими Библиотеку Стандартных Подсистем (БСП), мы рекомендуем ознакомиться с ее функционалом. В БСП часто реализованы универсальные процедуры для работы с динамическими списками. В частности, может быть доступна процедура, такая как УстановитьПараметрДинамическогоСписка. Использование таких готовых функций значительно упрощает разработку, так как они уже содержат проверенную логику установки параметров, их использования и обновления списка, инкапсулируя детали реализации и сокращая количество написанного нами кода.

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

← На главную