Разработка и Конфигурация · 11 мин
Как выгрузить массив в 1С: рабочие способы и готовый код
Как выгрузить массив в 1С: сериализация в строку, запись в файл, передача через COM и веб-сервисы. Готовый код, типичные ошибки и проверка результата.
Массив в 1С — встроенный тип данных, который напрямую нельзя записать в файл или передать во внешнюю систему: сначала его нужно сериализовать, то есть преобразовать в строку, XML, JSON или другой переносимый формат. В зависимости от задачи выгрузка массива означает разное: запись элементов в текстовый файл, передачу через COM-соединение между базами, отправку по HTTP в виде JSON или сохранение в хранилище значения.
Выбор способа зависит от того, куда уходят данные. Для обмена между двумя базами 1С удобнее всего ЗначениеВСтрокуВнутр или COMSafeArray, для интеграции с внешними системами — JSON, для отладки и логов — простая конкатенация элементов в строку. Ниже разобраны все рабочие варианты с готовым кодом, ограничениями и способами проверки результата.
Важно понимать ограничение платформы: массив в 1С может содержать значения любых типов, включая другие массивы, структуры и ссылки, но не все сериализаторы умеют работать со ссылочными типами. Перед выгрузкой стоит решить, что делать со ссылками — передавать представление, GUID или преобразовывать в структуру с нужными полями.
Что значит «выгрузить массив» и какой способ выбрать
Прежде чем писать код, определите приёмник данных. От этого зависит формат сериализации и набор ограничений. Типичные сценарии: передача массива между процедурами через параметры сеанса или временное хранилище, выгрузка в файл для обмена с другой программой, отправка по HTTP-запросу, передача между двумя базами 1С через COM или EnterpriseData.
Для обмена внутри экосистемы 1С подходят внутренние механизмы сериализации — они сохраняют типы значений без ручного описания. Для внешних систем нужен открытый формат: JSON предпочтительнее, так как его читают практически все языки и сервисы. Текстовый файл с разделителями — самый простой вариант для плоских массивов примитивных значений.
Как выбрать способ выгрузки
Выгрузка массива в 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Проверьте, что массив заполнен: МассивДанных.Количество() больше нуля
- 2Убедитесь, что элементы имеют сериализуемый тип (строки, числа, даты)
- 3Выберите формат: JSON для систем, построчный текст для ручной обработки
- 4Запишите данные в файл с явным указанием кодировки UTF-8
- 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 через методы ЗаписатьНачалоМассива и ЗаписатьЗначение объекта ЗаписьJSON.
При отладке обмена удобно выгружать массив в JSON и сохранять файл рядом с логом обмена. Если приёмник вернул ошибку, по сохранённому файлу можно точно восстановить, что было отправлено, и воспроизвести проблему без повторного запуска всей выгрузки.
FAQ
Можно ли выгрузить массив в XML вместо JSON?
Да. Используйте объект ЗаписьXML и функцию ЗаписатьXML, либо сериализатор XDTO, если нужен строгий контроль схемы. Для простых массивов примитивов подходит ручная запись: ЗаписатьНачалоЭлемента для каждого элемента и запись значения. JSON обычно компактнее и проще в чтении, XML нужен, когда приёмник требует именно его.
Как выгрузить двумерный массив (массив массивов)?
Вложенные массивы сериализуются теми же методами: ЗаписатьJSON корректно обработает массив массивов, превратив его во вложенные JSON-массивы. Для CSV придётся решить, как представлять вложенность — обычно внутренний массив соединяют разделителем в одну строку, а внешний записывают построчно.
Почему ЗначениеИзСтрокиВнутр возвращает ошибку в другой базе?
Наиболее вероятные причины: разные версии платформы с несовместимым внутренним форматом или повреждение строки при передаче (обрезка, смена кодировки). Проверьте, что строка передана без изменений, а версии платформ обеих баз совпадают или близки. Для межбазового обмена надёжнее JSON.
Как передать массив из клиентской процедуры на сервер?
Массивы передаются между клиентом и сервером как параметры вызова серверной процедуры напрямую, если содержат сериализуемые платформой типы. Для больших массивов или передачи между сеансами используйте ПоместитьВоВременноеХранилище и передавайте адрес хранилища.
Что делать, если массив содержит таблицу значений или другой сложный объект?
ЗаписатьJSON не сериализует таблицу значений напрямую. Преобразуйте её в массив структур: пройдите по строкам таблицы и для каждой сформируйте структуру с полями колонок. Полученный массив структур сериализуется в JSON штатно.
Как выгрузить массив очень большого размера без падения по памяти?
Не собирайте всю строку целиком. Используйте потоковую запись: для JSON — ЗаписьJSON с записью в файл через ОткрытьФайл и поэлементную запись между ЗаписатьНачалоМассива и ЗаписатьКонецМассива; для текста — ТекстовыйДокумент с периодической записью блоков на диск. Дополнительно выгружайте данные порциями из источника, а не одним запросом.
Что важно запомнить
Массив в 1С выгружается через сериализацию: JSON — для внешних систем, ЗначениеВСтрокуВнутр — для обмена между базами 1С, построчная запись — для простых файлов. Ссылки перед выгрузкой преобразуйте в структуры или строки, всегда указывайте кодировку файла и проверяйте результат обратным чтением и подсчётом элементов.