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

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

Как сообщить (вывести) элементы массива в 1С

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

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

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

Ниже разобраны рабочие приёмы с готовым кодом, ограничения каждого подхода, типичные ошибки и способы проверить, что выведено именно то, что ожидалось.

Базовый способ: перебор массива в цикле с выводом каждого элемента

Самый универсальный приём — цикл Для Каждого … Из … Цикл. На каждой итерации текущий элемент передаётся в Сообщить(). Платформа автоматически приводит простые типы (число, дата, строка, ссылка) к строковому представлению, поэтому для большинства случаев дополнительное преобразование не нужно.

МассивТоваров = Новый Массив;

МассивТоваров.Добавить("Номенклатура А");

МассивТоваров.Добавить("Номенклатура Б");

МассивТоваров.Добавить("Номенклатура В");

Для Каждого Элемент Из МассивТоваров Цикл

Сообщить(Элемент);

КонецЦикла;

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

Если важно видеть позицию элемента, добавьте индекс. Для этого используйте цикл со счётчиком:

Для Индекс = 0 По МассивТоваров.ВГраница() Цикл

Сообщить("[" + Индекс + "] " + МассивТоваров[Индекс]);

КонецЦикла;

Обратите внимание на метод ВГраница(): он возвращает индекс последнего элемента, то есть Количество() - 1. Индексация массивов в 1С начинается с нуля — это частый источник ошибок у тех, кто привык к нумерации с единицы.

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

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

ТекстСообщения = "Выбранные товары: " + СтрСоединить(МассивТоваров, ", ");

Сообщить(ТекстСообщения);

// Результат: Выбранные товары: Номенклатура А, Номенклатура Б, Номенклатура В

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

МассивСтрок = Новый Массив;

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

МассивСтрок.Добавить(Строка(Элемент));

КонецЦикла;

Сообщить(СтрСоединить(МассивСтрок, "; "));

Явное приведение через Строка() гарантирует, что в итоговую строку попадёт читаемое представление: для ссылок — наименование или представление объекта, для дат — форматированная дата, для чисел — число без лишних символов группировки.

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

Цикл с Сообщить() для каждого элемента

Подходит для отладки и пошагового анализа. Минус: много строк в окне сообщений, медленнее на больших массивах.

СтрСоединить + один вызов Сообщить

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

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

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

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

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

Для Каждого Элемент Из МассивОшибок Цикл

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

Сообщение.Текст = Элемент;

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

КонецЦикла;

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

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

Вывод массива со сложными типами: ссылки, структуры, таблицы

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

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

Сообщить("Контрагент: " + Элемент.Контрагент

+ ", сумма: " + Формат(Элемент.Сумма, "ЧДЦ=2"));

КонецЦикла;

Для диагностики структур произвольного состава удобно перебирать ключи:

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

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

КонецЦикла;

Если нужно вывести содержимое произвольного значения без ручного описания полей, используйте сериализацию в JSON через ЗаписьJSON — это стандартный способ получить читаемое представление структуры или массива структур. Такой приём особенно полезен при отладке обменов и веб-сервисов.

Порядок действий для произвольного массива
  1. 1
    Определите тип элементов массива: примитивы, ссылки или структуры.
  2. 2
    Для примитивов и ссылок используйте цикл с Сообщить() или СтрСоединить с предварительным Строка(Элемент).
  3. 3
    Для структур переберите пары КлючЗначение или сериализуйте значение в JSON.
  4. 4
    Запустите код на тестовых данных и сверьте количество выведенных строк с Массив.Количество().
  5. 5
    Уберите или закомментируйте отладочный вывод перед переносом в продуктив.

Отладка в конфигураторе: альтернативы сообщениям

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

Также доступно табло (Alt+T) для постоянного наблюдения за выражением Массив.Количество() или отдельным элементом. Это быстрее, чем вставлять и потом удалять отладочные сообщения, и не засоряет код.

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

Полезный приём — выводить в начале сообщения количество элементов: Сообщить("Найдено строк: " + Массив.Количество()). Если в окне сообщений строк меньше, чем ожидалось, сразу видно, что массив заполнен не полностью, и проблема в логике заполнения, а не в выводе.
ПЗ
Практическое замечание

Типичные ошибки и как их избежать

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

Вторая ошибка — выход за границы массива при цикле со счётчиком. Если написать Для Индекс = 1 По Массив.Количество() и обращаться к Массив[Индекс], то первый элемент будет пропущен, а на последней итерации возникнет исключение. Правильные границы: от 0 до ВГраница().

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

Типичные ошибки
01
Сообщить(Массив) без перебора — получится бесполезное представление или ошибка преобразования типа.
02
Цикл «Для Индекс = 1 По Количество()» — пропуск первого элемента и выход за границу массива на последней итерации.
03
СтрСоединить по массиву нестроковых значений — исключение о несоответствии типов; сначала приведите элементы через Строка().
04
Отладочный вывод, забытый в продуктивном коде, — лишние сообщения пользователям и разглашение служебных данных.
Контрольные точки

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

Количество выведенных строк
Норма

Совпадает с Массив.Количество() (для цикла) или все элементы перечислены в одной строке

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

Строк меньше — массив заполнен не полностью или цикл прерывается

Порядок элементов
Норма

Совпадает с порядком добавления в массив

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

Порядок другой — возможно, используется не массив, а соответствие

Значения элементов
Норма

Читаемые представления: наименования, числа, даты

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

Выводится «Структура», «Объект» или пустые строки

Проверка результата и границы самостоятельной работы

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

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

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

Итог

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

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

Частые вопросы

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

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

Почему Сообщить(Массив[0]) выдаёт ошибку, хотя массив создан?

Скорее всего, массив пуст — в нём нет даже нулевого элемента. Проверьте Массив.Количество() перед обращением по индексу и убедитесь, что элементы действительно добавляются методом Добавить() или Установить().

Как вывести элементы массива в журнал регистрации?

Соберите строку через СтрСоединить и передайте её в ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , , ТекстСтроки). Это правильный способ диагностики для фоновых заданий, где сообщения пользователю не видны.

В управляемой форме сообщения не появляются на экране. В чём причина?

Если код выполняется в фоновом задании или вне интерактивного вызова, сообщения теряются. Также проверьте, что используется СообщениеПользователю с вызовом метода Сообщить() — простое создание объекта без вызова метода ничего не покажет.

Как вывести только часть большого массива?

Ограничьте цикл счётчиком, например: выведите первые 20 элементов и добавьте строку «…и ещё N элементов», где N = Массив.Количество() - 20. Это сохраняет читаемость и не замедляет выполнение обработки.

Чем посмотреть массив, не меняя код?

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