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

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

Как сообщить результат запроса в 1С

Как вывести результат запроса в 1С: метод Сообщить, объект СообщениеПользователю, обход выборки, привязка к полям формы, типичные ошибки и проверка результата.

Вывести результат запроса пользователю — типовая задача при отладке и разработке в 1С. Чаще всего для этого используют метод Сообщить() или объект СообщениеПользователю, обходя выборку из результата запроса в цикле. Выбор способа зависит от того, где выполняется код: на клиенте, на сервере, в фоновом задании или в обработчике проведения документа.

Метод Сообщить() прост, но имеет ограничения: он выводит текст в панель сообщений без привязки к объекту и полю формы, а в фоновом задании его вывод теряется без специальной обработки. Объект СообщениеПользователю решает эти проблемы: сообщение можно привязать к данным объекта, указать поле формы и управлять тем, попадёт ли сообщение пользователю после серверного вызова.

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

Как построить запрос и получить выборку

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

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Товар,

| Номенклатура.Код КАК Код

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.ЭтоГруппа = ЛОЖЬ";

РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Строка(Выборка.Код) + " — " + Выборка.Товар);

КонецЦикла;

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

Перед обходом полезно проверить, не пуст ли результат: Если РезультатЗапроса.Пустой() Тогда ... КонецЕсли;. Это позволяет сообщить пользователю понятное «данные не найдены» вместо молчаливого отсутствия вывода.

Вывод результата методом Сообщить

Метод Сообщить() — самый быстрый способ показать текст. Он принимает строку и необязательный параметр СтатусСообщения (Обычное, Информация, Внимание, Важное, ОченьВажное), который влияет на оформление сообщения в панели.

Пока Выборка.Следующий() Цикл

ТекстСообщения = СтрШаблон("Товар: %1, остаток: %2",

Выборка.Товар, Выборка.Остаток);

Сообщить(ТекстСообщения, СтатусСообщения.Информация);

КонецЦикла;

Для формирования строки удобнее использовать СтрШаблон(), чем конкатенацию: шаблон читается легче, а подстановка параметров снижает риск ошибок при преобразовании типов. Функция автоматически приводит значения к строке.

Ограничения метода: сообщение не привязано к полю формы, его нельзя отменить при откате транзакции, а в некоторых контекстах (веб-клиент с определёнными настройками, фоновые задания) вывод может не дойти до пользователя. Поэтому Сообщить() уместен для отладки и простых обработок, но не для штатных проверок в документах.

Вывод результата через СообщениеПользователю

Объект СообщениеПользователю — штатный механизм прикладных решений. Он позволяет задать текст, привязать сообщение к объекту данных (КлючДанных), указать поле формы (Поле) и путь к данным (ПутьКДанным), а также управлять идентификатором назначения.

Пока Выборка.Следующий() Цикл

Сообщение = Новый СообщениеПользователю;

Сообщение.Текст = СтрШаблон("По товару ""%1"" остаток ниже минимального",

Выборка.Товар);

Сообщение.КлючДанных = Выборка.Ссылка;

Сообщение.Сообщить();

КонецЦикла;

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

Привязка сообщения к полю формы

Для привязки к табличной части используется свойство Поле с указанием имени колонки и строки, например через УстановитьДанные() или заполнение ПутьКДанным. В типовых механизмах проверки заполнения платформа делает это автоматически при вызове исключения в обработчике ОбработкаПроверкиЗаполнения.

Порядок вывода результата запроса
  1. 1
    Создайте объект Запрос и задайте текст с параметрами
  2. 2
    Выполните запрос и проверьте результат через Пустой()
  3. 3
    Получите выборку методом Выбрать() или таблицу методом Выгрузить()
  4. 4
    В цикле сформируйте текст через СтрШаблон()
  5. 5
    Выведите текст через Сообщить() или СообщениеПользователю.Сообщить()
  6. 6
    Проверьте, что сообщения появились в панели сообщений

Вывод результата из фонового задания

Фоновое задание не имеет прямого доступа к интерфейсу пользователя, поэтому сообщения внутри него накапливаются, но не показываются автоматически. Чтобы передать их пользователю, после завершения задания вызывают метод ПолучитьСообщенияПользователю() у объекта фонового задания и повторно выводят полученные сообщения в сеансе пользователя.

ФоновоеЗадание = ФоновыеЗадания.Выполнить("Обработки.Загрузка.ВыполнитьЗагрузку",

ПараметрыЗадания, Ключ, "Загрузка данных");

ФоновоеЗадание.ОжидатьЗавершенияВыполнения();

Для Каждого Сообщение Из ФоновоеЗадание.ПолучитьСообщенияПользователю() Цикл

Сообщение.Сообщить();

КонецЦикла;

Альтернатива — записывать результат в регистр сведений, протокол обмена или возвращать его через ДлительныеОперации из БСП, где механизм передачи сообщений уже реализован. Это надёжнее ручной сборки, особенно при длительных операциях с индикатором прогресса.

Альтернативы: табличный документ, таблица значений, консоль

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

Способы показать результат запроса

Сообщить()

Быстрый отладочный вывод и короткие уведомления. Не привязан к форме, теряется в фоне.

СообщениеПользователю

Штатные проверки и предупреждения с привязкой к объекту и полю формы. Не подходит для массового вывода.

Табличный документ (Выгрузить + макет)

Просмотр и печать больших выборок. Требует построения макета или построителя отчёта.

Таблица значений на форме

Интерактивный просмотр и отбор строк. Нужна форма с реквизитом типа ТаблицаЗначений.

Консоль запросов / СКД

Интерактивный анализ без написания кода вывода. Требует внешней обработки или отчёта.

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

Типичные ошибки при выводе результата

Типичные ошибки
01
Обход результата без вызова Выбрать() или Выгрузить() — обращение к полям результата напрямую приводит к ошибке, так как у объекта РезультатЗапроса нет полей выборки
02
Использование Сообщить() в фоновом задании без ПолучитьСообщенияПользователю() — пользователь не видит ни одного сообщения и считает, что операция зависла
03
Вывод в цикле тысяч строк — панель сообщений переполняется, сеанс тормозит, смысл вывода теряется
04
Конкатенация строк вместо СтрШаблон() — ошибки преобразования типов и нечитаемый код
05
Отсутствие проверки Пустой() — при пустом результате пользователь не получает никакой реакции и не понимает, выполнился ли запрос
06
Вызов Сообщить() внутри транзакции с последующим откатом — сообщения о «выполненных» действиях остаются, хотя данные не записаны

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

Как проверить, что сообщение дошло до пользователя

После внедрения вывода стоит убедиться, что сообщения действительно видны в целевом сценарии: интерактивный вызов, серверный вызов из формы, фоновое задание, регламентное задание. В регламентных заданиях сообщения пользователю не доставляются вовсе — там результат фиксируют в журнале регистрации через ЗаписьЖурналаРегистрации().

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

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

Панель сообщений после выполнения
Норма

Видны все сформированные строки в правильном порядке

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

Сообщений нет или видна только часть — проверьте контекст выполнения и фоновый режим

Текст сообщений
Норма

Значения полей подставлены корректно, без «Неопределено» и пустых строк

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

В тексте пустые места — поля выборки не заполнены или запрос вернул NULL

Привязка к форме
Норма

Сообщение отображается у нужного реквизита, клик активирует поле

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

Сообщение только в общей панели — не заполнены Поле и ПутьКДанным

Фоновое задание
Норма

После завершения сообщения выведены в сеансе пользователя

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

Сообщения потеряны — не вызван ПолучитьСообщенияПользователю()

Для отладки полезно временно выводить количество строк выборки: Сообщить("Найдено строк: " + Выборка.Количество()). Это сразу показывает, сработал ли запрос, и отделяет проблему запроса от проблемы вывода.

FAQ

Чем Сообщить() отличается от СообщениеПользователю?

Сообщить() — простой метод вывода строки в панель сообщений без привязки к данным. СообщениеПользователю — объект с расширенными возможностями: привязка к объекту (КлючДанных), полю формы, управление доставкой с сервера на клиент. В прикладном коде документов и проверок рекомендуется второй вариант.

Почему сообщения не видны при выполнении кода на сервере?

Метод Сообщить() на сервере не передаётся клиенту автоматически. Используйте объект СообщениеПользователю — платформа передаёт такие сообщения клиенту после завершения серверного вызова формы. Вне контекста формы сообщения нужно собирать вручную через ПолучитьСообщенияПользователю().

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

Можно выгрузить результат в таблицу значений и вывести агрегат: например, количество строк или итог по числовой колонке через свёртку. Для вывода всех значений одной строкой обойдите выборку и соберите текст через СтрСоединить() из массива строк, но учитывайте ограничение на длину читаемого сообщения.

Как сообщить результат запроса из регламентного задания?

Пользовательского сеанса у регламентного задания нет, поэтому сообщения никто не увидит. Результат фиксируют в журнале регистрации методом ЗаписьЖурналаРегистрации() или сохраняют в специальный регистр сведений/справочник протоколов, который затем просматривает ответственный пользователь.

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

Да, для короткого итога используют ПоказатьПредупреждение() или ПоказатьОповещениеПользователя() на клиенте. Эти методы асинхронны и работают только в клиентском контексте, поэтому результат запроса сначала получают на сервере, затем передают на клиент и показывают.

Что делать, если в сообщении вместо значений выводится «NULL» или пустота?

Запрос вернул NULL — например, при левом соединении без совпадений. Обработайте значение в запросе функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) или проверяйте в коде перед подстановкой в текст сообщения.

Итог

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

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