Часто перед разработчиками встает задача обеспечить пользователей самой актуальной версией инструмента без необходимости ручного обновления файлов на каждом рабочем месте. Идея кажется простой: хранить файл обработки (.epf) на сервере или в облаке и скачивать его при запуске. Однако на практике возникают сложности с протоколами передачи данных, правами доступа и механизмами подключения. Разберем подробно, как правильно реализовать этот механизм, избегая типичных ошибок.
Проанализируем типичную ошибку начинающих разработчиков. Метод КопироватьФайл предназначен для работы в рамках файловой системы или локальной сети (через протоколы SMB/Samba). Когда мы передаем в этот метод строку, начинающуюся с http:// или https://, платформа не может обработать ее как путь к файлу. В лучшем случае функция вернет ошибку, в худшем — создаст пустой или поврежденный файл. Для взаимодействия с веб-ресурсами в 1С реализованы специализированные объекты, такие как HTTPСоединение и HTTPЗапрос.
Современные веб-серверы практически повсеместно используют защищенный протокол HTTPS. Если ваша ссылка начинается с https://, простого создания объекта HTTPСоединение будет недостаточно — попытка подключения завершится ошибкой инициализации SSL. Рассмотрим, как правильно настроить параметры подключения.
Выясним причину необходимости ЗащищенноеСоединениеOpenSSL. Этот объект позволяет платформе проверить сертификат сервера и установить шифрованный канал связи. Проанализируем пример кода для инициализации такого соединения:
// Определяем параметры сервера и путь к файлу
Сервер = "ваша-платформа.рф";
ПутьНаСервере = "/files/update.epf";
// Создаем объект защищенного соединения
// Параметр Ложь в конструкторе позволяет игнорировать ошибки проверки сертификатов (не рекомендуется для продакшн)
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// Создаем соединение с указанием порта 443 для HTTPS
Соединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Защита);
После установки соединения нам необходимо отправить запрос на получение файла. Важно помнить, что файл обработки — это двоичные данные. Если попытаться прочитать ответ сервера как текст, структура .epf будет безвозвратно испорчена. Рассмотрим по шагам процесс получения данных и сохранения их во временный файл.
Для надежной работы приложения рекомендуется использовать временные каталоги пользователя. Это исключает проблемы с правами доступа к системным папкам, таким как «Program Files» или корневой каталог диска C:.
// Подготовим запрос
Запрос = Новый HTTPЗапрос(ПутьНаСервере);
Попытка
// Отправляем запрос серверу
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Данные успешно получены
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
ДвоичныеДанные.Записать(ИмяФайла);
// Теперь файл готов к подключению
Иначе
Сообщить("Ошибка сервера: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Не удалось соединиться с сервером обновлений.");
КонецПопытки;
Когда файл успешно скачан и сохранен на диск, его нужно подключить к сеансу. Начиная с версии 8.2, прямое открытие файлов внешних обработок на клиенте ограничено требованиями безопасности и особенностями архитектуры. Правильный путь — передать файл на сервер, подключить его через менеджер внешних обработок и вернуть имя подключения на клиент.
Разберем процедуру подключения на стороне сервера:
&НаСервере
Функция ПодключитьОбработкуНаСервере(ПутьКФайлу)
// Помещаем файл во временное хранилище
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
// Подключаем обработку. Третий параметр Ложь отключает безопасный режим (если требуется полный доступ)
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
Возврат ИмяОбработки;
КонецФункции
После получения ИмяОбработки мы можем программно вызвать форму этой обработки на клиенте:
&НаКлиенте
Процедура ЗапуститьОбновленнуюОбработку(ИмяОбработки)
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма");
КонецПроцедуры
Скачивать файл объемом в несколько мегабайт при каждом открытии — неэффективно. Проанализируем ситуацию: если обработка не менялась, пользователю достаточно открыть уже существующую копию. Чтобы реализовать это, создадим на веб-сервере небольшой текстовый файл version.txt.
Алгоритм будет следующим:
version.txt (он весит несколько байт)..epf.Если ваша конфигурация разработана на базе БСП, мы настоятельно рекомендуем использовать встроенный модуль ПолучениеФайловИзИнтернета. Это значительно упрощает код и делает его более отказоустойчивым, так как библиотека берет на себя обработку прокси-серверов, редиректов и специфических ошибок сети.
Пример использования БСП:
ПараметрыПолучения = ПолучениеФайловИзИнтернета.ПараметрыПолученияФайла();
ПараметрыПолучения.Вставить("ЗащищенноеСоединение", Новый ЗащищенноеСоединениеOpenSSL());
Результат = ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище(URL, ПараметрыПолучения);
Если Результат.Статус Тогда
// Обработка получена в виде адреса во временном хранилище
ИмяОбработки = ВнешниеОбработки.Подключить(Результат.Путь);
КонецЕсли;
Важный момент: после того как метод ВнешниеОбработки.Подключить() успешно выполнен, физический файл на диске больше не нужен. Платформа загрузила его структуру в память сеанса. Мы рекомендуем удалять временный файл сразу после вызова функции подключения, чтобы не засорять папку временных файлов пользователя. Также не забывайте использовать безопасный режим (параметр БезопасныйРежим в методе Подключить), если вы не доверяете источнику на 100%, чтобы ограничить доступ обработки к файловой системе сервера и реестру.