К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как добавить запрос в форму 1С

Разбираем, как добавить запрос в форму 1С: динамический список с произвольным запросом, временные таблицы, программное заполнение и типичные ошибки разработчика.

Запрос в форме 1С нужен, когда стандартного отображения данных недостаточно: требуется показать данные из нескольких таблиц, отфильтровать записи по сложному условию или вывести рассчитанные показатели прямо в списке. В управляемых формах основным инструментом для этого служит динамический список с произвольным запросом, а в более сложных сценариях — программное выполнение запроса с выводом результата в таблицу значений.

Способ добавления запроса зависит от задачи. Если нужно изменить состав данных в списке документов или справочника — достаточно настроить произвольный запрос динамического списка в конфигураторе. Если данные собираются из разных источников, требуют группировок или временных таблиц — запрос выполняется программно в модуле формы. Оба подхода имеют свои ограничения, и выбор неправильного варианта приводит к потере стандартных возможностей: сортировки, поиска, динамического обновления.

Материал рассчитан на разработчиков и внедренцев, работающих в конфигураторе 1С:Предприятие 8.3 с управляемыми формами. Все действия выполняются в тестовой копии базы или через механизм расширений, чтобы не нарушить поддержку типовой конфигурации.

Какие способы добавить запрос в форму существуют

Прежде чем открывать конфигуратор, определите, какой из трёх сценариев соответствует вашей задаче. Первый — произвольный запрос динамического списка: данные отображаются в стандартной таблице формы, пользователь может сортировать, искать и открывать объекты. Второй — программный запрос с выгрузкой в таблицу значений: полный контроль над логикой, но без автоматического обновления. Третий — запрос внутри обработчика события формы, например при открытии, когда результат нужен для заполнения отдельных реквизитов, а не таблицы.

Сравнение вариантов

Произвольный запрос динамического списка

Подходит для списков с фильтрацией и соединениями таблиц. Ограничение: нельзя использовать временные таблицы и пакетные запросы, теряется часть стандартных команд.

Программный запрос в таблицу значений

Подходит для сложной логики, временных таблиц, группировок. Ограничение: нет динамического обновления, сортировку и поиск нужно реализовывать вручную.

Запрос в обработчике для реквизитов формы

Подходит для вычисления итогов, остатков, подсказок при открытии. Ограничение: не предназначен для отображения табличных данных.

Динамический список предпочтителен, когда результат должен «вести себя» как обычный список: обновляться при изменении данных, поддерживать переход к объекту двойным щелчком и стандартные команды. Программный запрос выбирайте, когда текст запроса содержит конструкции, недопустимые в динамическом списке, или когда данные нужно предварительно обработать кодом.

Как добавить произвольный запрос в динамический список формы

Откройте конфигуратор, найдите нужную форму списка (например, форму списка документа) и откройте её на редактирование. В дереве реквизитов формы найдите основной реквизит — обычно он называется «Список» и имеет тип «ДинамическийСписок». Вызовите палитру свойств этого реквизита.

В свойствах установите флаг «Произвольный запрос». После этого станет активной строка «Настройка списка» — нажмите «Открыть». На вкладке «Запрос» введите текст запроса на встроенном языке запросов 1С. Обязательно укажите в свойстве «Основная таблица» таблицу, из которой выбираются ссылки на объекты, — иначе форма потеряет возможность открывать, создавать и копировать элементы.

Порядок действий
  1. 1
    Откройте форму списка в конфигураторе и найдите реквизит «Список» типа «ДинамическийСписок».
  2. 2
    В свойствах установите флаг «Произвольный запрос».
  3. 3
    Откройте «Настройка списка» и введите текст запроса на вкладке «Запрос».
  4. 4
    Укажите основную таблицу, чтобы сохранить стандартные команды работы с объектами.
  5. 5
    Проверьте поле «Динамическое считывание данных» — для больших таблиц оно должно быть включено.
  6. 6
    Сохраните форму, обновите конфигурацию базы данных и откройте список в режиме предприятия.

Пример запроса, выводящего документы реализации с именем контрагента из шапки:

ВЫБРАТЬ

РеализацияТоваровУслуг.Ссылка КАК Ссылка,

РеализацияТоваровУслуг.Номер КАК Номер,

РеализацияТоваровУслуг.Дата КАК Дата,

РеализацияТоваровУслуг.Контрагент.Наименование КАК Контрагент

ИЗ

Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

Имена документов и реквизитов в вашей конфигурации могут отличаться — сверяйте их с деревом метаданных. После сохранения откройте форму в режиме предприятия и убедитесь, что список заполняется, сортировка по колонкам работает, а двойной щелчок открывает документ.

Как выполнить запрос программно и вывести результат в таблицу формы

Когда возможностей динамического списка не хватает — нужны временные таблицы, пакетные запросы, объединения с последующей обработкой — запрос выполняется кодом. Для этого в форму добавляют реквизит типа «ТаблицаЗначений» с нужными колонками, перетаскивают его в дерево элементов формы и заполняют программно.

Типовая логика размещается в обработчике ПриСозданииНаСервере или в отдельной серверной процедуре, вызываемой по кнопке. Запрос создаётся объектом Запрос, параметры передаются через УстановитьПараметр, результат выгружается методом Выгрузить() и загружается в реквизит формы.

&НаСервере

Процедура ЗаполнитьТаблицуОстатков()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.Номенклатура КАК Номенклатура,

| Остатки.КоличествоОстаток КАК Остаток

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остатки";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

ТаблицаОстатков.Загрузить(Запрос.Выполнить().Выгрузить());

КонецПроцедуры

Колонки реквизита «ТаблицаЗначений» должны совпадать по именам с полями результата запроса — иначе загрузка пройдёт с пустыми значениями. Если состав колонок заранее неизвестен, таблицу придётся формировать полностью программно через ИзменитьРеквизиты, что заметно сложнее.

Как передать параметры и отборы в запрос формы

Произвольный запрос динамического списка почти всегда требует параметров: текущая организация, выбранный период, склад. Параметры объявляются прямо в тексте запроса через символ &, а их значения устанавливаются программно через свойство Параметры динамического списка, например в обработчике ПриСозданииНаСервере:

Список.Параметры.УстановитьЗначениеПараметра("Организация", ОтборОрганизация);

Для отборов, которые пользователь меняет сам, лучше использовать не параметры, а элементы отбора динамического списка: Список.Отбор.Элементы. Отбор не требует переписывания запроса и корректно работает с динамическим считыванием. Параметры же уместны для виртуальных таблиц регистров, где условие задаётся в скобках таблицы, а не в секции ГДЕ.

Частая ситуация: после добавления произвольного запроса список стал медленным. Причина обычно в соединениях с виртуальными таблицами без отбора или в отключённом динамическом считывании. Сначала проверьте план запроса в консоли, а уже потом переписывайте логику.
ПЗ
Практическое замечание

Как проверить, что запрос в форме работает правильно

После настройки проверьте форму в режиме предприятия по нескольким контрольным точкам. Убедитесь, что список не пуст при наличии данных в базе, что сортировка по колонкам не вызывает ошибок, а поиск по строке находит записи. Для динамического списка дополнительно проверьте стандартные команды: создание, копирование, пометку удаления и открытие объекта.

Контрольные точки

Как проверить результат

Открытие формы
Норма

Список заполняется данными без сообщений об ошибках

Тревожный признак

Ошибка «Поле не найдено» или пустой список при наличии данных

Двойной щелчок по строке
Норма

Открывается форма объекта (документа, элемента)

Тревожный признак

Ничего не происходит — не указана основная таблица

Сортировка и поиск
Норма

Колонки сортируются, поиск находит записи

Тревожный признак

Ошибка при сортировке по вычисляемому полю

Изменение данных
Норма

После записи объекта список обновляется автоматически

Тревожный признак

Данные устарели — для таблицы значений нужен программный вызов обновления

Если запрос возвращает не те данные, отладьте его отдельно в консоли запросов (внешней обработке или встроенной в некоторые конфигурации), подставив те же параметры. Это быстрее, чем многократное редактирование формы и перезапуск сеанса.

Типичные ошибки при добавлении запроса в форму

Типичные ошибки
01
Не указана основная таблица динамического списка — пропадают команды создания, копирования и открытия объектов.
02
Использование временных таблиц (ПОМЕСТИТЬ) в произвольном запросе динамического списка — динамический список их не поддерживает, нужна программная схема.
03
Несовпадение псевдонимов полей запроса с именами колонок таблицы значений — таблица выводится пустой.
04
Обращение к реквизиту формы на клиенте, когда запрос выполняется только на сервере — ошибка вызова; запросы выполняются в серверных процедурах.
05
Параметр не установлен перед выводом списка — ошибка «Параметр не найден» при открытии формы.
06
Снятие типовой формы с поддержки вместо использования расширения — конфликты при обновлении конфигурации.

Отдельно выделим ошибку производительности: запрос с соединением нескольких больших таблиц без индексированных условий может «подвесить» открытие формы на десятки секунд. Для крупных баз тестируйте запрос на реальном объёме данных и ограничивайте выборку периодом или отбором по умолчанию.

Часто задаваемые вопросы

Можно ли использовать временные таблицы в запросе динамического списка?

Нет. Произвольный запрос динамического списка должен состоять из одного запроса без конструкции ПОМЕСТИТЬ. Если временные таблицы необходимы, выполняйте запрос программно объектом «Запрос» с менеджером временных таблиц и выводите результат в таблицу значений формы.

Почему после добавления произвольного запроса перестала работать кнопка «Создать»?

Наиболее вероятная причина — не заполнено свойство «Основная таблица» динамического списка. Укажите таблицу, из которой выбираются ссылки, и стандартные команды вернутся. Если основная таблица указана, но команда всё равно недоступна, проверьте, не снят ли флаг у соответствующей стандартной команды в командном интерфейсе формы.

Как обновить данные в таблице значений после изменения документа?

Таблица значений не обновляется автоматически. Добавьте обработчик оповещения формы (ОбработкаОповещения) и при получении события записи объекта повторно вызывайте серверную процедуру заполнения таблицы. Альтернатива — кнопка «Обновить» для пользователя.

Можно ли добавить запрос в форму, не меняя конфигурацию?

Да, через расширение конфигурации: заимствуйте форму в расширение и настройте произвольный запрос там. Это сохраняет типовую конфигурацию на поддержке и упрощает обновления. Полностью без изменений обойтись нельзя — настройка запроса требует доработки формы хотя бы в расширении.

Где писать код запроса: на клиенте или на сервере?

Только на сервере. В управляемых формах объект «Запрос» недоступен в клиентском контексте. Размещайте выполнение запроса в процедурах с директивой &НаСервере, а из клиентских обработчиков вызывайте их через серверные вызовы.

Итог

Что важно запомнить

Для списков используйте произвольный запрос динамического списка с указанной основной таблицей, для сложной логики — программный запрос с выгрузкой в таблицу значений. Изменения вносите через расширение, параметры передавайте явно, а результат проверяйте в режиме предприятия по стандартным командам и скорости открытия формы.