1с получить файл по http
В этой статье я попробую рассказать о том, какими средствами располагает технологическая платформа 1С для работы с протоколом FTP. Первая часть статьи — теоретическая, вторая — практические примеры. Отмечу, что при написании статьи использовалась технологическая платформа версии 8.3.12.1595.
Общая информация
Для работы с протоколом FTP у технологической платформы 1С имеется два главных объекта — FTPСоединение и FTPФайл, кроме них существует объект ЗащищенноеСоединениеOpenSSL — который используется для подключения к FTPS-серверам (не следует путать с SFTP), а также объект ИнтернетПрокси — который используется для соединения с FTP-сервером через прокси-сервер.
FTPСоединение ключевой объект для работы с FTP в 1С — именно через этот объект происходит и соединение с FTP/FTPS сервером и все дальнейшие действия. Все параметры для соединения с сервером указываются в конструкторе объекта.
FTPФайл служит для получения информации о каталогах и файлах на FTP-сервере — этот объект позволяет получить информацию по объекту на FTP-сервере: имя, путь расширение, размер и тд.
ИнтернетПрокси позволяет указать прокси-сервер используемый для соединения с FTP/FTPS сервером — параметры для подключения к прокси-серверу указываются методом Установить(). Использование свойств «Пароль» и «Пользователь» нежелательно, так как эти свойства являются устаревшими.
ЗащищенноеСоединениеOpenSSL создает защищенное соединение OpenSSL — предоставляет возможность организовать защищенное соединение с FTP-сервером, также имеется возможность конкретный сертификат клиента и/или сертификат удостоверяющего центра.
Практические задачи при работе с FTP
В качестве практических примеров рассмотрим все операции которые позволяет выполнить объект FTPСоединение.
Как подключиться к серверу FTP?
Параметры для подключения указываются в конструкторе, сами параметры достаточно стандартны. Отдельно скажу про два параметра:
Мне надо реализовать скачивание одного файла с одного стороннего ресурса. Пытался разобраться на примере стандартной обработки "Обновление конфигурации", но не смог, слишком уж там всё сложно. =)
Мне всего-то надо скачать один файл с ресурса, доступ к которому полностью открыт .
Может, у кого есть пример, как это делается?
Заодно мне были бы очень интересны примеры работы с zip-архивами из 1с, потому что файл, который мне надо скачать, - это zip-архив, который после надо распаковать.
> Мне надо реализовать скачивание одного файла с одного стороннего ресурса
Скачивание файла через http происходит через функцию "КопироватьФайл",
например (скачивание с сайта Сбербанка):
ИмяФайлаИсточника ;
ИмяФайлаПриемника = "C:\sbrf_karty_GoldAeroflot.pdf";
КопироватьФайл(ИмяФайлаИсточника, ИмяФайлаПриемника);
> примеры работы с zip-архивами из 1с, потому что файл, который мне надо скачать,
> - это zip-архив, который после надо распаковать
ПарольНаАрхив = "";
ИмяКаталога = "C:\Tmp\";
ZIP = Новый ЧтениеZipФайла();
ZIP.Открыть(ИмяФайлаПриемника, ПарольНаАрхив);
ZIP.ИзвлечьВсе(ИмяКаталога, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
ZIP.Закрыть();
nikolayvg; ErrorEd88; Rustam10; WinV; RizhkovSergio; ViteG; Xershi; MsDjuice; vithak; -ioan-; adhocprog; + 11 – Ответить
Как варианты:
1. Через веб-сервисы напрямую. Если содержимое файла xml или текст, то делаем простейший веб сервис, в нем один метод который будет иметь параметры авторизации + параметры по которым ты собираешься получить данные. Возвращаешь потоком или xml или текст и уже на стороне своего приложения творишь с ним что надо.
PS перечитал еще раз вопрос, понял что нета задача;) Описанный вариант если файл надо отдать
C zip-ом разобрался.
alexsiswx, в zip-е dbf-ки. :)
Жаль, конечно, что "КопироватьФайл()" не даёт никакого отображения. Ладно у меня архив маленький, пару метров. Подвисание терпимое. А если бы больше был, было бы не очень удобно.
Или как-то можно прикрутить прогресс-бар к процессу выполнения процедуры "КопироватьФайл()"?
Нет, через КопироватьФайл прогресс бар не прикрутить.
Но с прогресс баром все равно проблемы будут, не уверен что можно сделать получение файла средствами 1С с индикацией процессаю
Правильно ли я понял, что при таком варианте процесс копирования с точки зрения наглядности для обычного юзера никак не изменится?
P.S. :
а вот такой вопрос : можно ли в 1С запускать процессы потоками? То есть запустить КопироватьФайл() как-то параллельным потоком, чтобы окно обработки не повисло. В таком случае можно было бы поставить подобие прогресс бара: бегунок со словами, что идёт процесс загрузки, который пропадает после окончания копирования. Я просто не знаю, поддерживает ли 1С параллельные потоки, и, если поддерживает, то как ими вообще пользоваться.
Тестировалась на платформе 8.3.8 в режиме совместимости 8.2.13, а также с отключенным режимом совместимости.
Прикладываю обработку, которая в качестве примера загружает картинки по защищенному и незащищенному протоколам. Обработка для примера написана на управляемых формах, но процедура работает также и на обычных формах.
Специальные предложения
Процедура не универсальна. Она, например, не анализирует то, что было на веб-сервере перемещено и отдает статус 301 (страница, которая была перемещена и по старому адресу происходит редирект).
Вот универсальная, автор Поручик (если не ошибаюсь):
Еще можно использовать стандартную процедуру
Просмотры 22376
Загрузки 17
Рейтинг 13
Создание 17.05.17 08:01
Обновление 17.05.17 08:01
№ Публикации 622811
Конфигурация Конфигурации 1cv8
Операционная система Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Не указано
См. также
Конвертация любых адресов, написанных в свободной форме, к ФИАС Промо
Допустим у нас есть база с адресами клиентов, и написаны они могут быть как душе угодно. С опечатками, без индексов, без разделителей, в совершенно любом формате. Вот было бы здорово иметь функцию, которая одним нажатием кнопки преобразует любую белиберду к строгому представлению адреса по ФИАС? Восстановит индекс, исправит опечатки и вернёт на 100% валидный адрес. Для всех, кто мечтательно сказал "ДА!", выкладываю данную обработку.
2 стартмани
30.06.2020 11176 100 XilDen 15
Сервис push-уведомлений для 1С (Push Notification Service For 1C - PNS4OneS)
1 стартмани
02.02.2022 4559 18 ltfriend 5
Расширение конфигурации для Web-доступа к 1С (1С в роли back-end)
Для реализации того, чтобы 1С формировала и отдавала страницу, которую можно было бы открыть через браузер было написано расширение, которое позволяет публиковать из 1С произвольные ресурсы, будь то API, сайт или изображения / прочие файлы.
1 стартмани
01.04.2021 11841 13 SaschaG 4
Работа с картами в 1С на примере бесплатной библиотеки Leaflet
Разработка функционала отображения и выбора пунктов доставки на карте прямо в 1С с помощью бесплатной библиотеки Leaflet. Тестирование производилось на платформе 8.3.15.1534 на тонком клиенте.
1 стартмани
31.03.2021 14948 49 Parsec1C 18
Модуль обмена с QIWI Промо
Компании, которые используют систему моментальных платежей QIWI, ценят ее за удобство по скорости выплат и для платежей по запросу. Но такие переводы сложны для учета, а при большом объеме проводимых операций отнимают много времени и превращаются в дополнительную головную боль. Мы сотрудничали с компаниями, которые отправляют большое количество платеже на QIWI, и часто слышали боль бухгалтеров о том, как им сложно работать с такими переводами. Поэтому мы автоматизировали выплаты через QIWI в 1С и создали модуль интеграции 1С c API QIWI Wallet и QIWI TopUp.
5 стартмани
25.05.2020 10640 1 Neti 10
BIM: взаимодействие с платформой Autodesk Forge
Предлагаемый пример демонстрирует широкие возможности для взаимодействия «1С:Предприятие» с платформой Autodesk Forge и позволяет вам получить базовые представления о применения технологий информационного моделирования в строительстве. Поддерживаются все версии платформы от 8.3.12 и выше до 8.3.18.
1 стартмани
25.11.2020 58116 13 kandr 3
1 стартмани
02.10.2020 20410 7 hpi 17
1 стартмани
29.06.2020 19610 18 shmalevoz 22
Односторонний файловый обмен с сайтом по ftp (1C 2 Web) Промо
Подходит под любую конфигурацию на управляемом интерфейсе на базе БСП 2.4.4 и выше. Позволяет гибко настроить выгрузку, практически любых, данных по расписанию на сервер ftp вашего ресурса. Ведение лога процесса выгрузки также предусмотрено.
Предлагаю вашему вниманию функцию, позволяющую получить файл с интернета, в том числе, на которые установлен редирект.
&НаСервере
Процедура Пример()
файл = Новый Файл(ИмяФайла);
&НаСервереБезКонтекста
Функция ПолучитьФайлССервера(ФайлНаВебСервере)
ВремКаталог = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ВремКаталог);
ПараметрыПолученияФайлов = Новый Структура;
ПараметрыПолучения = Новый Структура(«ИмяФайла»);
ПараметрыПолучения. Вставить(«ИмяФайла», ВремКаталог);
ИмяСервера = URLРазделенный.ИмяСервера;
ПутьКФайлуНаСервере = URLРазделенный.ПутьКФайлуНаСервере;
Протокол = URLРазделенный.Протокол;
Заголовки = Новый Соответствие;
СписокФайлов = новый Массив;
ИмяФайла = ВремКаталог + «\temp.htm»;
&НаСервереБезКонтекста
Функция РазделитьURL(Знач URL) Экспорт
&НаСервереБезКонтекста
Функция СтруктураURI(Знач СтрокаURI) Экспорт
// схема
Схема = «»;
Позиция = Найти(СтрокаURI, «://»);
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция — 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;
// Строка соединения и путь на сервере.
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = «»;
Позиция = Найти(СтрокаСоединения, «/»);
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция — 1);
КонецЕсли;
// Информация пользователя и имя сервера.
СтрокаАвторизации = «»;
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, «@»);
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция — 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;
// логин и пароль
Логин = СтрокаАвторизации;
Пароль = «»;
Позиция = Найти(СтрокаАвторизации, «:»);
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция — 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;
// хост и порт
Хост = ИмяСервера;
Порт = «»;
Позиция = Найти(ИмяСервера, «:»);
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция — 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить(«Схема», Схема);
Результат.Вставить(«Логин», Логин);
Результат.Вставить(«Пароль», Пароль);
Результат.Вставить(«ИмяСервера», ИмяСервера);
Результат.Вставить(«Хост», Хост);
Результат.Вставить(«Порт», ?(ПустаяСтрока(Порт), Неопределено, Число(Порт)));
Результат.Вставить(«ПутьНаСервере», ПутьНаСервере);
Местный босс - администратор
В статье собран мой опыт по передаче данных на веб-сервер.
В ходе реализации одного проекта потребовалось организовать автоматическую передачу данных на веб-сервер посредством регламентного задания.
Покопавшись прежде всего в мануалах, синтаксис-помощнике 1С Предприятия, порыскав в Сети, с удивлением обнаружил наличие отсутствия каких-либо вменяемых материалов по теме. Вернее, материалы в Сети есть, но там больше вопросы с абстрактными ответами.
Все нижеприведённые примеры кода всего лишь примеры, хоть и взяты из рабочей конфигурации.
Прежде всего необходимо создать файл отправки данных (собственно содержимое POST-запроса) и, при необходимости, подготовить двоичные данные.
Определяем разделитель разделов — границу boundary в POST-запросе в формате RFC (подробнее MIME: Организация данных ). В качестве границы может быть использована строка, состоящая из латинских букв и цифр.
Чтобы ничего не выдумывать, воспользуемся штатным классом 1С Предприятия УникальныйИдентификатор .
Содержимое файла ответа будет представлять собой какой-либо контент, отданный скриптом на стороне веб-сервера агенту пользователя. Подробнее смотрите пример скрипта php и скриншот ниже.
Подготавливаем двоичные данные. В моём случае это файл архива zip, но может быть что угодно, хоть изображение.
Передача содержимого файла
В 1С Предприятии отсутствуют средства чтения двоичных файлов в обычную строку, как в PHP или PERL.
Одним из способов получения строкового содержимого двоичного файла является кодирование с помощью штатных функций Base64Строка() или XMLСтрока(), при этом размер передаваемых данных увеличивается примерно на 30%. Декодировать содержимое файла на сервере можно при помощи функции php base64_decode() или аналогичных для используемого вами серверного ПО.
Другой способ состоит в использовании штатной функции ОбъединитьФайлы(, ) (подробнее см. в СП). В этом случае формирование файла POST-запроса будет происходить немного сложнее.
Оба способа описаны ниже.
Впрочем, двоичные данные лучше закодировать, иначе при приёме на веб-сервере файл может быть повреждён или не принят вовсе, если он будет содержать URL-значащие символы. Особенно это касается XML-подобных или иных текстовых файлов.
Следует также помнить об ограничениях хостинга и контролировать размер передаваемых данных. Как правило, для php это 2Мб. (см. файл /usr/local/php5/php.ini)
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M
В противном случе, на веб-сервере вы получите пустой POST-запрос.
Читайте также: