Работа с массивами в 1С:Предприятие 8.3

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

Особое внимание уделим нюансам: почему ДляКаждого может "проглатывать" элементы, как избежать ошибки "Недопустимый индекс массива" при выводе в цикле, и какие инструменты использовать для отладки массивов с вложенными структурами (например, массивы массивов или массивы с объектами СправочникСсылка).

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

1. Базовый вывод массива через Сообщить()

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

Пример кода для одомерного массива:

МассивЧисел = Новый Массив;

МассивЧисел.Добавить(10);

МассивЧисел.Добавить(20);

МассивЧисел.Добавить(30);

Сообщить(МассивЧисел); // Выведет: "10,20,30"

  • ✅ Быстро и без дополнительного кода
  • ✅ Подходит для проверки простых массивов
  • ❌ Не показывает индексы элементов
  • ❌ Плохо читается для массивов с объектами

Для массивов с объектами (например, справочниками) вывод будет менее информативным:

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

МассивСсылок.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар1"));

Сообщить(МассивСсылок); // Выведет только ссылку, например: "СправочникСсылка.Номенклатура.Товар1"

⚠️ Внимание: В конфигурациях с большим количеством реквизитов Сообщить() может вызвать ошибку "Слишком длинная строка". В таких случаях используйте вывод по частям или альтернативные методы.
📊 Какой способ вывода массивов используете чаще?
Сообщить()
ТаблицаЗначений
Отладчик
Журнал регистрации
Свой вариант

2. Вывод массива в цикле с индексами

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

МассивДанных = Новый Массив;

МассивДанных.Добавить("Апельсин");

МассивДанных.Добавить("Яблоко");

МассивДанных.Добавить("Банан");

// Вариант 1: Цикл по индексам

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

Сообщить(Формат("Индекс %1: %2", Инд, МассивДанных[Инд]));

КонецЦикла;

Для массивов с объектами лучше использовать Для Каждого, чтобы избежать ошибок при пустых элементах:

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

Если Элемент <> Неопределено Тогда

Сообщить(Элемент.Наименование); // Для объектов типа СправочникОбъект

КонецЕсли;

КонецЦикла;

МетодПлюсыМинусыКогда использовать
Для ... ПоПоказывает индексыМожет выдать ошибку при пустых элементахДля простых массивов с известной структурой
Для КаждогоБезопасен для массивов с НеопределеноНе показывает индексыДля массивов с объектами или неопределенными значениями
Пока ... ЦиклГибкое управление итерациейБолее громоздкий кодДля сложной логики обработки
💡

Чтобы увидеть тип элемента массива, добавьте в цикл строку Сообщить(ТипЗнч(Элемент)). Это поможет отладить массивы со смешанными типами данных (числа, строки, объекты).

3. Использование ТаблицыЗначений для структурированного вывода

Для визуального отображения массивов с сохранением структуры идеально подходит ТаблицаЗначений. Этот метод позволяет:

  • 📊 Выводить данные в виде таблицы с колонками
  • 🔍 Добавлять заголовки и форматирование
  • 📤 Экспортировать результат в Excel

Пример создания таблицы из массива структур:

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

Структура1 = Новый Структура("Наименование,Цена,Количество", "Товар1", 100, 5);

Структура2 = Новый Структура("Наименование,Цена,Количество", "Товар2", 200, 3);

МассивСтруктур.Добавить(Структура1);

МассивСтруктур.Добавить(Структура2);

// Создаем таблицу

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

Таблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));

Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));

Таблица.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));

// Заполняем данными

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

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

НоваяСтрока.Наименование = Структура.Наименование;

НоваяСтрока.Цена = Структура.Цена;

НоваяСтрока.Количество = Структура.Количество;

КонецЦикла;

// Показываем пользователю

Таблица.Показать("Результаты обработки");

⚠️ Внимание: При работе с большими массивами (>10 000 элементов) создание ТаблицыЗначений может замедлить выполнение кода. В таких случаях используйте постраничный вывод или ЖурналРегистрации.

☑️ Подготовка массива для ТаблицыЗначений

Выполнено: 0 / 4

4. Отладка массивов через встроенный отладчик

Для сложных массивов (многомерных, с вложенными структурами) лучший инструмент — отладчик 1С. Он позволяет:

  • 🔎 Просматривать вложенные элементы
  • 📌 Ставить точки останова на конкретных итерациях
  • 💡 Анализировать значения переменных в реальном времени

Как использовать:

  1. Поставьте точку останова (F9) на строке после заполнения массива
  2. Запустите код в режиме отладки (F5)
  3. В окне "Значения" найдите вашу переменную массива и разверните её
  4. Для вложенных структур используйте контекстное меню "Просмотр"

Пример того, как выглядит массив структур в отладчике:

Скриншот отладчика 1С с развернутым массивом структур: видно имена ключей и значения для каждого элемента массива

Преимущества отладчика:

  • 🎯 Точный анализ сложных структур данных
  • 🚀 Нет ограничений на размер массива
  • 🔧 Возможность изменять значения "на лету" для тестирования
Как сохранить состояние массива из отладчика?

В окне "Значения" выделите переменную массива → ПКМ → "Копировать значение" → Вставьте в текстовый файл или обработку для дальнейшего анализа.

5. Вывод массива в ЖурналРегистрации

Для логирования массивов в процессе выполнения кода (например, в фоновых заданиях) удобно использовать ЖурналРегистрации. Этот метод:

  • 📝 Сохраняет данные между сеансами
  • 🔍 Позволяет фильтровать записи по времени/типу
  • 📊 Подходит для мониторинга изменений в массивах

Пример записи массива в журнал:

Журнал = ЖурналыРегистрации.Оперативный;

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

Запись = Журнал.Добавить();

Запись.Дата = ТекущаяДата();

Запись.Событие = "Элемент массива";

Запись.Данные = Строка(Элемент);

Запись.Записать();

КонецЦикла;

Чтобы просмотреть записи:

  1. Откройте Администрирование → Журналы регистрации
  2. Выберите журнал "Оперативный"
  3. Установите фильтр по событию "Элемент массива"
⚠️ Внимание: Чрезмерное использование ЖурналаРегистрации может заполнить базу данных. Для временных массивов используйте УдалитьПомеченные() после анализа.

6. Продвинутые методы: JSON и внешние инструменты

Для интеграций или сложного анализа массивов полезно преобразовывать их в JSON. Это позволяет:

  • 🌐 Передавать данные во внешние системы
  • 📋 Сохранять структуру вложенных массивов
  • 🔧 Использовать сторонние JSON-просмотрщики

Пример преобразования массива в JSON:

ЗаписьJSON = Новый ЗаписьJSON;

МассивДляJSON = Новый Массив;

МассивДляJSON.Добавить(Новый Структура("Код,Название", "001", "Товар А"));

МассивДляJSON.Добавить(Новый Структура("Код,Название", "002", "Товар Б"));

ЗаписьJSON.УстановитьСтроку();

ЗаписьJSON.ЗаписатьJSON(МассивДляJSON);

РезультатJSON = ЗаписьJSON.Закрыть();

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

// Выведет: [{"Код":"001","Название":"Товар А"},{"Код":"002","Название":"Товар Б"}]

Для визуализации JSON-данных можно использовать:

  • 🌐 Онлайн-валидаторы (например, JSONLint)
  • 📊 Расширения для браузеров (JSON Viewer)
  • 💻 Локальные редакторы (Visual Studio Code с плагинами)

Для больших массивов (>1000 элементов) рекомендуется:

// Разбиваем массив на части по 500 элементов

РазмерЧасти = 500;

Для Инд = 0 По Массив.ВГраница() Шаг РазмерЧасти Цикл

ЧастьМассива = Массив.Получить(Инд, Минимальное(Инд + РазмерЧасти, Массив.ВГраница()));

// Обработка части массива

КонецЦикла;

7. Специализированные обработки для работы с массивами

Для регулярной работы с массивами целесообразно создать универсальную обработку-инспектор. Она может включать:

  • 🔍 Автоопределение типа элементов
  • 📊 Визуализацию вложенных структур
  • 📤 Экспорт в Excel/JSON
  • 🔎 Поиск по содержимому массива

Пример кода для простой обработки:

Процедура ПоказатьМассив(Массив, Заголовок = "") Экспорт

Форма = Новый Форма;

Форма.Заголовок = Заголовок;

Таблица = Форма.Элементы.Добавить("Таблица", Тип("ТабличноеПоле"), Истина);

Таблица.ТолькоПросмотр = Истина;

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

Данные.Колонки.Добавить("Индекс");

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

Данные.Колонки.Добавить("Тип");

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

Элемент = Массив[Инд];

Строка = Данные.Добавить();

Строка.Индекс = Инд;

Строка.Значение = ?(ТипЗнч(Элемент) = Тип("Строка"), Элемент, Строка(Элемент));

Строка.Тип = ТипЗнч(Элемент);

КонецЦикла;

Таблица.Значение = Данные;

Форма.Открыть();

КонецПроцедуры

Чтобы использовать обработку:

МассивДляАнализа = Новый Массив;

МассивДляАнализа.Добавить(100);

МассивДляАнализа.Добавить("Текст");

МассивДляАнализа.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар1"));

ПоказатьМассив(МассивДляАнализа, "Анализ тестового массива");

⚠️ Внимание: При работе с обработками в управляемом приложении убедитесь, что форма совместима с текущей версией платформы (используйте ТолькоТонкийКлиент или ТолькоТолстыйКлиент при необходимости).
💡

Для массивов с объектами (справочники, документы) всегда проверяйте права доступа перед выводом — некоторые свойства могут быть недоступны в пользовательском режиме.

FAQ: Частые вопросы по работе с массивами в 1С

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

Используйте вложенные циклы или рекурсивную функцию. Пример для двумерного массива:

Для Каждого ВнешнийМассив Из МногомерныйМассив Цикл

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

Сообщить(ВнутреннийЭлемент);

КонецЦикла;

КонецЦикла;

Для визуализации лучше создать ТаблицуЗначений с колонками для каждого измерения.

Почему при выводе массива через Сообщить() вижу только "Массив"?

Это происходит, если массив содержит объекты, которые не преобразуются в строку автоматически. Используйте явное преобразование:

Сообщить(Строка(Массив[0].Свойство)); // Вместо Сообщить(Массив[0])

Для сложных объектов (например, ДокументОбъект) выводите конкретные реквизиты.

Как сохранить массив между сеансами 1С?

Варианты сохранения:

  1. ХранилищеЗначения — для временных данных в рамках сеанса
  2. РегистрСведений — для долговременного хранения
  3. JSON в файл — для обмена между системами

Пример с ХранилищеЗначения:

Хранилище = Новый ХранилищеЗначения("МояОбласть");

Хранилище.Вставить("МойМассив", МассивДанных);

// В другом месте кода:

СохраненныйМассив = Хранилище.Получить("МойМассив");

Как сравнить два массива в 1С?

Используйте цикл с проверкой элементов или специализированные функции:

Функция МассивыРавны(Массив1, Массив2)

Если Массив1.Количество() <> Массив2.Количество() Тогда

Возврат Ложь;

КонецЕсли;

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

Если Не СравнитьЗначения(Массив1[Инд], Массив2[Инд]) Тогда

Возврат Ложь;

КонецЕсли;

КонецЦикла;

Возврат Истина;

КонецФункции

Для глубокого сравнения (с учетом вложенных структур) используйте рекурсивный алгоритм.

Можно ли отсортировать массив в 1С без дополнительного кода?

Да, используйте метод Сортировать() для массивов простых типов:

МассивЧисел.Сортировать(НаправлениеСортировки.Возр); // По возрастанию

МассивСтрок.Сортировать(НаправлениеСортировки.Убыв); // По убыванию

Для сложных объектов реализуйте собственную функцию сравнения с СортироватьПоПравилу().