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