Работа с массивами в 1С:Предприятие — одна из самых частых задач при разработке конфигураций, отчетов или обработок. Но когда требуется передать данные массива во внешнюю систему, сохранить в файл или просто отобразить пользователю в удобном виде, возникает необходимость преобразовать его в строку. В этой статье разберем все возможные способы вывода массива в одну строку — от стандартных функций до неочевидных приемов с учетом нюансов разных версий платформы.
Особенность задачи в том, что 1С не имеет встроенного метода вроде Array.Join(), как в других языках программирования. Поэтому разработчикам приходится использовать обходные пути. Мы рассмотрим как классические решения для 1С 8.2/8.3, так и современные подходы с использованием JSON или Запросов, которые могут быть полезны в интеграционных сценариях. Важно понимать, что выбор метода зависит не только от версии платформы, но и от структуры данных массива (простой список, массив структур, вложенные массивы) и требуемого формата выходной строки.
1. Стандартная функция СоединитьСтроки() — просто и быстро
Самый очевидный и рекомендуемый способ для большинства задач — использование встроенной функции СоединитьСтроки(). Она доступна во всех актуальных версиях платформы и позволяет гибко настраивать разделитель между элементами.
Основной синтаксис:
СтрокаРезультата = СоединитьСтроки(Массив, Разделитель);
Пример использования для массива чисел:
МассивЧисел = Новый Массив;
МассивЧисел.Добавить(10);
МассивЧисел.Добавить(20);
МассивЧисел.Добавить(30);
Результат = СоединитьСтроки(МассивЧисел, ", ");
// Результат: "10, 20, 30"
- ✅ Плюсы: минимальный код, высокая скорость выполнения, поддерживает любой тип данных (автоматически преобразует в строку).
- ⚠️ Ограничения: не работает с вложенными массивами (выдаст ошибку "Тип не поддерживается").
- 🔄 Нюанс: в версиях ниже 8.3.10 может неправильно обрабатывать элементы типа
Null(преобразует в пустую строку).
⚠️ Внимание: Если массив содержит объекты (например,СправочникСсылка), функция выведет их внутреннее представление (например,"Справочник.Номенклатура:0x1234"). Для корректного отображения сначала преобразуйте объекты в строки с помощью метода.Представление()или.Наименование.
2. Ручное объединение через цикл — полный контроль
Когда требуется максимальная гибкость (например, разные разделители для четных/нечетных элементов или обработка Null), лучше использовать явный перебор элементов через цикл Для каждого....
Базовый шаблон:
Результат = "";
Разделитель = ", ";
Для Каждого Элемент Из Массив Цикл
Если Результат <> "" Тогда
Результат = Результат + Разделитель;
КонецЕсли;
Результат = Результат + Строка(Элемент);
КонецЦикла;
Продвинутый вариант с обработкой вложенных массивов:
Функция МассивВСтроку(Массив, Разделитель = ", ")
Результат = "";
Для Каждого Элемент Из Массив Цикл
Если ТипЗнч(Элемент) = Тип("Массив") Тогда
Элемент = МассивВСтроку(Элемент, Разделитель); // Рекурсия
ИначеЕсли Элемент = Неопределено Тогда
Элемент = "NULL";
Иначе
Элемент = Строка(Элемент);
КонецЕсли;
Если Результат <> "" Тогда
Результат = Результат + Разделитель;
КонецЕсли;
Результат = Результат + Элемент;
КонецЦикла;
Возврат Результат;
КонецФункции
| Сценарий | Пример кода | Результат |
|---|---|---|
| Простой массив | МассивВСтроку(Новый Массив(1, 2, 3)) | "1, 2, 3" |
С обработкой Null | МассивВСтроку(Новый Массив(1, Неопределено, 3)) | "1, NULL, 3" |
| Вложенный массив | МассивВСтроку(Новый Массив(1, Новый Массив(2, 3))) | "1, 2, 3" |
| Кастомный разделитель | МассивВСтроку(Новый Массив(1, 2), " | ") | "1 | 2" |
Этот метод универсален, но требует больше кода. Его стоит использовать, когда:
- 🔹 Нужна специальная обработка определенных элементов (например, замена
Nullна "Н/Д"). - 🔹 Требуется разный разделитель для разных частей массива.
- 🔹 Массив содержит объекты, которые нужно преобразовать особым образом.
1. Проверьте массив на пустоту (Массив.Количество() = 0)
2. Определитесь с разделителем (запятая, точка с запятой, перенос строки)
3. Решите, как обрабатывать Null/Неопределено
4. При необходимости добавьте рекурсию для вложенных массивов
-->
3. Использование запроса — для больших массивов
Если массив содержит тысячи элементов, стандартные методы могут работать медленно. В таких случаях эффективнее использовать временную таблицу и Запрос:
Алгоритм:
- Создать временную таблицу значений.
- Заполнить её данными из массива.
- Выполнить запрос с функцией
СТРСОЕДИНИТЬ().
Пример кода:
// 1. Создаем таблицу
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Значение");
// 2. Заполняем данными из массива
Для Каждого Элемент Из Массив Цикл
Строка = Таблица.Добавить();
Строка.Значение = Строка(Элемент);
КонецЦикла;
// 3. Выполняем запрос
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СТРСОЕДИНИТЬ(Значение, ', ') КАК Результат
|ИЗ
| &Таблица КАК Т";
Запрос.УстановитьПараметр("Таблица", Таблица);
Результат = Запрос.Выполнить().Выгрузить()[0].Результат;
Преимущества этого подхода:
- ⚡ Высокая производительность на больших объемах данных (от 10 000+ элементов).
- 🛠️ Возможность дополнительной обработки данных прямо в запросе (фильтрация, сортировка).
- 🔄 Поддерживает группировку — можно объединять строки по группам.
⚠️ Внимание: Функция СТРСОЕДИНИТЬ() в запросах 1С имеет ограничение на длину результирующей строки (обычно ~8000 символов). Для очень больших массивов разбейте их на части или используйте цикл.
Как обойти ограничение на длину строки в запросе?
Если результирующая строка превышает лимит, можно:
1. Разбить исходный массив на части по 1000 элементов и обрабатывать каждую часть отдельным запросом.
2. Использовать временную таблицу с колонкой "Группа" и объединять строки по группам:
Запрос.Текст =
"ВЫБРАТЬ
| Группа,
| СТРСОЕДИНИТЬ(Значение, ', ') КАК Результат
|ИЗ
| &Таблица КАК Т
|ГРУППИРОВАТЬ ПО
| Группа";
3. Вернуть массив строк вместо одной большой строки и потом соединить их в коде.
4. JSON-сериализация — для сложных структур
Если массив содержит вложенные структуры, объекты или требуется сохранить типы данных, оптимальное решение — преобразование в JSON. В современных версиях 1С 8.3.10+ для этого есть встроенные методы:
Базовый пример:
Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить("Текст");
Массив.Добавить(Истина);
Результат = JSON.Записать(Массив);
// Результат: "[1,"Текст",true]"
Для массива структур:
МассивСтруктур = Новый Массив;
Структура1 = Новый Структура("Имя, Возраст", "Иван", 30);
Структура2 = Новый Структура("Имя, Возраст", "Мария", 25);
МассивСтруктур.Добавить(Структура1);
МассивСтруктур.Добавить(Структура2);
Результат = JSON.Записать(МассивСтруктур);
// Результат: '[{"Имя":"Иван","Возраст":30},{"Имя":"Мария","Возраст":25}]'
Когда использовать JSON:
- 📦 Для передачи данных во внешние системы (REST API, веб-сервисы).
- 🔄 Когда нужно сохранить структуру данных (вложенные массивы, объекты).
- 💾 Для записи в файл с возможностью последующего восстановления.
Ограничения:
- 🚫 В версиях ниже 8.3.10 нет встроенной поддержки
JSON— потребуется подключать внешнюю библиотеку. - 📏 Результирующая строка будет содержать служебные символы (
[,{,"), что не всегда удобно для отображения пользователю.
1. Сериализуйте массив в JSON.
2. Замените служебные символы с помощью СтрЗаменить():
СтрокаJSON = JSON.Записать(Массив);
ЧистаяСтрока = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрокаJSON, "[", ""), "]", ""), "\"", "");
-->
5. Метод СтрокаСоединения() — альтернатива для старых версий
В версиях 1С 8.2 и ранних 8.3 (до 8.3.6) отсутствует функция СоединитьСтроки(). Вместо неё можно использовать СтрокаСоединения() из библиотеки ПланОбмена:
Пример:
Массив = Новый Массив;
Массив.Добавить("А");
Массив.Добавить("Б");
Массив.Добавить("В");
Результат = ПланыОбмена.СтрокаСоединения(Массив, ", ");
// Результат: "А, Б, В"
Особенности метода:
- 🔧 Требует подключения библиотеки
ПланыОбмена(доступна в большинстве конфигураций на базе БСП). - 🐢 Работает медленнее, чем
СоединитьСтроки(), но стабильно в старых версиях. - ❌ Не поддерживает вложенные массивы и объекты (выдаст ошибку).
⚠️ Внимание: В конфигурациях без БСП (например, "1С:Бухгалтерия 7.7" или самописных решениях) этот метод недоступен. В таких случаях используйте цикл или создайте собственную функцию-аналог.
6. Специфические случаи: массивы объектов и бинарные данные
При работе с массивами объектов (СправочникСсылка, ДокументОбъект) или бинарными данными (ДвоичныеДанные) стандартные методы не подходят. Рассмотрим решения для таких сценариев.
Массив ссылок на справочники:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар1"));
МассивСсылок.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Товар2"));
Результат = СоединитьСтроки(
МассивСсылок.ВыгрузитьКолонку("Представление"),
"; "
);
// Результат: "Товар1; Товар2"
Массив двоичных данных:
МассивДвоичныхДанных = Новый Массив;
МассивДвоичныхДанных.Добавить(Новый ДвоичныеДанные("010203"));
МассивДвоичныхДанных.Добавить(Новый ДвоичныеДанные("040506"));
// Преобразуем каждый элемент в Base64
Результат = "";
Для Каждого Данные Из МассивДвоичныхДанных Цикл
Если Результат <> "" Тогда
Результат = Результат + "|";
КонецЕсли;
Результат = Результат + Base64Строка(Данные);
КонецЦикла;
// Результат: "AQI=|BAUG"
Для бинарных данных также можно использовать:
- 🔹
ПотокВПамяти+ЗаписатьДвоичныеДанные()для объединения в один поток. - 🔹 Хэширование каждого элемента (если нужна контрольная сумма).
При работе с объектами 1С всегда явно указывайте, какое свойство выводить (Наименование, Код, Представление). Никогда не полагайтесь на неявное преобразование в строку — это приведет к внутренним идентификаторам вроде "Справочник.Номенклатура:0x12345".
7. Оптимизация производительности для больших массивов
При обработке массивов с десятками тысяч элементов стандартные методы могут тормозить. Рассмотрим приемы оптимизации:
| Метод | Время выполнения (100к элементов) | Потребление памяти | Когда использовать |
|---|---|---|---|
СоединитьСтроки() | ~1.2 сек | Высокое | Массивы до 50к элементов |
Цикл с Строка() | ~2.5 сек | Среднее | Гибкая обработка элементов |
Запрос с СТРСОЕДИНИТЬ() | ~0.8 сек | Низкое | Массивы 50к+ элементов |
ПотокВПамяти + ЗаписатьСтроку() | ~0.5 сек | Очень низкое | Критически большие данные |
Рекомендации по оптимизации:
- Для массивов >50к элементов используйте
ЗапросилиПотокВПамяти. - Избегайте рекурсии при обработке вложенных массивов — заменяйте её на итеративные алгоритмы.
- Если возможны
Null, обрабатывайте их на этапе заполнения массива, а не при объединении. - Для частых операций кэшируйте результаты в
Соответствие.
Пример оптимизированного кода для 100к+ элементов:
Функция БыстроеОбъединение(Массив, Разделитель)
Поток = Новый ПотокВПамяти();
Запись = Новый ЗаписьТекста(Поток,, "UTF-8");
ПервыйЭлемент = Истина;
Для Каждого Элемент Из Массив Цикл
Если Не ПервыйЭлемент Тогда
Запись.ЗаписатьСтроку(Разделитель);
КонецЕсли;
Запись.ЗаписатьСтроку(Строка(Элемент));
ПервыйЭлемент = Ложь;
КонецЦикла;
Запись.Закрыть();
Возврат Поток.ЗакрытьИПолучитьТекст();
КонецФункции
FAQ: Частые вопросы по выводу массивов в строку
Как вывести массив структур в строку с разделителями?
Используйте комбинацию цикла и JSON.Записать() для каждой структуры:
Результат = "";
Для Каждого Структура Из МассивСтруктур Цикл
Если Результат <> "" Тогда
Результат = Результат + "|";
КонецЕсли;
Результат = Результат + JSON.Записать(Структура);
КонецЦикла;
Или формируйте строку вручную:
Результат = "";
Для Каждого Структура Из МассивСтруктур Цикл
Если Результат <> "" Тогда
Результат = Результат + "; ";
КонецЕсли;
Результат = Результат + Структура.Имя + " (" + Структура.Возраст + ")";
КонецЦикла;
Почему СоединитьСтроки() выдает ошибку "Тип не поддерживается"?
Ошибка возникает, если в массиве есть:
- Вложенные массивы (
ТипЗнч(Элемент) = Тип("Массив")). - Объекты, которые нельзя преобразовать в строку (например,
ДокументОбъектбез явного указания свойства). - Неопределенные значения (
Неопределено) в версиях ниже 8.3.10.
Решение: предварительно обработайте массив циклом, преобразуя каждый элемент в строку.
Как вывести массив в строку с переносами (каждый элемент на новой строке)?
Используйте символ переноса строки (Символы.ПС) в качестве разделителя:
Результат = СоединитьСтроки(Массив, Символы.ПС);
// Или для Windows-переносов:
Результат = СоединитьСтроки(Массив, Символы.ПС + Символы.ВК);
Для отображения в поле формы установите свойство МногострочныйРежим = Истина.
Можно ли вывести массив в строку без разделителей?
Да, передайте пустую строку в качестве разделителя:
Результат = СоединитьСтроки(Массив, "");
// Для массива ["А", "Б", "В"] результат будет "АБВ"
Остерегайтесь конкатенации чисел — они преобразуются в строки без разделителей:
СоединитьСтроки(Новый Массив(1, 2, 3), "") // Вернет "123"
Как обработать массив с Null-значениями?
Варианты решения:
- Замените
Nullна пустую строку или "NULL" перед объединением: - Используйте тернарный оператор в цикле:
Для Каждого Элемент Из Массив Цикл
Если Элемент = Неопределено Тогда
Элемент = "NULL";
КонецЕсли;
КонецЦикла;
Результат = "";
Для Каждого Элемент Из Массив Цикл
Результат = Результат + (Элемент = Неопределено ? "NULL" : Строка(Элемент)) + ", ";
КонецЦикла;
Результат = Левое(Результат, СтрДлина(Результат) - 2);