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