Работа с современными веб-сервисами из платформы 1С:Предприятие 7.7 (так называемых «клюшек») сопряжена с рядом трудностей. Основная проблема заключается в том, что 1С 7.7 крайне чувствительна к объему оперативной памяти, выделяемой под строковые переменные. При попытке сформировать или передать строку объемом в 50–70 МБ (стандартный размер выгрузки товаров для Bitrix), система может аварийно завершить работу или выдать ошибку нехватки памяти. Рассмотрим, как решить задачу отправки больших JSON файлов эффективно и надежно.
Прежде чем перейти к коду, разберем ситуацию. В 1С 7.7 длинные строки хранятся в памяти специфическим образом, и операции с ними (склейка, передача в параметры) крайне медленны. Если мы попытаемся прочитать файл JSON в обычную строковую переменную через объект Текст, мы быстро упремся в лимиты. Поэтому наша стратегия должна строиться на одном из двух подходов:
Это самый надежный способ для работы с по-настоящему тяжелыми данными. Утилита cURL работает независимо от 1С и потребляет минимум ресурсов. Рассмотрим, как вызвать её из кода 1С и получить ответ от сайта.
Для начала подготовим команду. Нам нужно передать файл в теле запроса (POST), указать заголовки Content-Type и User-Agent, а также сохранить ответ сервера в текстовый файл для последующего анализа.
// Команда для выполнения в командной строке
// -X POST: метод запроса
// -H: заголовки
// --data-binary "@...": передача файла напрямую с диска
// > : перенаправление ответа в файл
КомандаКурла = "C:\curl\curl.exe -X POST -H ""Content-Type: application/json"" " +
"-H ""User-Agent: 1C-exchange"" " +
"--data-binary ""@" + ПутьКФайлу + """ " +
"https://ваш-сайт.ru/api/exchange > " + ПутьКФайлуОтвета;
// Выполняем команду через WScript.Shell
WShell = СоздатьОбъект("WScript.Shell");
КодВозврата = WShell.Run("%COMSPEC% /C " + КомандаКурла, 0, 1);
Если КодВозврата = 0 Тогда
// Читаем файл ответа
ТекстОтвета = СоздатьОбъект("Текст");
ТекстОтвета.Открыть(ПутьКФайлуОтвета);
// Проанализируем ответ сайта
КонецЕсли;
Преимущество этого метода в том, что 1С 7.7 вообще не «трогает» содержимое тяжелого файла. Мы просто даем команду внешней программе, которая эффективно справляется с задачей.
Если по каким-то причинам использование внешних .exe файлов запрещено политикой безопасности, воспользуемся системными библиотеками Windows. Чтобы обойти ограничение на размер строки, мы задействуем объект ADODB.Stream. Он позволяет передать файл в HTTP-запрос как двоичный поток.
Сначала создадим вспомогательную функцию для выбора доступного в системе объекта XMLHttpRequest. Проанализируем «зоопарк» версий библиотек в разных версиях Windows:
Функция СоздатьXMLHttpRequest(URL, Метод = "GET")
XMLHttpRequest = "";
Попытка
XMLHttpRequest = СоздатьОбъект("Msxml2.ServerXMLHTTP");
Исключение
Попытка
XMLHttpRequest = СоздатьОбъект("Msxml2.XMLHTTP.3.0");
Исключение
Попытка
XMLHttpRequest = СоздатьОбъект("Microsoft.XMLHTTP");
Исключение
Сообщить("Не удалось создать объект HTTP запроса!", "!");
Возврат 0;
КонецПопытки;
КонецПопытки;
КонецПопытки;
XMLHttpRequest.open(Метод, URL, 0); // 0 - синхронный режим
Возврат XMLHttpRequest;
КонецФункции
Теперь реализуем отправку файла. Важно: при использовании ADODB.Stream мы не читаем текст в 1С, а передаем сам объект Stream в метод send().
URL = "https://ваш-сайт.ru/api/exchange";
HTTP = СоздатьXMLHttpRequest(URL, "POST");
Если ТипЗначенияСтр(HTTP) = "Объект" Тогда
HTTP.setRequestHeader("Content-Type", "application/json");
HTTP.setRequestHeader("User-Agent", "1C-exchange");
// Используем ADODB.Stream для работы с файлом
Данные = СоздатьОбъект("ADODB.Stream");
Данные.Type = 1; // Binary
Данные.Open();
Данные.LoadFromFile(ПутьКФайлуJSON);
// Отправляем поток напрямую
Попытка
HTTP.send(Данные);
ОтветСервера = HTTP.responseText;
Сообщить("Ответ сайта: " + ОтветСервера);
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Данные.Close();
КонецЕсли;
Рассмотрим важный аспект: кодировка. 1С 7.7 работает в кодировке Windows-1251 (ANSI), в то время как большинство современных веб-сайтов (и Bitrix в частности) ожидают JSON в формате UTF-8 без метки BOM.
Если вы просто сохраните файл встроенными средствами 1С (Текст.Записать()), сервер выдаст ошибку "Request body must contains a valid json", так как не сможет распознать кириллицу. При формировании JSON через ADODB.Stream обязательно установите кодировку:
// Пример записи в UTF-8 через ADODB.Stream
Поток = СоздатьОбъект("ADODB.Stream");
Поток.Type = 2; // Text
Поток.Charset = "utf-8";
Поток.Open();
Поток.WriteText(СтрокаСДанными);
Поток.SaveToFile(ПутьКФайлу, 2);
Поток.Close();
Внимание: Стандартный ADODB.Stream при сохранении в UTF-8 добавляет в начало файла 3 байта (BOM). Если ваш сайт на Bitrix их не «переваривает», файл придется пересохранять в бинарном режиме, обрезая первые три байта. Это критично для валидности JSON.
Проанализируем ситуацию, когда даже правильный код 1С не помогает. Если файл имеет объем 70 МБ, проверьте настройки вашего веб-сервера (Nginx/Apache) и PHP:
php.ini также должны позволять обработать такой объем данных.Если сервер обрывает соединение до завершения загрузки, 1С 7.7 может «зависнуть» в ожидании ответа. В таких случаях использование метода с cURL предпочтительнее, так как у него есть встроенные механизмы таймаутов и повторных попыток.
Таким образом, мы выяснили, что для стабильной отправки тяжелых JSON файлов из «клюшек» лучше всего использовать cURL для максимальной надежности или связку MSXML2 + ADODB.Stream для работы без внешних файлов, строго соблюдая правила кодировки UTF-8.