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