Как правильно выгрузить данные в JSON в 1С: решение проблем с путями и примерами кода

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с форматом JSON в среде 1С:Предприятие 8.3 является стандартной задачей при интеграции систем или обмене данными. Однако начинающие разработчики часто сталкиваются с трудностями, которые связаны не столько с самим форматом, сколько с особенностями клиент-серверной архитектуры платформы. Разберем типичные ошибки и выработаем надежный алгоритм выгрузки данных.

Анализ ошибки «Каталог не обнаружен»

Рассмотрим ситуацию, когда при вызове метода ОткрытьФайл объекта ЗаписьJSON возникает исключение: «Каталог не обнаружен». Проанализируем основные причины этой проблемы, исходя из практики разработки на управляемых формах.

Во-первых, следует проверить синтаксическую корректность пути. Как было отмечено в обсуждении, пропущенное двоеточие в строке пути (например, с\Номенклатура.jsn вместо с:\Номенклатура.jsn) делает путь невалидным. Программа воспринимает такую запись не как абсолютный путь к диску, а как относительный путь, который она не может сопоставить с текущим рабочим каталогом сервера.

Во-вторых, крайне важно понимать, в каком контексте выполняется код. Если процедура помечена директивой &НаСервере, то операционная система будет искать указанный путь на серверном компьютере. Попытка записать файл напрямую на диск C: клиентского ПК из серверного контекста всегда будет приводить к ошибке, так как сервер «не видит» локальные диски пользователя. Кроме того, у пользователя, под которым запущена служба 1С (например, usr1cv8), часто нет прав на запись в корень диска C: даже на самом сервере.

Для решения этой проблемы мы рекомендуем использовать функцию КаталогВременныхФайлов(). Это гарантирует наличие прав на запись и корректность пути в любой операционной системе. Разберем, как это реализовать правильно.

Алгоритм выгрузки результата запроса в JSON

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

Рассмотрим по шагам процесс трансформации данных:

  1. Подготовка данных: Мы обходим результат запроса и для каждой строки создаем объект Структура. Ключами структуры будут названия полей, которые мы хотим видеть в JSON.
  2. Формирование коллекции: Все созданные структуры мы помещаем в объект Массив. JSON-сериализатор 1С отлично работает с вложенными коллекциями.
  3. Запись в файл: Используем объект ЗаписьJSON для формирования итогового текста.

Посмотрим на практический пример кода, который можно использовать в обработке:


&НаСервере
Процедура ВыгрузитьНоменклатуруВJSONНаСервере()
    
    // 1. Инициализируем запись
    ЗаписьJSON = Новый ЗаписьJSON;
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто); // Для красивого форматирования
    
    // Определяем путь во временном каталоге сервера
    ИмяФайла = КаталогВременныхФайлов() + "nomenclature_export.json";
    ЗаписьJSON.ОткрытьФайл(ИмяФайла, , , ПараметрыЗаписиJSON);
    
    // 2. Выполняем запрос к данным
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Номенклатура.Наименование КАК Наименование,
        |	Номенклатура.Артикул КАК Артикул,
        |	Номенклатура.Цена КАК Цена
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура";
        
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    // 3. Собираем массив структур
    МассивОбъектов = Новый Массив;
    
    Пока Выборка.Следующий() Цикл
        ДанныеСтроки = Новый Структура;
        ДанныеСтроки.Вставить("Name", Выборка.Наименование);
        ДанныеСтроки.Вставить("SKU", Выборка.Артикул);
        ДанныеСтроки.Вставить("Price", Выборка.Цена);
        
        МассивОбъектов.Добавить(ДанныеСтроки);
    КонецЦикла;
    
    // 4. Сериализация в JSON
    ЗаписатьJSON(ЗаписьJSON, МассивОбъектов);
    ЗаписьJSON.Закрыть();
    
КонецПроцедуры

Нюансы работы с типами данных и ссылками

Проанализируем ситуацию со сложными типами данных. В отличие от XML, формат JSON более лаконичен, но имеет строгие ограничения. Если в вашем запросе присутствуют ссылки на справочники или документы (например, СкладСсылка), попытка прямой записи приведет к ошибке или выгрузке непонятного идентификатора.

Важные правила подготовки данных:

Передача файла с сервера на клиент

Поскольку мы создали файл на сервере в каталоге временных файлов, пользователь его не увидит. Нам необходимо передать эти данные на клиентское рабочее место. Рассмотрим наиболее эффективную схему с использованием временного хранилища.

Разберем последовательность действий в управляемом приложении:


&НаКлиенте
Процедура Выгрузить(Команда)
    
    // Вызываем серверный метод, который вернет адрес во временном хранилище
    РезультатВыгрузки = СформироватьФайлНаСервере();
    
    Если РезультатВыгрузки.Успех Тогда
        // Получаем файл из хранилища и сохраняем на диск пользователя
        ПолучитьФайл(РезультатВыгрузки.АдресХранилища, "Nomenclature.json", Истина);
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция СформироватьФайлНаСервере()
    
    // ... (код формирования JSON, описанный выше) ...
    
    // Читаем сформированный файл в двоичные данные
    ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
    Адрес = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
    
    Возврат Новый Структура("Успех, АдресХранилища", Истина, Адрес);
    
КонецФункции

Потоковая запись для больших объемов данных

Если в вашем результате запроса сотни тысяч строк, создание одного огромного массива структур может привести к нехватке оперативной памяти (Out of memory). В этом случае проанализируем метод потоковой записи.

Вместо формирования массива, мы пишем данные в файл «на лету»:


ЗаписьJSON.ЗаписатьНачалоМассива();
Пока Выборка.Следующий() Цикл
    ЗаписьJSON.ЗаписатьНачалоОбъекта();
    
    ЗаписьJSON.ЗаписатьИмяСвойства("Name");
    ЗаписьJSON.ЗаписатьЗначение(Выборка.Наименование);
    
    ЗаписьJSON.ЗаписатьИмяСвойства("Price");
    ЗаписьJSON.ЗаписатьЗначение(Выборка.Цена);
    
    ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
ЗаписьJSON.ЗаписатьКонецМассива();

Этот метод более трудоемок в написании кода, но он позволяет обрабатывать практически неограниченные объемы данных, так как в памяти одновременно находится только одна строка запроса. Мы рекомендуем использовать именно этот способ для профессиональных интеграционных решений.

Таким образом, для успешной работы с JSON в 1С достаточно внимательно следить за контекстом исполнения (Клиент/Сервер), обеспечивать доступ к папкам через временные каталоги и правильно подготавливать данные из запроса, превращая ссылки в строковые представления.

← На главную