Как реализовать автоматическое обновление и запуск внешней обработки через интернет в 1С?

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

Часто перед разработчиками встает задача обеспечить пользователей самой актуальной версией инструмента без необходимости ручного обновления файлов на каждом рабочем месте. Идея кажется простой: хранить файл обработки (.epf) на сервере или в облаке и скачивать его при запуске. Однако на практике возникают сложности с протоколами передачи данных, правами доступа и механизмами подключения. Разберем подробно, как правильно реализовать этот механизм, избегая типичных ошибок.

Почему метод КопироватьФайл не подходит для скачивания из интернета

Проанализируем типичную ошибку начинающих разработчиков. Метод КопироватьФайл предназначен для работы в рамках файловой системы или локальной сети (через протоколы SMB/Samba). Когда мы передаем в этот метод строку, начинающуюся с http:// или https://, платформа не может обработать ее как путь к файлу. В лучшем случае функция вернет ошибку, в худшем — создаст пустой или поврежденный файл. Для взаимодействия с веб-ресурсами в 1С реализованы специализированные объекты, такие как HTTPСоединение и HTTPЗапрос.

Настройка защищенного соединения (HTTPS)

Современные веб-серверы практически повсеместно используют защищенный протокол HTTPS. Если ваша ссылка начинается с https://, простого создания объекта HTTPСоединение будет недостаточно — попытка подключения завершится ошибкой инициализации SSL. Рассмотрим, как правильно настроить параметры подключения.

Выясним причину необходимости ЗащищенноеСоединениеOpenSSL. Этот объект позволяет платформе проверить сертификат сервера и установить шифрованный канал связи. Проанализируем пример кода для инициализации такого соединения:


// Определяем параметры сервера и путь к файлу
Сервер = "ваша-платформа.рф"; 
ПутьНаСервере = "/files/update.epf";

// Создаем объект защищенного соединения
// Параметр Ложь в конструкторе позволяет игнорировать ошибки проверки сертификатов (не рекомендуется для продакшн)
Защита = Новый ЗащищенноеСоединениеOpenSSL();

// Создаем соединение с указанием порта 443 для HTTPS
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);

Программное скачивание файла и обработка данных

После установки соединения нам необходимо отправить запрос на получение файла. Важно помнить, что файл обработки — это двоичные данные. Если попытаться прочитать ответ сервера как текст, структура .epf будет безвозвратно испорчена. Рассмотрим по шагам процесс получения данных и сохранения их во временный файл.

Для надежной работы приложения рекомендуется использовать временные каталоги пользователя. Это исключает проблемы с правами доступа к системным папкам, таким как «Program Files» или корневой каталог диска C:.


// Подготовим запрос
Запрос = Новый HTTPЗапрос(ПутьНаСервере);

Попытка
    // Отправляем запрос серверу
    Ответ = Соединение.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        // Данные успешно получены
        ИмяФайла = ПолучитьИмяВременногоФайла("epf");
        ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
        ДвоичныеДанные.Записать(ИмяФайла);
        
        // Теперь файл готов к подключению
    Иначе
        Сообщить("Ошибка сервера: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Не удалось соединиться с сервером обновлений.");
КонецПопытки;

Подключение внешней обработки в память 1С

Когда файл успешно скачан и сохранен на диск, его нужно подключить к сеансу. Начиная с версии 8.2, прямое открытие файлов внешних обработок на клиенте ограничено требованиями безопасности и особенностями архитектуры. Правильный путь — передать файл на сервер, подключить его через менеджер внешних обработок и вернуть имя подключения на клиент.

Разберем процедуру подключения на стороне сервера:


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

После получения ИмяОбработки мы можем программно вызвать форму этой обработки на клиенте:


&НаКлиенте
Процедура ЗапуститьОбновленнуюОбработку(ИмяОбработки)
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры

Оптимизация: Проверка версии перед скачиванием

Скачивать файл объемом в несколько мегабайт при каждом открытии — неэффективно. Проанализируем ситуацию: если обработка не менялась, пользователю достаточно открыть уже существующую копию. Чтобы реализовать это, создадим на веб-сервере небольшой текстовый файл version.txt.

Алгоритм будет следующим:

  1. Сначала скачиваем version.txt (он весит несколько байт).
  2. Сравниваем номер версии в файле с номером версии текущей обработки (его можно хранить в макете или реквизите).
  3. Если версия на сервере выше — запускаем процесс скачивания .epf.
  4. Если версии совпадают — открываем локальный кэш.

Использование Библиотеки Стандартных Подсистем (БСП)

Если ваша конфигурация разработана на базе БСП, мы настоятельно рекомендуем использовать встроенный модуль ПолучениеФайловИзИнтернета. Это значительно упрощает код и делает его более отказоустойчивым, так как библиотека берет на себя обработку прокси-серверов, редиректов и специфических ошибок сети.

Пример использования БСП:


ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
ПараметрыПолучения.Вставить("ЗащищенноеСоединение", Новый ЗащищенноеСоединениеOpenSSL());

Результат = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(URL, ПараметрыПолучения);

Если Результат.Статус Тогда
    // Обработка получена в виде адреса во временном хранилище
    ИмяОбработки = ВнешниеОбработки.Подключить(Результат.Путь);
КонецЕсли;

Безопасность и очистка ресурсов

Важный момент: после того как метод ВнешниеОбработки.Подключить() успешно выполнен, физический файл на диске больше не нужен. Платформа загрузила его структуру в память сеанса. Мы рекомендуем удалять временный файл сразу после вызова функции подключения, чтобы не засорять папку временных файлов пользователя. Также не забывайте использовать безопасный режим (параметр БезопасныйРежим в методе Подключить), если вы не доверяете источнику на 100%, чтобы ограничить доступ обработки к файловой системе сервера и реестру.

← На главную