Работа с динамическими списками в управляемых формах 1С — это стандартная задача, однако разработчики часто сталкиваются с ситуацией, когда форма открывается, но список остается абсолютно пустым. Особенно часто это происходит при использовании произвольных запросов с параметрами. В этой статье мы подробно разберем, почему это происходит, как правильно передавать параметры и какие «подводные камни» конфигуратора могут блокировать вывод данных.
Представим сценарий: у нас есть основная форма документа, из которой по кнопке должна открываться вспомогательная форма со списком периодов (например, подписок ИТС), отобранных по ссылке текущего документа. Рассмотрим типичный код, который используется для вызова такой формы. Проанализируем процедуру на стороне клиента:
&НаКлиенте
Процедура ЗаполнитьРеквизитыДиалог(Команда)
// Формируем структуру параметров для передачи в открываемую форму
ПараметрыЗапроса = Новый Структура("Ссылка", Объект.Ссылка);
// Открываем форму выбора (или вспомогательную форму)
// Можно использовать как ОткрытьФорму, так и ОткрытьФормуМодально (в старом коде)
ОткрытьФорму("Документ.рбсДоговор.Форма.ФормаВыбораИТС", ПараметрыЗапроса);
КонецПроцедуры
На стороне открываемой формы нам необходимо «поймать» этот параметр и передать его в сам динамический список. Посмотрим, как это реализуется в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли параметр "Ссылка"
Если Параметры.Свойство("Ссылка") Тогда
// Устанавливаем значение параметра в динамическом списке
// СписокПериодовИТС — это имя реквизита формы с типом ДинамическийСписок
СписокПериодовИТС.Параметры.УстановитьЗначениеПараметра("Ссылка", Параметры.Ссылка);
КонецЕсли;
КонецПроцедуры
Важно помнить, что если в самом запросе динамического списка параметр &Ссылка не объявлен, метод УстановитьЗначениеПараметра может не сработать или не дать результата. Проанализируем пример корректного запроса для списка:
ВЫБРАТЬ
рбсДоговорПодпискаИТС.ДатаНачала,
рбсДоговорПодпискаИТС.ДатаОкончания
ИЗ
Документ.рбсДоговор.ПодпискаИТС КАК рбсДоговорПодпискаИТС
ГДЕ
рбсДоговорПодпискаИТС.Ссылка = &Ссылка
Как показывает практика, даже при идеально написанном коде данные могут не отображаться. Выясним неочевидную причину, связанную с поведением платформы 1С при настройке реквизита формы. Рассмотрим критически важную последовательность действий:
Решение: Попробуйте пересоздать реквизит формы или очистить его настройки. Правильный алгоритм: сначала устанавливаем галочку Произвольный запрос, а уже затем открываем конструктор и пишем текст запроса. Это гарантирует, что метаданные списка обновятся корректно.
Если программная часть работает (параметр устанавливается, отладчик заходит в процедуру ПриСозданииНаСервере), но данных все равно нет, проанализируем настройки самой формы. Платформа 1С сохраняет пользовательские настройки форм в системном хранилище. Для анализа и сброса сохраненных параметров пригодится обработка для просмотра и очистки хранилища настроек пользователей.
Разберем, что стоит проверить:
Ссылка со значением ПустаяСсылка. Выясним это, проверив вкладку Отбор в окне настройки списка.Иногда разработчикам кажется, что процедура ПриСозданииНаСервере не выполняется, потому что «точка останова не срабатывает». Рассмотрим причины этого:
-debug.Сообщить() для быстрой проверки: если сообщение "Сервер работает" вывелось, значит, проблема не в вызове процедуры, а в логике внутри неё.Чтобы динамический список всегда работал предсказуемо, проанализируем еще несколько важных моментов:
Основная таблица: Даже в произвольном запросе крайне рекомендуется указывать Основную таблицу в настройках динамического списка (если запрос выбирает данные преимущественно из одной таблицы). Это позволяет платформе автоматически определять ключевые поля и корректно управлять обновлением данных.
Ключевые поля: Если Основная таблица не указана, обязательно перейдите в конструкторе запроса на закладку Прочее и установите флаги Ключевые поля для уникальных идентификаторов (например, для поля Ссылка или номера строки табличной части). Без этого динамический список может отображать данные некорректно или быть пустым.
Использовать всегда: Если вы используете какой-то параметр или поле для программной обработки, но не выводите его в колонки списка на форме, убедитесь, что для этого поля в настройках списка (вкладка «Выбранные поля») установлена галочка Использовать всегда. В противном случае платформа может исключить это поле из SQL-запроса в целях оптимизации, и ваш отбор не сработает.
Таким образом, решение проблемы чаще всего кроется либо в очистке настроек динамического списка и его пересоздании с правильной последовательностью шагов, либо в проверке пользовательских отборов, которые перекрывают программную установку параметров. Для более глубокого понимания работы с отборами и параметрами подойдёт руководство по системе настроек динамического списка.