Как отправить большие JSON файлы из 1С 7.7 на сайт

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Работа с современными веб-сервисами из платформы 1С:Предприятие 7.7 (так называемых «клюшек») сопряжена с рядом трудностей. Основная проблема заключается в том, что 1С 7.7 крайне чувствительна к объему оперативной памяти, выделяемой под строковые переменные. При попытке сформировать или передать строку объемом в 50–70 МБ (стандартный размер выгрузки товаров для Bitrix), система может аварийно завершить работу или выдать ошибку нехватки памяти. Рассмотрим, как решить задачу отправки больших JSON файлов эффективно и надежно.

Анализ проблемы: ограничения памяти в 1С 7.7

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

  1. Использование внешних утилит, которые умеют «пробрасывать» файл из файловой системы напрямую в HTTP-канал (например, cURL).
  2. Использование специализированных COM-объектов (MSXML2 или WinHttp), которые поддерживают передачу данных через потоки (Stream) без загрузки всего файла в строку 1С.

Решение 1: Использование утилиты cURL

Это самый надежный способ для работы с по-настоящему тяжелыми данными. Утилита 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 вообще не «трогает» содержимое тяжелого файла. Мы просто даем команду внешней программе, которая эффективно справляется с задачей.

Решение 2: Использование MSXML2.ServerXMLHTTP и ADODB.Stream

Если по каким-то причинам использование внешних .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:

Если сервер обрывает соединение до завершения загрузки, 1С 7.7 может «зависнуть» в ожидании ответа. В таких случаях использование метода с cURL предпочтительнее, так как у него есть встроенные механизмы таймаутов и повторных попыток.

Таким образом, мы выяснили, что для стабильной отправки тяжелых JSON файлов из «клюшек» лучше всего использовать cURL для максимальной надежности или связку MSXML2 + ADODB.Stream для работы без внешних файлов, строго соблюдая правила кодировки UTF-8.

← На главную