Работа с форматом JSON в среде 1С:Предприятие 8.3 является стандартной задачей при интеграции систем или обмене данными. Однако начинающие разработчики часто сталкиваются с трудностями, которые связаны не столько с самим форматом, сколько с особенностями клиент-серверной архитектуры платформы. Разберем типичные ошибки и выработаем надежный алгоритм выгрузки данных.
Рассмотрим ситуацию, когда при вызове метода ОткрытьФайл объекта ЗаписьJSON возникает исключение: «Каталог не обнаружен». Проанализируем основные причины этой проблемы, исходя из практики разработки на управляемых формах.
Во-первых, следует проверить синтаксическую корректность пути. Как было отмечено в обсуждении, пропущенное двоеточие в строке пути (например, с\Номенклатура.jsn вместо с:\Номенклатура.jsn) делает путь невалидным. Программа воспринимает такую запись не как абсолютный путь к диску, а как относительный путь, который она не может сопоставить с текущим рабочим каталогом сервера.
Во-вторых, крайне важно понимать, в каком контексте выполняется код. Если процедура помечена директивой &НаСервере, то операционная система будет искать указанный путь на серверном компьютере. Попытка записать файл напрямую на диск C: клиентского ПК из серверного контекста всегда будет приводить к ошибке, так как сервер «не видит» локальные диски пользователя. Кроме того, у пользователя, под которым запущена служба 1С (например, usr1cv8), часто нет прав на запись в корень диска C: даже на самом сервере.
Для решения этой проблемы мы рекомендуем использовать функцию КаталогВременныхФайлов(). Это гарантирует наличие прав на запись и корректность пути в любой операционной системе. Разберем, как это реализовать правильно.
Выясним, как структурировать код, чтобы выгрузить результат запроса. В 1С не существует прямой команды «выгрузить всё в один клик», поэтому мы применим последовательный подход: запрос — массив структур — сериализация.
Рассмотрим по шагам процесс трансформации данных:
Структура. Ключами структуры будут названия полей, которые мы хотим видеть в JSON.Массив. JSON-сериализатор 1С отлично работает с вложенными коллекциями.Запись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 более лаконичен, но имеет строгие ограничения. Если в вашем запросе присутствуют ссылки на справочники или документы (например, СкладСсылка), попытка прямой записи приведет к ошибке или выгрузке непонятного идентификатора.
Важные правила подготовки данных:
Выборка.Склад.Наименование или Строка(Выборка.Склад.УникальныйИдентификатор()).ЗаписатьJSON.Истина и Ложь автоматически преобразуются в true и false (без кавычек), что соответствует стандарту JSON.Поскольку мы создали файл на сервере в каталоге временных файлов, пользователь его не увидит. Нам необходимо передать эти данные на клиентское рабочее место. Рассмотрим наиболее эффективную схему с использованием временного хранилища.
Разберем последовательность действий в управляемом приложении:
&НаКлиенте
Процедура Выгрузить(Команда)
// Вызываем серверный метод, который вернет адрес во временном хранилище
РезультатВыгрузки = СформироватьФайлНаСервере();
Если РезультатВыгрузки.Успех Тогда
// Получаем файл из хранилища и сохраняем на диск пользователя
ПолучитьФайл(РезультатВыгрузки.АдресХранилища, "Nomenclature.json", Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СформироватьФайлНаСервере()
// ... (код формирования JSON, описанный выше) ...
// Читаем сформированный файл в двоичные данные
ДанныеФайла = Новый ДвоичныеДанные(ИмяФайла);
Адрес = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
Возврат Новый Структура("Успех, АдресХранилища", Истина, Адрес);
КонецФункции
Если в вашем результате запроса сотни тысяч строк, создание одного огромного массива структур может привести к нехватке оперативной памяти (Out of memory). В этом случае проанализируем метод потоковой записи.
Вместо формирования массива, мы пишем данные в файл «на лету»:
ЗаписьJSON.ЗаписатьНачалоМассива();
Пока Выборка.Следующий() Цикл
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("Name");
ЗаписьJSON.ЗаписатьЗначение(Выборка.Наименование);
ЗаписьJSON.ЗаписатьИмяСвойства("Price");
ЗаписьJSON.ЗаписатьЗначение(Выборка.Цена);
ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
ЗаписьJSON.ЗаписатьКонецМассива();
Этот метод более трудоемок в написании кода, но он позволяет обрабатывать практически неограниченные объемы данных, так как в памяти одновременно находится только одна строка запроса. Мы рекомендуем использовать именно этот способ для профессиональных интеграционных решений.
Таким образом, для успешной работы с JSON в 1С достаточно внимательно следить за контекстом исполнения (Клиент/Сервер), обеспечивать доступ к папкам через временные каталоги и правильно подготавливать данные из запроса, превращая ссылки в строковые представления.