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