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

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

При работе с расширениями в типовых конфигурациях 1С (таких как «Управление торговлей 11», «ERP Управление предприятием» или «Комплексная автоматизация») разработчики часто сталкиваются с загадочным поведением динамических списков. Самая распространенная ситуация: вы переносите форму или запрос из основной конфигурации в расширение, всё отлично работает у большинства пользователей, но у некоторых внезапно возникает критическая ошибка: «Параметр не установлен (&СтрокаНайдено)» (или аналогичные ошибки с параметрами &СтрокаСопоставить, &СтатусыНайдено).

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

Выясняем причину: механизм динамической подмены запросов в БЭД

В современных конфигурациях 1С активно используется Библиотека электронных документов (БЭД) и, в частности, подсистема интеграции с сервисом 1С:Номенклатура. Запросы динамических списков в таких формах, как список номенклатуры или формы сопоставления, не являются статическими. Разработчики фирмы «1С» внедряют в текст запроса специальные технологические комментарии-маркеры.

Выглядят они следующим образом:


// ЭлектронноеВзаимодействие.РаботаСНоменклатурой.
...
// Конец ЭлектронноеВзаимодействие.РаботаСНоменклатурой.

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

Откуда ошибка берется в расширениях?

Рассмотрим типичный сценарий: сторонний разработчик создает расширение и заимствует форму списка номенклатуры. Скорее всего, текст запроса копировался непосредственно из отладчика или конфигуратора в тот момент, когда в тестовой базе была активна интеграция с «1С:Номенклатура». При этом динамически измененный запрос со всеми параметрами (такими как &СтрокаНайдено) зафиксировался в расширении как статический текст.

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

Все дело в проверке прав доступа и функциональных опций. В общем модуле перед установкой параметров запроса всегда стоит условие:


Если РаботаСНоменклатурой.ДоступнаФункциональностьПодсистемы() Тогда
    // Здесь устанавливаются параметры: СтрокаНайдено, СтрокаСопоставить и т.д.
КонецЕсли;

Если у конкретного пользователя:

  1. Отсутствуют роли, связанные с сервисом «1С:Номенклатура» (например, при наличии только базовых прав или профиля «Продавец»).
  2. Отключена функциональная опция использования сервиса (индивидуально или по организации через RLS).

В этом случае условие возвращает Ложь. Программа игнорирует блок установки параметров. Но так как в расширении запрос жестко требует эти параметры, платформа выдает ошибку.

---

Как локализовать проблему с помощью отладки?

Если вы столкнулись с подобным поведением, проведем диагностику по шагам:

  1. Запустите сеанс под пользователем, у которого форма открывается без ошибок.
  2. Установите точку останова в модуле формы ПриСозданииНаСервере перед выполнением запроса.
  3. Выполните замер производительности или трассировку (как советуют опытные специалисты на форумах).
  4. Найдите место в общем модуле, где вызывается метод УстановитьЗначениеПараметра для искомых переменных. Вы увидите код, аналогичный следующему:

ПараметрыЗапроса.УстановитьЗначениеПараметра("СтрокаНайдено", NStr("ru = 'Найдено'") + ": ");
ПараметрыЗапроса.УстановитьЗначениеПараметра("СтрокаНайденыВарианты", NStr("ru = 'Найдены варианты'"));

---

Способ решения №1: Очистка текста запроса (Правильный путь)

Для того чтобы система работала корректно и динамически подстраивалась под права каждого пользователя, нам нужно вернуть запрос динамического списка к первоначальному «чистому» виду.

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


// ЭлектронноеВзаимодействие.РаботаСНоменклатурой.
// Здесь не должно быть физического кода связи с регистром сопоставления в тексте расширения!
// Конец ЭлектронноеВзаимодействие.РаботаСНоменклатурой.

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

---

Способ решения №2: Принудительная инициализация параметров (Быстрый обходной путь)

Если по какой-то причине вы не можете или не хотите переписывать текст запроса в расширении (например, логика расширения жестко завязана на эти поля), можно применить программную инициализацию «заглушек».

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


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие параметров в схеме запроса, чтобы избежать ошибок инициализации
    ПараметрыСписка = Список.Параметры;
    
    // Принудительно заполняем параметры дефолтными значениями для пользователей без прав
    ПараметрыСписка.УстановитьЗначениеПараметра("СтрокаНайдено", НСтр("ru = 'Найдено'") + ": ");
    ПараметрыСписка.УстановитьЗначениеПараметра("СтрокаСопоставить", НСтр("ru = 'Сопоставить'"));
    
    // Для списков и массивов передаем пустые коллекции, чтобы запрос не падал
    ПараметрыСписка.УстановитьЗначениеПараметра("СтатусыНайдено", Новый Массив); 
    
КонецПроцедуры

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

Резюме

При работе с заимствованными формами всегда обращайте внимание на динамически изменяемые запросы. Избегайте «грязного» копирования кода из отладчика. Использование чистого кода с комментариями-маркерами БЭД — залог стабильной работы конфигурации при любых обновлениях и любых настройках прав пользователей.

← На главную