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

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

1С: как сообщить структуру и вывести её содержимое

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

Структура в 1С — один из самых используемых типов данных: в неё складывают параметры запросов, настройки обработок, результаты функций и временные данные при отладке. Но у структуры нет встроенного «красивого» представления: если просто передать её в Сообщить(), в окне сообщений появится малополезная строка вида «Структура», без ключей и значений.

Чтобы увидеть, что реально лежит в структуре, нужно перебрать её элементы в цикле и вывести каждую пару «ключ — значение» отдельно. Это базовый приём отладки, который экономит время при поиске ошибок в обменах, проведении документов и формировании отчётов.

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

Почему Сообщить(Структура) не показывает содержимое

Процедура Сообщить() принимает значение, приводит его к строке и выводит в окно сообщений. Для примитивных типов — чисел, строк, дат — это работает ожидаемо. Но у структуры строковое представление по умолчанию — это просто слово «Структура», без перечисления элементов.

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

Следствие простое: любую коллекцию перед выводом нужно «развернуть» самостоятельно — циклом, либо сериализовать в строковый формат, например JSON.

Базовый способ: перебор структуры в цикле

Самый прямой вариант — цикл Для Каждого. Каждый элемент структуры имеет свойства Ключ и Значение, которые и выводятся:

СтруктураДанных = Новый Структура;

СтруктураДанных.Вставить("Номенклатура", "Товар А");

СтруктураДанных.Вставить("Количество", 5);

СтруктураДанных.Вставить("Цена", 1200.50);

Для Каждого Элемент Из СтруктураДанных Цикл

Сообщить(Элемент.Ключ + " = " + Элемент.Значение);

КонецЦикла;

В окне сообщений появится три строки: «Номенклатура = Товар А», «Количество = 5», «Цена = 1200,5». Порядок вывода соответствует порядку вставки элементов — структура сохраняет его, в отличие от соответствия.

Вывод одной строкой

Если структура небольшая, удобно собрать всё в одну строку через разделитель, чтобы не засорять окно сообщений:

Результат = "";

Для Каждого Элемент Из СтруктураДанных Цикл

Результат = Результат + Элемент.Ключ + "="

+ Элемент.Значение + "; ";

КонецЦикла;

Сообщить(Результат);

Особенность вывода значений нестроковых типов

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

Порядок действий для простого вывода
  1. 1
    Создайте или получите структуру, которую нужно проверить
  2. 2
    Напишите цикл «Для Каждого Элемент Из Структура Цикл»
  3. 3
    Внутри цикла выведите Элемент.Ключ и Элемент.Значение через Сообщить()
  4. 4
    Запустите код и проверьте окно сообщений
  5. 5
    Если значение — вложенная коллекция, добавьте рекурсивный обход или JSON-вывод

Вывод вложенных структур: рекурсивный обход

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

Решение — рекурсивная процедура, которая проверяет тип каждого значения и при необходимости вызывает сама себя с увеличением отступа:

Процедура СообщитьСтруктуру(Данные, Отступ = "")

Для Каждого Элемент Из Данные Цикл

Если ТипЗнч(Элемент.Значение) = Тип("Структура") Тогда

Сообщить(Отступ + Элемент.Ключ + ":");

СообщитьСтруктуру(Элемент.Значение, Отступ + " ");

Иначе

Сообщить(Отступ + Элемент.Ключ + " = " + Элемент.Значение);

КонецЕсли;

КонецЦикла;

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

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

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

Вывод структуры через JSON

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

ЗаписьJSON = Новый ЗаписьJSON;

ЗаписьJSON.УстановитьСтроку();

ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);

Сообщить(ЗаписьJSON.Закрыть());

Результат — строка вида {"Номенклатура":"Товар А","Количество":5}. Способ хорош для отладки обменов и веб-сервисов, где данные и так ходят в JSON.

Ограничения метода существенные: сериализуются не все типы. Ссылки на объекты базы, значения типа «ХранилищеЗначения», таблицы значений и некоторые другие типы вызовут ошибку сериализации. Для таких данных JSON-подход не подходит без предварительной подготовки — например, замены ссылок на их строковые представления.

Сравнение способов вывода структуры

Цикл с Сообщить()

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

Рекурсивная процедура

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

Запись в JSON

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

Табло / окно выражений в отладчике

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

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

Часто «сообщить структуру» требуется только для разовой проверки, и писать цикл не обязательно. В конфигураторе при отладке достаточно поставить точку останова после заполнения структуры, выделить переменную и нажать Shift+F9 (вычислить выражение) — откроется окно, где структуру можно раскрыть иерархически, как дерево.

Также работают табло (Ctrl+Alt+W) и окно «Локальные переменные»: структура отображается как раскрывающийся узел, каждый ключ виден со значением и типом. Это самый быстрый способ посмотреть содержимое без модификации кода.

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

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

Типичные ошибки при выводе структуры

Первая и самая частая — попытка вывести структуру напрямую и удивление пустому результату. Вторая — обращение к несуществующему ключу: конструкция Структура.Ключ без проверки бросает исключение, если ключа нет. Безопасный вариант — метод Свойство("Ключ", Значение), который вернёт Ложь, если свойства нет, и заполнит переменную, если есть.

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

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

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

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

Содержимое окна сообщений
Норма

Каждый ключ структуры выведен отдельной строкой со значением

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

Одна строка «Структура» — значит, цикл не написан

Вложенные данные
Норма

Внутренние структуры раскрыты с отступом или выведены в JSON

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

В значении снова слово «Структура» — вложенность не обработана

Рабочий код после отладки
Норма

Отладочные сообщения удалены или отключены флагом

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

Пользователи видят технические сообщения при работе

FAQ

Можно ли вывести структуру одной командой без цикла?

Штатной команды «вывести структуру целиком» нет. Ближайшие варианты — сериализация в JSON через ЗаписатьJSON() или просмотр в отладчике через Shift+F9. Оба способа не требуют цикла, но у каждого есть ограничения по типам данных или условиям запуска.

Чем структура отличается от соответствия при выводе?

Структура хранит ключи-строки, являющиеся допустимыми именами переменных, и сохраняет порядок вставки. Соответствие допускает ключи любого типа, но порядок элементов не гарантирован. Приём вывода циклом «Для Каждого» одинаков для обоих типов.

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

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

Как вывести только часть большой структуры?

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

Что делать, если значение в структуре — таблица значений?

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

Итог

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

Структура выводится только перебором: цикл «Для Каждого» с печатью ключа и значения, рекурсия для вложенных данных или JSON для компактной строки. Для разовой проверки быстрее отладчик (Shift+F9), для фоновых заданий — журнал регистрации. Отладочные сообщения после проверки удаляйте из рабочего кода.