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

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

Как выгрузить массив в 1С: рабочие способы и готовый код

Как выгрузить массив в 1С: сериализация в строку, запись в файл, передача через COM и веб-сервисы. Готовый код, типичные ошибки и проверка результата.

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

Выбор способа зависит от того, куда уходят данные. Для обмена между двумя базами 1С удобнее всего ЗначениеВСтрокуВнутр или COMSafeArray, для интеграции с внешними системами — JSON, для отладки и логов — простая конкатенация элементов в строку. Ниже разобраны все рабочие варианты с готовым кодом, ограничениями и способами проверки результата.

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

Что значит «выгрузить массив» и какой способ выбрать

Прежде чем писать код, определите приёмник данных. От этого зависит формат сериализации и набор ограничений. Типичные сценарии: передача массива между процедурами через параметры сеанса или временное хранилище, выгрузка в файл для обмена с другой программой, отправка по HTTP-запросу, передача между двумя базами 1С через COM или EnterpriseData.

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

Маршрут решения

Как выбрать способ выгрузки

Приёмник — другая база 1С той же версии платформыИспользуйте ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр
Приёмник — внешняя система, веб-сервис или APIСериализуйте массив в JSON через ЗаписьJSON
Нужен человекочитаемый файл для проверки или импорта в ExcelЗапишите элементы построчно через ТекстовыйДокумент или в CSV
Массив нужно передать между сеансами или в фоновое заданиеПоместите его во временное хранилище через ПоместитьВоВременноеХранилище

Выгрузка массива в JSON

JSON — универсальный способ, если данные уходят за пределы 1С. Платформа предоставляет объект ЗаписьJSON, который корректно обрабатывает вложенные структуры, массивы и примитивные типы. Ссылочные типы автоматически не сериализуются — их нужно предварительно преобразовать в структуру с нужными полями или в строковое представление.

Функция МассивВJSON(МассивДанных)

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

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

ЗаписатьJSON(Запись, МассивДанных);

Возврат Запись.Закрыть();

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

Функция ЗаписатьJSON умеет сериализовать массивы, структуры, соответствия, даты (преобразуются в строку ISO 8601), числа, булево и строки. Если в массиве лежит ссылка на справочник или документ, вызов завершится ошибкой сериализации — поэтому типичный приём: пройти по массиву и заменить ссылки на структуры вида Новый Структура("Ссылка, Наименование", XMLСтрока(Элемент), Строка(Элемент)).

Полученную строку JSON дальше можно записать в файл, отправить в теле HTTP-запроса или вернуть из HTTP-сервиса. Для чтения на стороне 1С используется обратная пара — ЧтениеJSON и ПрочитатьJSON.

Выгрузка через ЗначениеВСтрокуВнутр

Функция ЗначениеВСтрокуВнутр сериализует значение во внутренний формат платформы. Это самый быстрый способ сохранить массив «как есть» вместе с типами элементов, если загружать его будет другая база 1С на совместимой версии платформы. Строку можно сохранить в текстовый файл, реквизит справочника или хранилище настроек.

СтрокаДанных = ЗначениеВСтрокуВнутр(МассивДанных);

Текст = Новый ТекстовыйДокумент;

Текст.УстановитьТекст(СтрокаДанных);

Текст.Записать("C:\Обмен\array_dump.txt", КодировкаТекста.UTF8);

Обратное восстановление выполняется функцией ЗначениеИзСтрокиВнутр. Главное ограничение: формат внутренний и недокументированный, совместимость между сильно различающимися версиями платформы не гарантируется. Для долгосрочного хранения и обмена с внешними системами этот способ не подходит — используйте JSON или XML.

Ещё одно ограничение: ссылки, сериализованные таким способом, при загрузке в другую базу будут «битыми», если там нет объектов с теми же внутренними идентификаторами. Способ надёжен для примитивных типов и структур данных без ссылочной составляющей.

Запись массива в текстовый файл или CSV

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

Текст = Новый ТекстовыйДокумент;

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

Текст.ДобавитьСтроку(Строка(Элемент));

КонецЦикла;

Текст.Записать("C:\Обмен\array.txt", КодировкаТекста.UTF8);

Для CSV замените добавление строки на сборку строки с разделителем: Текст.ДобавитьСтроку(СтрСоединить(МассивДанных, ";")). Учтите, что если сами значения содержат разделитель или перевод строки, файл «поедет» — для таких случаев нужны кавычки-ограничители или экранирование.

Порядок выгрузки массива в файл
  1. 1
    Проверьте, что массив заполнен: МассивДанных.Количество() больше нуля
  2. 2
    Убедитесь, что элементы имеют сериализуемый тип (строки, числа, даты)
  3. 3
    Выберите формат: JSON для систем, построчный текст для ручной обработки
  4. 4
    Запишите данные в файл с явным указанием кодировки UTF-8
  5. 5
    Откройте файл и сверьте количество строк с размером массива

Передача массива между базами и сеансами

Между двумя базами 1С массив передаётся через COM-соединение напрямую: объект AMassiv создаётся в подключённой базе вызовом Соединение.NewObject("Массив"), заполняется и возвращается из функции. Это работает, но COM-механизм медленный и требует настройки COM-класса на сервере, поэтому для регулярных обменов лучше сериализовать в строку и передавать текст.

Внутри одной базы для передачи массива между клиентом и сервером, в фоновое задание или между открытыми формами используется временное хранилище: Адрес = ПоместитьВоВременноеХранилище(МассивДанных, УникальныйИдентификаторФормы), а на приёмной стороне — ПолучитьИзВременногоХранилища(Адрес). Это штатный и быстрый способ без сериализации.

Для обмена через веб-сервисы или HTTP-сервисы массив описывается в схеме как повторяющийся элемент (для SOAP) или сериализуется в JSON в теле ответа. В HTTP-сервисе типичный код ответа: установить тело из строки JSON и заголовок Content-Type равным application/json.

Проверка результата выгрузки

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

Для файлов проверьте кодировку: если в приёмнике вместо кириллицы «кракозябры», файл записан не в той кодировке. Явно указывайте КодировкаТекста.UTF8 при записи и следите, чтобы принимающая сторона читала файл в той же кодировке. Для CSV, открываемых в Excel, иногда нужна кодировка Windows-1251 или добавление BOM.

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

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

Количество элементов
Норма

Число строк/элементов в приёмнике равно МассивДанных.Количество()

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

Записей меньше или больше — часть данных потеряна или продублирована

Читаемость JSON
Норма

ПрочитатьJSON возвращает массив без исключения

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

Ошибка парсинга — строка обрезана или содержит несериализованные значения

Кириллица в файле
Норма

Текст отображается корректно в редакторе и в приёмнике

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

«Кракозябры» — несовпадение кодировок записи и чтения

Типичные ошибки при выгрузке массива

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

Типичные ошибки
01
Попытка сериализовать массив со ссылками через ЗаписатьJSON — вызов падает с ошибкой; сначала преобразуйте ссылки в структуры или строки
02
Запись файла без указания кодировки — на другой машине текст читается неверно
03
Использование ЗначениеВСтрокуВнутр для обмена с внешней системой — формат понимает только 1С
04
Передача огромного массива целиком в одном HTTP-запросе — таймаут или отказ сервера; выгружайте порциями
05
СтрСоединить по массиву со значениями, содержащими разделитель — структура CSV-файла разрушается

Отдельная группа ошибок — производительность. Если массив содержит сотни тысяч элементов, сериализация и запись одним куском могут занять заметное время и съесть память. В таких случаях пишите в файл порциями, добавляя строки в ТекстовыйДокумент блоками, или используйте потоковую запись JSON через методы ЗаписатьНачалоМассива и ЗаписатьЗначение объекта ЗаписьJSON.

При отладке обмена удобно выгружать массив в JSON и сохранять файл рядом с логом обмена. Если приёмник вернул ошибку, по сохранённому файлу можно точно восстановить, что было отправлено, и воспроизвести проблему без повторного запуска всей выгрузки.
ПЗ
Практическое замечание

FAQ

Можно ли выгрузить массив в XML вместо JSON?

Да. Используйте объект ЗаписьXML и функцию ЗаписатьXML, либо сериализатор XDTO, если нужен строгий контроль схемы. Для простых массивов примитивов подходит ручная запись: ЗаписатьНачалоЭлемента для каждого элемента и запись значения. JSON обычно компактнее и проще в чтении, XML нужен, когда приёмник требует именно его.

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

Вложенные массивы сериализуются теми же методами: ЗаписатьJSON корректно обработает массив массивов, превратив его во вложенные JSON-массивы. Для CSV придётся решить, как представлять вложенность — обычно внутренний массив соединяют разделителем в одну строку, а внешний записывают построчно.

Почему ЗначениеИзСтрокиВнутр возвращает ошибку в другой базе?

Наиболее вероятные причины: разные версии платформы с несовместимым внутренним форматом или повреждение строки при передаче (обрезка, смена кодировки). Проверьте, что строка передана без изменений, а версии платформ обеих баз совпадают или близки. Для межбазового обмена надёжнее JSON.

Как передать массив из клиентской процедуры на сервер?

Массивы передаются между клиентом и сервером как параметры вызова серверной процедуры напрямую, если содержат сериализуемые платформой типы. Для больших массивов или передачи между сеансами используйте ПоместитьВоВременноеХранилище и передавайте адрес хранилища.

Что делать, если массив содержит таблицу значений или другой сложный объект?

ЗаписатьJSON не сериализует таблицу значений напрямую. Преобразуйте её в массив структур: пройдите по строкам таблицы и для каждой сформируйте структуру с полями колонок. Полученный массив структур сериализуется в JSON штатно.

Как выгрузить массив очень большого размера без падения по памяти?

Не собирайте всю строку целиком. Используйте потоковую запись: для JSON — ЗаписьJSON с записью в файл через ОткрытьФайл и поэлементную запись между ЗаписатьНачалоМассива и ЗаписатьКонецМассива; для текста — ТекстовыйДокумент с периодической записью блоков на диск. Дополнительно выгружайте данные порциями из источника, а не одним запросом.

Итог

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

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