Разработка и Конфигурация · 12 мин
Как сообщить (вывести) элементы массива в 1С
Как сообщить элементы массива в 1С: перебор в цикле, СтрСоединить, вывод в сообщение пользователю. Примеры кода, типичные ошибки и способы проверки результата.
Массив в 1С — это коллекция значений с индексированным доступом, и задача вывести его содержимое через Сообщить() возникает постоянно: при отладке алгоритмов, проверке результатов запросов, диагностике обменов данными. Прямого способа «сообщить массив целиком» во встроенном языке нет — метод Сообщить() принимает строку, поэтому содержимое массива нужно либо перебрать в цикле, либо предварительно преобразовать в строку.
Выбор способа зависит от цели. Для быстрой отладки достаточно цикла Для Каждого с выводом каждого элемента отдельной строкой. Для компактного отображения в журнале регистрации или в сообщении пользователю удобнее собрать элементы в одну строку через СтрСоединить(). Если массив содержит объекты сложных типов (ссылки, структуры), потребуется явное преобразование в строку.
Ниже разобраны рабочие приёмы с готовым кодом, ограничения каждого подхода, типичные ошибки и способы проверить, что выведено именно то, что ожидалось.
Базовый способ: перебор массива в цикле с выводом каждого элемента
Самый универсальный приём — цикл Для Каждого … Из … Цикл. На каждой итерации текущий элемент передаётся в Сообщить(). Платформа автоматически приводит простые типы (число, дата, строка, ссылка) к строковому представлению, поэтому для большинства случаев дополнительное преобразование не нужно.
МассивТоваров = Новый Массив;
МассивТоваров.Добавить("Номенклатура А");
МассивТоваров.Добавить("Номенклатура Б");
МассивТоваров.Добавить("Номенклатура В");
Для Каждого Элемент Из МассивТоваров Цикл
Сообщить(Элемент);
КонецЦикла;
Каждый элемент попадёт в окно сообщений отдельной строкой. Это удобно при отладке: видно порядок элементов и их точное количество. Недостаток — при большом массиве окно сообщений переполняется, а производительность падает, потому что каждый вызов Сообщить() — отдельная операция вывода.
Если важно видеть позицию элемента, добавьте индекс. Для этого используйте цикл со счётчиком:
Для Индекс = 0 По МассивТоваров.ВГраница() Цикл
Сообщить("[" + Индекс + "] " + МассивТоваров[Индекс]);
КонецЦикла;
Обратите внимание на метод ВГраница(): он возвращает индекс последнего элемента, то есть Количество() - 1. Индексация массивов в 1С начинается с нуля — это частый источник ошибок у тех, кто привык к нумерации с единицы.
Компактный вывод: сборка массива в одну строку через СтрСоединить
Когда нужно показать содержимое массива одной строкой — например, в тексте ошибки, письме или записи журнала регистрации — используйте функцию СтрСоединить(). Она принимает массив строк и разделитель, возвращая единую строку.
ТекстСообщения = "Выбранные товары: " + СтрСоединить(МассивТоваров, ", ");
Сообщить(ТекстСообщения);
// Результат: Выбранные товары: Номенклатура А, Номенклатура Б, Номенклатура В
Ограничение: СтрСоединить() работает корректно только с массивом строк. Если в массиве лежат числа, даты или ссылки, поведение зависит от версии платформы и режима совместимости — в ряде случаев будет вызвано исключение о несоответствии типов. Надёжнее предварительно преобразовать элементы:
МассивСтрок = Новый Массив;
Для Каждого Элемент Из ИсходныйМассив Цикл
МассивСтрок.Добавить(Строка(Элемент));
КонецЦикла;
Сообщить(СтрСоединить(МассивСтрок, "; "));
Явное приведение через Строка() гарантирует, что в итоговую строку попадёт читаемое представление: для ссылок — наименование или представление объекта, для дат — форматированная дата, для чисел — число без лишних символов группировки.
Сравнение вариантов вывода
Подходит для отладки и пошагового анализа. Минус: много строк в окне сообщений, медленнее на больших массивах.
Подходит для компактного вывода, писем и журнала регистрации. Требует массива строк или предварительного преобразования типов.
Подходит для интерактивных форм: сообщение привязывается к полю и показывается пользователю управляемого приложения. Не работает в фоновых заданиях.
Вывод через СообщениеПользователю в управляемых формах
В тонком клиенте и управляемых формах вместо Сообщить() рекомендуется объект СообщениеПользователю. Он корректно отображается в панели сообщений формы и может быть привязан к конкретному реквизиту, что важно при проверке заполнения.
Для Каждого Элемент Из МассивОшибок Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Элемент;
Сообщение.Сообщить();
КонецЦикла;
Метод Сообщить() в обычном приложении выводит текст в окно сообщений, а в управляемом — фактически создаёт то же сообщение пользователю, но без привязки к полям. Поэтому для серверных проверок в формах осознанно выбирайте СообщениеПользователю: это даёт единообразное поведение и возможность указать Поле и ПутьКДанным.
Учтите ограничение: в фоновых заданиях и на сервере вне контекста интерактивного вызова сообщения пользователю не дойдут до экрана. Там для диагностики правильнее писать в журнал регистрации через ЗаписьЖурналаРегистрации(), передавая собранную из массива строку.
Вывод массива со сложными типами: ссылки, структуры, таблицы
Если массив содержит ссылки на объекты, простой вывод покажет представление ссылки — обычно этого достаточно. Но для структур, соответствий и вложенных массивов автоматическое приведение к строке даст малополезный результат вида «Структура». Здесь нужно явно описывать, что выводить.
Для Каждого Элемент Из МассивСтруктур Цикл
Сообщить("Контрагент: " + Элемент.Контрагент
+ ", сумма: " + Формат(Элемент.Сумма, "ЧДЦ=2"));
КонецЦикла;
Для диагностики структур произвольного состава удобно перебирать ключи:
Для Каждого КлючЗначение Из ЭлементСтруктура Цикл
Сообщить(КлючЗначение.Ключ + " = " + КлючЗначение.Значение);
КонецЦикла;
Если нужно вывести содержимое произвольного значения без ручного описания полей, используйте сериализацию в JSON через ЗаписьJSON — это стандартный способ получить читаемое представление структуры или массива структур. Такой приём особенно полезен при отладке обменов и веб-сервисов.
- 1Определите тип элементов массива: примитивы, ссылки или структуры.
- 2Для примитивов и ссылок используйте цикл с Сообщить() или СтрСоединить с предварительным Строка(Элемент).
- 3Для структур переберите пары КлючЗначение или сериализуйте значение в JSON.
- 4Запустите код на тестовых данных и сверьте количество выведенных строк с Массив.Количество().
- 5Уберите или закомментируйте отладочный вывод перед переносом в продуктив.
Отладка в конфигураторе: альтернативы сообщениям
Вывод через Сообщить() — не единственный и часто не лучший способ посмотреть массив. В режиме отладки конфигуратор позволяет установить точку останова и открыть массив в окне «Вычислить выражение» (Ctrl+F9): там видны все элементы, их типы и значения в виде дерева, без изменения кода.
Также доступно табло (Alt+T) для постоянного наблюдения за выражением Массив.Количество() или отдельным элементом. Это быстрее, чем вставлять и потом удалять отладочные сообщения, и не засоряет код.
Тем не менее сообщения остаются актуальными там, где отладчик недоступен: фоновые задания на сервере, регламентные операции, код у клиента без возможности подключения. В таких сценариях выводите диагностику в журнал регистрации — её можно прочитать позже и отфильтровать.
Полезный приём — выводить в начале сообщения количество элементов: Сообщить("Найдено строк: " + Массив.Количество()). Если в окне сообщений строк меньше, чем ожидалось, сразу видно, что массив заполнен не полностью, и проблема в логике заполнения, а не в выводе.
Типичные ошибки и как их избежать
Первая распространённая ошибка — попытка вывести массив напрямую: Сообщить(Массив). В зависимости от контекста это либо выведет неинформативное представление, либо вызовет ошибку преобразования. Массив всегда нужно перебрать или соединить в строку.
Вторая ошибка — выход за границы массива при цикле со счётчиком. Если написать Для Индекс = 1 По Массив.Количество() и обращаться к Массив[Индекс], то первый элемент будет пропущен, а на последней итерации возникнет исключение. Правильные границы: от 0 до ВГраница().
Третья группа проблем — производительность. Вывод тысяч элементов по одному сообщению заметно тормозит выполнение и делает результат нечитаемым. Для больших массивов ограничивайте вывод первыми десятью–двадцатью элементами с указанием общего количества, либо пишите данные в файл или журнал регистрации.
Как проверить результат
Совпадает с Массив.Количество() (для цикла) или все элементы перечислены в одной строке
Строк меньше — массив заполнен не полностью или цикл прерывается
Совпадает с порядком добавления в массив
Порядок другой — возможно, используется не массив, а соответствие
Читаемые представления: наименования, числа, даты
Выводится «Структура», «Объект» или пустые строки
Проверка результата и границы самостоятельной работы
После добавления вывода запустите код на контролируемом примере, где содержимое массива известно заранее. Сверьте три вещи: количество строк, порядок и сами значения. Если вместо значений выводятся служебные представления вроде «Структура» — значит, нужен разбор полей или сериализация, как показано выше.
Самостоятельная отладка выводом безопасна в копии базы и на тестовом стенде. В продуктивной базе любой лишний Сообщить() в массовых обработках может замедлить выполнение и показать пользователям служебную информацию. Перед обновлением продуктива найдите поиском по конфигурации все добавленные отладочные строки и удалите их либо оберните в условие по флагу отладки.
Если массив формируется запросом к базе и вывод показывает пустоту там, где данные должны быть, проблема почти всегда в заполнении, а не в выводе: проверьте параметры запроса, отборы и то, что результат запроса действительно выгружается в массив через Выгрузить().ВыгрузитьКолонку() или явное добавление в цикле.
Что важно запомнить
Массив в 1С нельзя сообщить напрямую: перебирайте его циклом с Сообщить() или соединяйте в строку через СтрСоединить с предварительным приведением элементов к строке. Индексация с нуля, для форм используйте СообщениеПользователю, для фоновых процессов — журнал регистрации, а отладочный вывод обязательно удаляйте перед продуктивом.
Частые вопросы
Можно ли вывести массив одной командой без цикла?
Да, если элементы — строки: Сообщить(СтрСоединить(Массив, ", ")). Для нестроковых типов сначала сформируйте массив строк через Строка(Элемент) в цикле, иначе возможна ошибка преобразования типов.
Почему Сообщить(Массив[0]) выдаёт ошибку, хотя массив создан?
Скорее всего, массив пуст — в нём нет даже нулевого элемента. Проверьте Массив.Количество() перед обращением по индексу и убедитесь, что элементы действительно добавляются методом Добавить() или Установить().
Как вывести элементы массива в журнал регистрации?
Соберите строку через СтрСоединить и передайте её в ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , , ТекстСтроки). Это правильный способ диагностики для фоновых заданий, где сообщения пользователю не видны.
В управляемой форме сообщения не появляются на экране. В чём причина?
Если код выполняется в фоновом задании или вне интерактивного вызова, сообщения теряются. Также проверьте, что используется СообщениеПользователю с вызовом метода Сообщить() — простое создание объекта без вызова метода ничего не покажет.
Как вывести только часть большого массива?
Ограничьте цикл счётчиком, например: выведите первые 20 элементов и добавьте строку «…и ещё N элементов», где N = Массив.Количество() - 20. Это сохраняет читаемость и не замедляет выполнение обработки.
Чем посмотреть массив, не меняя код?
В режиме отладки конфигуратора: поставьте точку останова после заполнения массива, затем откройте «Вычислить выражение» (Ctrl+F9) и введите имя переменной — содержимое отобразится в виде дерева с типами и значениями всех элементов.