Работа с массивами в 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 элементов) создание ТаблицыЗначений может замедлить выполнение кода. В таких случаях используйте постраничный вывод или ЖурналРегистрации.
☑️ Подготовка массива для ТаблицыЗначений
4. Отладка массивов через встроенный отладчик
Для сложных массивов (многомерных, с вложенными структурами) лучший инструмент — отладчик 1С. Он позволяет:
- 🔎 Просматривать вложенные элементы
- 📌 Ставить точки останова на конкретных итерациях
- 💡 Анализировать значения переменных в реальном времени
Как использовать:
- Поставьте точку останова (F9) на строке после заполнения массива
- Запустите код в режиме отладки (F5)
- В окне "Значения" найдите вашу переменную массива и разверните её
- Для вложенных структур используйте контекстное меню "Просмотр"
Пример того, как выглядит массив структур в отладчике:
Преимущества отладчика:
- 🎯 Точный анализ сложных структур данных
- 🚀 Нет ограничений на размер массива
- 🔧 Возможность изменять значения "на лету" для тестирования
Как сохранить состояние массива из отладчика?
В окне "Значения" выделите переменную массива → ПКМ → "Копировать значение" → Вставьте в текстовый файл или обработку для дальнейшего анализа.
5. Вывод массива в ЖурналРегистрации
Для логирования массивов в процессе выполнения кода (например, в фоновых заданиях) удобно использовать ЖурналРегистрации. Этот метод:
- 📝 Сохраняет данные между сеансами
- 🔍 Позволяет фильтровать записи по времени/типу
- 📊 Подходит для мониторинга изменений в массивах
Пример записи массива в журнал:
Журнал = ЖурналыРегистрации.Оперативный;
Для Каждого Элемент Из МассивДанных Цикл
Запись = Журнал.Добавить();
Запись.Дата = ТекущаяДата();
Запись.Событие = "Элемент массива";
Запись.Данные = Строка(Элемент);
Запись.Записать();
КонецЦикла;
Чтобы просмотреть записи:
- Откройте
Администрирование → Журналы регистрации - Выберите журнал "Оперативный"
- Установите фильтр по событию "Элемент массива"
⚠️ Внимание: Чрезмерное использование ЖурналаРегистрации может заполнить базу данных. Для временных массивов используйте УдалитьПомеченные() после анализа.
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С?
Варианты сохранения:
- ХранилищеЗначения — для временных данных в рамках сеанса
- РегистрСведений — для долговременного хранения
- JSON в файл — для обмена между системами
Пример с ХранилищеЗначения:
Хранилище = Новый ХранилищеЗначения("МояОбласть");
Хранилище.Вставить("МойМассив", МассивДанных);
// В другом месте кода:
СохраненныйМассив = Хранилище.Получить("МойМассив");
Как сравнить два массива в 1С?
Используйте цикл с проверкой элементов или специализированные функции:
Функция МассивыРавны(Массив1, Массив2)
Если Массив1.Количество() <> Массив2.Количество() Тогда
Возврат Ложь;
КонецЕсли;
Для Инд = 0 По Массив1.ВГраница() Цикл
Если Не СравнитьЗначения(Массив1[Инд], Массив2[Инд]) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Для глубокого сравнения (с учетом вложенных структур) используйте рекурсивный алгоритм.
Можно ли отсортировать массив в 1С без дополнительного кода?
Да, используйте метод Сортировать() для массивов простых типов:
МассивЧисел.Сортировать(НаправлениеСортировки.Возр); // По возрастанию
МассивСтрок.Сортировать(НаправлениеСортировки.Убыв); // По убыванию
Для сложных объектов реализуйте собственную функцию сравнения с СортироватьПоПравилу().