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