Разработка и Конфигурация · 9 мин
Как вывести все значения массива в 1С
Как вывести все значения массива в 1С: цикл Для Каждого, перебор по индексу, вывод в сообщение, таблицу значений и строку. Примеры кода и типичные ошибки.
Массив в 1С — одна из базовых коллекций, и задача вывести все его значения возникает постоянно: при отладке алгоритмов, формировании сообщений пользователю, заполнении табличных частей и построении отчётов. Встроенный язык предлагает несколько способов перебора элементов, и выбор зависит от того, нужен ли вам индекс элемента, куда выводить данные и что делать с ними дальше.
Основных подхода два: цикл Для Каждого ... Из ... Цикл, который перебирает значения напрямую, и классический цикл Для ... По ... Цикл с обращением к элементам по индексу. Первый короче и безопаснее, второй нужен, когда важна позиция элемента или требуется изменять значения внутри массива.
Ниже разобраны оба способа с готовыми примерами кода, варианты вывода в сообщения, строку и таблицу значений, а также типичные ошибки, которые приводят к обходу не всех элементов или к падению кода с ошибкой индекса.
Вывод значений циклом «Для Каждого»
Цикл Для Каждого — стандартный и рекомендуемый способ перебора коллекций в 1С. Он последовательно помещает каждый элемент массива в переменную цикла, и вам не нужно заботиться об индексах и границах. Это исключает самую частую ошибку — выход за пределы массива.
Массив = Новый Массив;
Массив.Добавить("Январь");
Массив.Добавить("Февраль");
Массив.Добавить("Март");
Для Каждого Элемент Из Массив Цикл
Сообщить(Элемент);
КонецЦикла;
В результате в окно сообщений будут выведены три строки: «Январь», «Февраль», «Март». Переменную цикла можно называть как угодно — Элемент, Строка, ТекЗначение; главное, чтобы имя не пересекалось с другими переменными в области видимости.
Важное ограничение: внутри цикла Для Каждого переменная содержит копию значения (для примитивных типов). Присвоение Элемент = "Новое значение" не изменит элемент массива. Если нужно менять значения по месту — используйте перебор по индексу, описанный ниже.
Перебор массива по индексу
Индексация массивов в 1С начинается с нуля: первый элемент — Массив[0], последний — Массив[Массив.Количество() - 1]. Это отличается от нумерации строк в таблицах значений и запросах, поэтому при переносе логики между коллекциями легко ошибиться на единицу.
Для Инд = 0 По Массив.Количество() - 1 Цикл
Сообщить("Элемент " + Инд + ": " + Массив[Инд]);
КонецЦикла;
Такой вариант вывода полезен при отладке: вы видите не только значение, но и его позицию, что помогает находить дубли и проверять порядок сортировки. Если массив пустой, условие цикла не выполнится ни разу — ошибки не будет, обрабатывать пустой массив отдельно не требуется.
Обращение по индексу — единственный способ изменить элемент внутри цикла: Массив[Инд] = СокрЛП(Массив[Инд]). Также индексный перебор нужен, когда вы обрабатываете два параллельных массива одинаковой длины, например массив наименований и массив цен.
Вывод массива одной строкой через разделитель
Когда значения нужно показать пользователю компактно или записать в лог, удобно собрать их в одну строку. Для этого есть два рабочих приёма: конкатенация в цикле и функция СтрСоединить.
// Вариант 1: встроенная функция
Результат = СтрСоединить(Массив, ", ");
Сообщить(Результат);
// Вариант 2: ручная сборка
Результат = "";
Для Каждого Элемент Из Массив Цикл
Если Результат <> "" Тогда
Результат = Результат + ", ";
КонецЕсли;
Результат = Результат + Элемент;
КонецЦикла;
Функция СтрСоединить короче и быстрее, но требует, чтобы все элементы были строками или приводились к строке. Если в массиве числа, даты или ссылки, предварительно преобразуйте их функцией Строка() или формируйте строку вручную с нужным форматированием, например Формат(Элемент, "ДЛФ=D") для дат.
Для больших массивов ручная конкатенация через + работает медленно из-за особенностей работы со строками. В этом случае используйте объект ЗаписьТекста в памяти или всё ту же СтрСоединить — она реализована платформой и справляется с тысячами элементов без заметной задержки.
Вывод значений в таблицу значений и на форму
На практике «вывести массив» часто означает показать его пользователю в интерфейсе. Для этого массив переносят в таблицу значений, которая затем отображается на форме или используется как источник для отчёта.
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Значение");
Для Каждого Элемент Из Массив Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Значение = Элемент;
КонецЦикла;
Если массив нужно вывести в макет табличного документа, логика аналогична: в цикле получаете область макета, заполняете параметр значением элемента и выводите область в результирующий документ. Так строятся простые печатные формы и списки.
Для реквизита формы типа «ДинамическийСписок» или «ТаблицаЗначений» предварительно создайте колонки программно через ИзменитьРеквизиты либо добавьте их в конфигураторе. Попытка обратиться к несуществующей колонке приведёт к ошибке выполнения.
- 1Создайте таблицу значений и добавьте колонки с нужными именами и типами
- 2Пройдите по массиву циклом «Для Каждого» и на каждой итерации добавляйте строку
- 3Заполните поля новой строки значениями из элемента массива
- 4Передайте таблицу в реквизит формы, макет или отчёт и проверьте результат визуально
Вывод массивов со сложными типами данных
Массивы в 1С редко хранят только строки. Часто в них лежат ссылки на документы, структуры или строки таблиц значений. Вывод таких элементов требует понимания, что именно покажет платформа.
Ссылочные значения при выводе через Сообщить преобразуются в представление — например, «Реализация товаров 0001 от 12.01». Если нужны реквизиты объекта, обращайтесь к ним через точку: Сообщить(Элемент.Номер + " — " + Элемент.СуммаДокумента). Учтите, что обращение к реквизитам ссылки в цикле порождает запросы к базе; на больших массивах эффективнее один запрос с выборкой по списку ссылок.
Структуры и соответствия внутри массива выводятся перебором их ключей:
Для Каждого Элемент Из МассивСтруктур Цикл
Для Каждого КлючЗначение Из Элемент Цикл
Сообщить(КлючЗначение.Ключ + " = " + КлючЗначение.Значение);
КонецЦикла;
КонецЦикла;
Если массив содержит ссылки и нужно вывести их реквизиты, не перебирайте ссылки с обращением к базе в цикле. Передайте массив в запрос через параметр и получите все данные одним обращением — это заметно быстрее на больших объёмах.
Отладка и проверка содержимого массива
Во время разработки самый быстрый способ посмотреть массив — конфигуратор. Поставьте точку останова после заполнения массива, запустите отладку и откройте «Вычислить выражение» (Shift+F9) для переменной. Табло покажет количество элементов и позволит раскрыть каждый из них.
Если отладчик недоступен (код выполняется на сервере в фоновом задании), используйте Сообщить с указанием индекса и типа значения: Сообщить(Инд + ": [" + ТипЗнч(Массив[Инд]) + "] " + Массив[Инд]). Это помогает, когда в массиве неожиданно оказываются Неопределено или значения не того типа.
Проверяйте результат сопоставлением ожидаемого и фактического количества выведенных строк. Если Массив.Количество() равно 10, а сообщений появилось 9 — где-то в логике заполнения элемент потерян или цикл завершился досрочно по Прервать.
Как проверить результат
Совпадает с Массив.Количество()
Строк меньше — часть элементов потеряна или цикл прерван
Все элементы отображаются в исходном порядке
Пропущен первый элемент или появилась ошибка индекса — сбиты границы цикла
Каждый элемент имеет ожидаемый тип
Встречаются Неопределено или чужие типы — ошибка на этапе заполнения массива
Частые вопросы
Можно ли вывести массив без цикла?
Да, если все элементы строковые — функция СтрСоединить(Массив, ", ") вернёт одну строку без явного цикла. Для смешанных типов сначала преобразуйте элементы в строки, иначе получите ошибку или нечитаемое представление.
Почему цикл «Для Каждого» не меняет значения массива?
Переменная цикла получает копию значения для примитивных типов. Чтобы изменить элемент, обращайтесь к нему по индексу: Массив[Инд] = НовоеЗначение внутри цикла «Для Инд = 0 По Массив.Количество() - 1».
Как вывести массив в обратном порядке?
Используйте индексный цикл с шагом в обратную сторону: Для Инд = -(Массив.Количество() - 1) По 0 Цикл с обращением Массив[-Инд], либо вычисляйте индекс как Массив.Количество() - 1 - Инд внутри обычного прямого цикла.
Что будет, если массив пустой?
Оба вида циклов просто не выполнятся ни разу, ошибки не возникнет. Если дальше по логике пустой результат недопустим, проверяйте Массив.Количество() = 0 заранее и выводите понятное сообщение пользователю.
Как вывести двумерный массив (массив массивов)?
Вложенным циклом: внешний «Для Каждого» перебирает строки (внутренние массивы), внутренний — элементы каждой строки. Для читаемости выводите разделитель между строками, например номер строки внешнего массива.
Чем вывести массив в журнал регистрации вместо окна сообщений?
Используйте ЗаписьЖурналаРегистрации с текстом, собранным через СтрСоединить или цикл. Это правильный способ для серверных и фоновых процедур, где Сообщить пользователь не увидит.
Что важно запомнить
Для чтения значений используйте цикл «Для Каждого», для изменения и работы с индексами — перебор от 0 до Количество()-1. Строки собирайте через СтрСоединить, ссылки с реквизитами выводите запросом, а результат проверяйте по количеству выведенных строк.