Как установить параметр или изменить текст запроса динамического списка, если возникает ошибка «Параметр не найден»?

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

При работе с динамическими списками в управляемых формах 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда добавленный в запрос параметр или новое поле отказываются работать. Вы вроде бы отредактировали запрос в конструкторе на форме, добавили параметр &Родитель, но при попытке установить его значение в коде система выдает ошибку: «Параметр с указанным именем не найден». Особенно часто это случается в типовых конфигурациях, таких как УТ 11, ERP 2 или Комплексная автоматизация.

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

Выясняем причину: почему параметр «исчезает»?

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

Однако в типовых решениях текст запроса динамического списка — это не статичная строка. Проанализируем механизм работы формы: в процедуре ПриСозданииНаСервере или сопутствующих ей общих модулях система часто пересобирает ТекстЗапроса заново. Это делается для учета функциональных опций, прав доступа (RLS) или настроек конкретного пользователя. В итоге ваш «ручной» запрос, написанный в конфигураторе, просто затирается программным кодом системы.

Важный совет: Если вы столкнулись с ошибкой отсутствия параметра, первым делом проверьте в отладчике фактическое содержимое свойства Список.ТекстЗапроса непосредственно перед моментом установки параметра. Скорее всего, вы увидите там типовой запрос без ваших правок.

Решение 1: Правильная установка параметров через БСП

Если текст запроса на месте, но ошибка сохраняется, или вы хотите написать более отказоустойчивый код, рекомендуется использовать инструменты Библиотеки стандартных подсистем (БСП). Вместо прямого обращения к коллекции Параметры, воспользуемся методом общего модуля.

Рассмотрим пример кода:


&НаСервере
Процедура УстановитьПараметрыСписка()
    
    СсылкаНаСклад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
    
    // Используем безопасный метод БСП
    ОбщегоНазначенияКлиентСервер.УстановитьПараметрДинамическогоСписка(
        Список, 
        "Родитель", 
        СсылкаНаСклад
    );
    
КонецПроцедуры

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

Решение 2: Программное изменение текста запроса

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

Разберем по шагам, как это сделать:

  1. Получаем текущий текст запроса из динамического списка.
  2. Модифицируем его, добавляя нужные поля ВЫБОР... КАК Колво и соединения ЛЕВОЕ СОЕДИНЕНИЕ.
  3. Устанавливаем измененный текст обратно в свойство ТекстЗапроса.
  4. Устанавливаем значения новых параметров.

Пример реализации программной вставки:


&НаСервере
Процедура МодифицироватьЗапросСписка()
    
    ТекущийТекст = Список.ТекстЗапроса;
    
    // Добавляем выборку остатков (упрощенный пример)
    // В реальной задаче лучше использовать замену через СтрЗаменить или конструктор запроса
    НовыйТекст = 
    "ВЫБРАТЬ
    |   СпрНоменклатура.*,
    |   ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0) КАК Колво
    |ИЗ
    |   Справочник.Номенклатура КАК СпрНоменклатура
    |   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад.Родитель = &Родитель) КАК ТоварыНаСкладах
    |   ПО ТоварыНаСкладах.Номенклатура = СпрНоменклатура.Ссылка";
    
    Список.ТекстЗапроса = НовыйТекст;
    
    // Теперь параметр точно будет найден
    Список.Параметры.УстановитьЗначениеПараметра("Родитель", НужныйРодительСклада);
    
КонецПроцедуры

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

Почему колонка «Колво» может не появиться на форме?

Даже если запрос отработал успешно, вы можете не увидеть новую колонку в режиме «1С:Предприятие». Проанализируем типичные ошибки:

  1. Связь с данными: Убедитесь, что у элемента формы (колонки таблицы) в свойстве ПутьКДанным указано именно Список.Колво. Простого совпадения имен недостаточно.
  2. Пользовательские настройки: Платформа запоминает состояние формы. Если вы добавили колонку позже, она может быть скрыта в настройках списка у пользователя. Попробуйте нажать «Еще — Установить стандартные настройки».
  3. Основная таблица: Проверьте, установлена ли у динамического списка Основная таблица (например, Справочник.Номенклатура). Если в запросе много соединений и группировок, и основная таблица не указана, платформа может не понять, как отображать данные, и функционал списка (картинки, стандартные команды) будет ограничен.

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

Использование виртуальных таблиц остатков непосредственно в динамическом списке — ресурсоемкая операция. Рассмотрим несколько правил, чтобы ваш список не «тормозил»:

1. Ограничение выборки: Старайтесь всегда накладывать фильтры внутри параметров виртуальной таблицы .Остатки(&Период, &Условие), а не в общем блоке ГДЕ. Это значительно ускоряет получение данных БД.

2. Использование механизмов БСП: В современных версиях 1С для показа остатков в списках часто используют фоновое получение данных или специальные панели (как панель «Остатки и доступность» в УТ 11). Это позволяет основному списку открываться мгновенно, пока остатки подгружаются отдельно.

3. Группировки: Если ваш запрос содержит СГРУППИРОВАТЬ ПО, убедитесь, что все поля, по которым идет группировка, индексированы. Динамический список с группировками всегда работает медленнее, чем простой выбор из таблицы.

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

← На главную