Как организовать автоматический перенос данных с веб-сайта в форму 1С 7.7

Программист 1С v7.7
← На главную

В процессе разработки на платформе 1С 7.7 часто возникает необходимость интеграции с внешними веб-сервисами для получения актуальной информации, например, данных о погоде, курсах валют или других динамически меняющихся объектов. Особенность версии 7.7 заключается в отсутствии встроенных современных инструментов для работы с протоколом HTTP «из коробки», поэтому нам потребуется использовать внешние системные компоненты Windows. Рассмотрим подробно, как реализовать автоматизированный процесс получения файлов с сайта и их отображения в интерфейсе программы.

Метод 1: Использование системных объектов WinHTTP и ADODB.Stream

Проанализируем наиболее надежный способ загрузки данных, который основан на использовании двух мощных COM-объектов: WinHttp.WinHttpRequest.5.1 для выполнения сетевого запроса и ADODB.Stream для обработки и сохранения полученных бинарных данных. Это решение позволяет гибко управлять процессом загрузки и корректно сохранять информацию на диск.

Для начала разберем инициализацию необходимых объектов. В 1С 7.7 это делается через функцию СоздатьОбъект. Важно обернуть этот процесс в блок Попытка...Исключение, так как в системе могут отсутствовать нужные библиотеки или права доступа.


Попытка
    // Создаем объект для выполнения HTTP-запросов
    httpRequest = СоздатьОбъект("winhttp.winhttprequest.5.1");
    
    // Создаем поток для работы с бинарными данными
    stream = СоздатьОбъект("adodb.stream");
    stream.type = 1; // Указываем тип данных: adTypeBinary (бинарный)
    stream.open();
    
    // Для более тонкой настройки можно использовать ScriptControl
    script = СоздатьОбъект("ScriptControl");
    script.language = "jscript";
    script.addObject("httpRequest", httpRequest);
    script.addObject("stream", stream);
Исключение
    Сообщить("Ошибка при инициализации системных компонентов: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

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


Процедура ЗагрузитьФайлСВебСайта(URL, ПутьКФайлу)
    Попытка 
        // Инициализируем GET-запрос к указанному адресу
        httpRequest.open("GET", URL, 0); // 0 - синхронный режим
        httpRequest.send();
        
        // Проверяем статус ответа (200 - успешно)
        КодОтвета = Число(httpRequest.Status);
        
        Если КодОтвета = 200 Тогда
            // Записываем полученное тело ответа в поток
            // Используем JScript через ScriptControl для корректной передачи бинарных данных
            script.eval("stream.write(httpRequest.responseBody);");
            
            // Сохраняем данные из потока в файл на диске
            // Параметр 2 означает adSaveCreateOverWrite (перезаписать, если файл существует)
            stream.saveToFile(ПутьКФайлу, 2);
            Сообщить("Данные успешно обновлены: " + ПутьКФайлу);
        Иначе
            Сообщить("Ошибка загрузки. Код ответа сервера: " + КодОтвета);
        КонецЕсли;
    Исключение
        Сообщить("Произошла критическая ошибка при обмене данными: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Метод 2: Интеграция через объект Поле HTML-документа (ActiveX)

Если задача состоит не просто в скачивании файла, а в его непосредственном отображении на форме без промежуточного сохранения, рассмотрим альтернативный вариант — использование ActiveX-объекта Microsoft Web Browser. Этот метод позволяет встроить полноценный мини-браузер прямо в форму 1С.

Разберем основные преимущества этого подхода:

  1. Поддержка современных форматов: Встроенный браузер самостоятельно обрабатывает форматы файлов (например, прозрачность в PNG), которые могут некорректно восприниматься стандартным объектом 1С 7.7.
  2. Отсутствие лишних файлов: Вам не нужно постоянно записывать и удалять временные файлы на жестком диске.
  3. Автоматическое масштабирование: Браузер позволяет управлять отображением контента через HTML/CSS.

Для реализации этого метода выполните следующие действия:

  1. Откройте форму обработки в конфигураторе.
  2. Вставьте Активный элемент (меню «Вставить» -> «Активный элемент»).
  3. В списке выберите Microsoft Web Browser.
  4. В коде модуля формы используйте метод Navigate для загрузки нужного адреса.

Процедура ПриОткрытии()
    // Укажите идентификатор вашего ActiveX элемента, например, WebBrowser1
    Попытка
        Форма.WebBrowser1.Navigate(АдресРесурса);
    Исключение
        // Обработка случая, если элемент не загрузился
    КонецПопытки;
КонецПроцедуры

Метод 3: Автоматизация процесса обновления по расписанию

Одной из ключевых задач является регулярное обновление информации (например, каждые 4 часа). Проанализируем способы реализации «робота», который будет выполнять эту работу автономно.

Вариант А: Использование ОбработкаОжидания

Если сессия 1С постоянно открыта на сервере или рабочем месте, можно использовать встроенную функцию ОбработкаОжидания. Она позволяет запускать процедуру через определенные интервалы времени (в секундах).


// В глобальном модуле или модуле формы
Процедура ОбновитьДанныеПоТаймеру()
    // Код вызова процедуры загрузки
    ЗагрузитьФайлСВебСайта(СсылкаНаСайт, ЛокальныйПуть);
КонецПроцедуры

// Запуск таймера (например, раз в час - 3600 секунд)
ОчиститьОчередь() // на всякий случай
Форма.ОбработкаОжидания("ОбновитьДанныеПоТаймеру", 3600);

Вариант Б: Планировщик задач Windows

Для полной автономности рекомендуется использовать стандартный Планировщик задач Windows. Вы можете настроить запуск 1С в определенное время с параметрами командной строки, которые заставят программу выполнить обновление и закрыться.

Пример командной строки запуска:

1cv7.exe enterprise /D"C:\PathToBase" /N"RobotUser" /P"Password" /C"ЗагрузитьДанные"

Внутри 1С в процедуре ПриНачалеРаботыСистемы необходимо считать параметр КомандаСистемы(), выполнить нужную обработку и вызвать ЗавершитьРаботуСистемы().

Решение проблемы кэширования данных

Часто программисты сталкиваются с тем, что после обновления файла на сервере 1С продолжает отображать старые данные. Это происходит из-за кэширования запросов на уровне операционной системы. Рассмотрим эффективный способ обхода этой ситуации.

Чтобы заставить систему каждый раз скачивать свежую версию, достаточно добавить в конец URL случайный или уникальный параметр, который не влияет на логику сервера, но делает ссылку уникальной для кэша Internet Explorer. Чаще всего используют текущую метку времени.


// Добавляем параметр для обхода кэша
УникальныйАдрес = СсылкаНаСайт + "?t=" + _GetPerformanceCounter();
ЗагрузитьФайлСВебСайта(УникальныйАдрес, ЛокальныйПуть);

Важные рекомендации:

Таким образом, мы разобрали комплексный подход к интеграции 1С 7.7 с внешними интернет-ресурсами. Сочетание методов прямого скачивания через потоки и использование элементов управления браузером позволяет решить практически любую задачу по автоматизации получения веб-контента.

← На главную