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

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

Как вывести все значения массива в 1С

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

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

Основных подхода два: цикл Для Каждого ... Из ... Цикл, который перебирает значения напрямую, и классический цикл Для ... По ... Цикл с обращением к элементам по индексу. Первый короче и безопаснее, второй нужен, когда важна позиция элемента или требуется изменять значения внутри массива.

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

Вывод значений циклом «Для Каждого»

Цикл Для Каждого — стандартный и рекомендуемый способ перебора коллекций в 1С. Он последовательно помещает каждый элемент массива в переменную цикла, и вам не нужно заботиться об индексах и границах. Это исключает самую частую ошибку — выход за пределы массива.

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

Массив.Добавить("Январь");

Массив.Добавить("Февраль");

Массив.Добавить("Март");

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

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

КонецЦикла;

В результате в окно сообщений будут выведены три строки: «Январь», «Февраль», «Март». Переменную цикла можно называть как угодно — Элемент, Строка, ТекЗначение; главное, чтобы имя не пересекалось с другими переменными в области видимости.

Важное ограничение: внутри цикла Для Каждого переменная содержит копию значения (для примитивных типов). Присвоение Элемент = "Новое значение" не изменит элемент массива. Если нужно менять значения по месту — используйте перебор по индексу, описанный ниже.

Перебор массива по индексу

Индексация массивов в 1С начинается с нуля: первый элемент — Массив[0], последний — Массив[Массив.Количество() - 1]. Это отличается от нумерации строк в таблицах значений и запросах, поэтому при переносе логики между коллекциями легко ошибиться на единицу.

Для Инд = 0 По Массив.Количество() - 1 Цикл

Сообщить("Элемент " + Инд + ": " + Массив[Инд]);

КонецЦикла;

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

Обращение по индексу — единственный способ изменить элемент внутри цикла: Массив[Инд] = СокрЛП(Массив[Инд]). Также индексный перебор нужен, когда вы обрабатываете два параллельных массива одинаковой длины, например массив наименований и массив цен.

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

Вывод массива одной строкой через разделитель

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

// Вариант 1: встроенная функция

Результат = СтрСоединить(Массив, ", ");

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

// Вариант 2: ручная сборка

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

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

Если Результат <> "" Тогда

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

КонецЕсли;

Результат = Результат + Элемент;

КонецЦикла;

Функция СтрСоединить короче и быстрее, но требует, чтобы все элементы были строками или приводились к строке. Если в массиве числа, даты или ссылки, предварительно преобразуйте их функцией Строка() или формируйте строку вручную с нужным форматированием, например Формат(Элемент, "ДЛФ=D") для дат.

Для больших массивов ручная конкатенация через + работает медленно из-за особенностей работы со строками. В этом случае используйте объект ЗаписьТекста в памяти или всё ту же СтрСоединить — она реализована платформой и справляется с тысячами элементов без заметной задержки.

Вывод значений в таблицу значений и на форму

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

Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("Значение");

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

НоваяСтрока = Таблица.Добавить();

НоваяСтрока.Значение = Элемент;

КонецЦикла;

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

Для реквизита формы типа «ДинамическийСписок» или «ТаблицаЗначений» предварительно создайте колонки программно через ИзменитьРеквизиты либо добавьте их в конфигураторе. Попытка обратиться к несуществующей колонке приведёт к ошибке выполнения.

Порядок действий при выводе массива в таблицу значений
  1. 1
    Создайте таблицу значений и добавьте колонки с нужными именами и типами
  2. 2
    Пройдите по массиву циклом «Для Каждого» и на каждой итерации добавляйте строку
  3. 3
    Заполните поля новой строки значениями из элемента массива
  4. 4
    Передайте таблицу в реквизит формы, макет или отчёт и проверьте результат визуально

Вывод массивов со сложными типами данных

Массивы в 1С редко хранят только строки. Часто в них лежат ссылки на документы, структуры или строки таблиц значений. Вывод таких элементов требует понимания, что именно покажет платформа.

Ссылочные значения при выводе через Сообщить преобразуются в представление — например, «Реализация товаров 0001 от 12.01». Если нужны реквизиты объекта, обращайтесь к ним через точку: Сообщить(Элемент.Номер + " — " + Элемент.СуммаДокумента). Учтите, что обращение к реквизитам ссылки в цикле порождает запросы к базе; на больших массивах эффективнее один запрос с выборкой по списку ссылок.

Структуры и соответствия внутри массива выводятся перебором их ключей:

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

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

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

КонецЦикла;

КонецЦикла;

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

Отладка и проверка содержимого массива

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

Если отладчик недоступен (код выполняется на сервере в фоновом задании), используйте Сообщить с указанием индекса и типа значения: Сообщить(Инд + ": [" + ТипЗнч(Массив[Инд]) + "] " + Массив[Инд]). Это помогает, когда в массиве неожиданно оказываются Неопределено или значения не того типа.

Проверяйте результат сопоставлением ожидаемого и фактического количества выведенных строк. Если Массив.Количество() равно 10, а сообщений появилось 9 — где-то в логике заполнения элемент потерян или цикл завершился досрочно по Прервать.

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

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

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

Совпадает с Массив.Количество()

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

Строк меньше — часть элементов потеряна или цикл прерван

Значения в выводе
Норма

Все элементы отображаются в исходном порядке

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

Пропущен первый элемент или появилась ошибка индекса — сбиты границы цикла

Типы значений
Норма

Каждый элемент имеет ожидаемый тип

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

Встречаются Неопределено или чужие типы — ошибка на этапе заполнения массива

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

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

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

Почему цикл «Для Каждого» не меняет значения массива?

Переменная цикла получает копию значения для примитивных типов. Чтобы изменить элемент, обращайтесь к нему по индексу: Массив[Инд] = НовоеЗначение внутри цикла «Для Инд = 0 По Массив.Количество() - 1».

Как вывести массив в обратном порядке?

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

Что будет, если массив пустой?

Оба вида циклов просто не выполнятся ни разу, ошибки не возникнет. Если дальше по логике пустой результат недопустим, проверяйте Массив.Количество() = 0 заранее и выводите понятное сообщение пользователю.

Как вывести двумерный массив (массив массивов)?

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

Чем вывести массив в журнал регистрации вместо окна сообщений?

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

Итог

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

Для чтения значений используйте цикл «Для Каждого», для изменения и работы с индексами — перебор от 0 до Количество()-1. Строки собирайте через СтрСоединить, ссылки с реквизитами выводите запросом, а результат проверяйте по количеству выведенных строк.