При работе с расширениями в типовых конфигурациях 1С (таких как «Управление торговлей 11», «ERP Управление предприятием» или «Комплексная автоматизация») разработчики часто сталкиваются с загадочным поведением динамических списков. Самая распространенная ситуация: вы переносите форму или запрос из основной конфигурации в расширение, всё отлично работает у большинства пользователей, но у некоторых внезапно возникает критическая ошибка: «Параметр не установлен (&СтрокаНайдено)» (или аналогичные ошибки с параметрами &СтрокаСопоставить, &СтатусыНайдено).
В этой статье мы подробно разберем, почему возникает эта проблема, как работает механизм динамического изменения запросов платформой и как правильно её устранить, сохранив стабильность системы для всех пользователей.
В современных конфигурациях 1С активно используется Библиотека электронных документов (БЭД) и, в частности, подсистема интеграции с сервисом 1С:Номенклатура. Запросы динамических списков в таких формах, как список номенклатуры или формы сопоставления, не являются статическими. Разработчики фирмы «1С» внедряют в текст запроса специальные технологические комментарии-маркеры.
Выглядят они следующим образом:
// ЭлектронноеВзаимодействие.РаботаСНоменклатурой.
...
// Конец ЭлектронноеВзаимодействие.РаботаСНоменклатурой.
Когда пользователь открывает форму, на сервере срабатывает стандартный механизм БЭД (например, в общем модуле РаботаСНоменклатурой). Этот механизм на лету анализирует текст запроса динамического списка. Если в базе включена интеграция с сервисом «1С:Номенклатура», программа автоматически заменяет блок комментариев на реальный код связи с регистром сведений СоответствиеНоменклатурыРаботаСНоменклатурой. Одновременно с этим в параметры динамического списка программно передаются значения:
&СтрокаНайдено&СтрокаСопоставить&СтатусыНайденоРассмотрим типичный сценарий: сторонний разработчик создает расширение и заимствует форму списка номенклатуры. Скорее всего, текст запроса копировался непосредственно из отладчика или конфигуратора в тот момент, когда в тестовой базе была активна интеграция с «1С:Номенклатура». При этом динамически измененный запрос со всеми параметрами (такими как &СтрокаНайдено) зафиксировался в расширении как статический текст.
Поскольку параметры теперь прописаны в тексте запроса жестко, платформа обязана их инициализировать перед выполнением. Но почему же тогда ошибка возникает только у некоторых пользователей?
Все дело в проверке прав доступа и функциональных опций. В общем модуле перед установкой параметров запроса всегда стоит условие:
Если РаботаСНоменклатурой.ДоступнаФункциональностьПодсистемы() Тогда
// Здесь устанавливаются параметры: СтрокаНайдено, СтрокаСопоставить и т.д.
КонецЕсли;
Если у конкретного пользователя:
В этом случае условие возвращает Ложь. Программа игнорирует блок установки параметров. Но так как в расширении запрос жестко требует эти параметры, платформа выдает ошибку.
---
Если вы столкнулись с подобным поведением, проведем диагностику по шагам:
ПриСозданииНаСервере перед выполнением запроса.УстановитьЗначениеПараметра для искомых переменных. Вы увидите код, аналогичный следующему:
ПараметрыЗапроса.УстановитьЗначениеПараметра("СтрокаНайдено", NStr("ru = 'Найдено'") + ": ");
ПараметрыЗапроса.УстановитьЗначениеПараметра("СтрокаНайденыВарианты", NStr("ru = 'Найдены варианты'"));
---
Для того чтобы система работала корректно и динамически подстраивалась под права каждого пользователя, нам нужно вернуть запрос динамического списка к первоначальному «чистому» виду.
Проанализируем запрос в расширении. Вместо жестко прописанных конструкций связи с регистром соответствия номенклатуры, верните стандартные комментарии-маркеры:
// ЭлектронноеВзаимодействие.РаботаСНоменклатурой.
// Здесь не должно быть физического кода связи с регистром сопоставления в тексте расширения!
// Конец ЭлектронноеВзаимодействие.РаботаСНоменклатурой.
При таком подходе платформа сама решит, нужно ли модифицировать запрос для конкретного пользователя. Если у пользователя есть права на «1С:Номенклатуру», платформа динамически добавит код и установит параметры. Если прав нет — запрос останется чистым, и параметры не потребуются.
---
Если по какой-то причине вы не можете или не хотите переписывать текст запроса в расширении (например, логика расширения жестко завязана на эти поля), можно применить программную инициализацию «заглушек».
Для этого в модуле формы расширения найдем процедуру ПриСозданииНаСервере и добавим принудительную установку параметров в самом конце процедуры (после вызова стандартных обработчиков):
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Проверяем наличие параметров в схеме запроса, чтобы избежать ошибок инициализации
ПараметрыСписка = Список.Параметры;
// Принудительно заполняем параметры дефолтными значениями для пользователей без прав
ПараметрыСписка.УстановитьЗначениеПараметра("СтрокаНайдено", НСтр("ru = 'Найдено'") + ": ");
ПараметрыСписка.УстановитьЗначениеПараметра("СтрокаСопоставить", НСтр("ru = 'Сопоставить'"));
// Для списков и массивов передаем пустые коллекции, чтобы запрос не падал
ПараметрыСписка.УстановитьЗначениеПараметра("СтатусыНайдено", Новый Массив);
КонецПроцедуры
Важно: Передавая пустой массив в &СтатусыНайдено, мы гарантируем, что у пользователей без прав этот фильтр просто не вернет никаких данных, но сам запрос отработает корректно и без ошибок.
При работе с заимствованными формами всегда обращайте внимание на динамически изменяемые запросы. Избегайте «грязного» копирования кода из отладчика. Использование чистого кода с комментариями-маркерами БЭД — залог стабильной работы конфигурации при любых обновлениях и любых настройках прав пользователей.