Интернет. Работа с файлами в 1С 8.x
- Как подлючиться к FTP серверу из 1с 8.3, 8.2
- Как искать файлы по FTP из 1с 8.3, 8.2
- Как скачивать файлы по FTP из 1с 8.3, 8.2
- Как передавать файлы по FTP из 1с 8.3, 8.2
- Как получить страницу сайта через http-запрос из 1с 8.3, 8.2
- Как обработать перенаправление в http-запросе из 1с 8.3, 8.2
- Как сохранить картинку с сайта через http-запрос из 1с 8.3, 8.2
- Как послать защищенный https запрос к серверу из 1с 8.3, 8.2
- Как установить заголовки http-запроса из 1с 8.3, 8.2
- Как указать прокси для http-запроса из 1с 8.3, 8.2
- Как послать post-запрос через http из 1с 8.3, 8.2
Как подлючиться к FTP серверу из 1с 8.3, 8.2
&НаКлиенте
Функция ПодключитьсяКFTPСерверу()
Соединение = Новый FTPСоединение(
"0.0.0.0", // адрес ftp сервера
21, // порт сервера
"user", // имя пользователя
"123", // пароль пользователя
Неопределено, // прокси не используется
Истина, // пассивный режим работы
0, // таймаут (0 - без ограничений)
Неопределено // незащищенное соединение
);
// Для случаев, когда у ftp сервера нет возможности
// обращаться к нам (мы находимся за межсетевым экраном)
// следует использовать пассивный режим работы.
Возврат Соединение;
КонецФункции
Как искать файлы по FTP из 1с 8.3, 8.2
&НаКлиенте
Процедура ПоискФайловПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
// Найдём конкретный файл по его полному адресу.
// Внимание! Используем прямые слеши.
НайденныеФайлы = Соединение.НайтиФайлы("/data/1.txt");
Если НайденныеФайлы.Количество() > 0 Тогда
Файл = НайденныеФайлы[0];
// и получим следующую информацию о нём:
Сообщить("Имя: " + Файл.ПолноеИмя);
Сообщить("Это файл: " + Файл.ЭтоФайл());
Сообщить("Это каталог: " + Файл.ЭтоКаталог());
Сообщить("Размер: " + Файл.Размер() + " байт");
Сообщить("Атрибут только чтение: " + Файл.ПолучитьТолькоЧтение());
Сообщить("Атрибут скрытый: " + Файл.ПолучитьНевидимость());
Сообщить("Атрибут время изменения: " + Файл.ПолучитьВремяИзменения());
КонецЕсли;
// Найдём все папки и файлы в корневом каталоге
НайденныеФайлы = Соединение.НайтиФайлы(
"/", // ищём в корневом каталоге
"*" // любые файлы (здесь можно задать маску)
);
Для Каждого Файл Из НайденныеФайлы Цикл
Сообщить(Файл.ПолноеИмя);
КонецЦикла;
// Найдём все файлы с расширением .txt в папке data
НайденныеФайлы = Соединение.НайтиФайлы(
"/data", // ищём в определенной папке
"*.txt" // по определенной маске
);
КонецПроцедуры
Как скачивать файлы по FTP из 1с 8.3, 8.2
&НаКлиенте
Процедура ПолучениеФайловПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
ПапкаДляСохранения = СлужебныйНаКлиенте.СоздатьПапкуДляЭкспериментов();
// Скачаем "trade_exchange/01.01.2017.xml"
// Внимание! Используем прямые слеши.
Соединение.Получить(
"trade_exchange/01.01.2017.xml", // что качаем
ПапкаДляСохранения + "/01.01.2017.xml" // куда качаем
);
Сообщить("Сохранили файл в " + ПапкаДляСохранения);
КонецПроцедуры
Как передавать файлы по FTP из 1с 8.3, 8.2
&НаКлиенте
Процедура ПередачаФайловПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
// Создадим случайный текстовый файл.
Папка = СлужебныйНаКлиенте.СоздатьПапкуДляЭкспериментов();
Служебный.СоздатьПроизвольныйТекстовыйФайл(
Папка + "/info.txt");
// Запишем этот файл на сервер по ftp в папку trade_exchange
// Внимание! Используем прямые слеши.
Соединение.Записать(
Папка + "/info.txt", // что записываем
"/trade_exchange/info.txt" // куда записываем
);
Сообщить("Передали файл по FTP.");
КонецПроцедуры
&НаКлиенте
Процедура ДругиеОперацииПоFTP(Команда)
// Функция подключения определена выше.
Соединение = ПодключитьсяКFTPСерверу();
// Установим текущий каталог.
Соединение.УстановитьТекущийКаталог("/");
/// Как создать новый каталог по FTP из 1с 8.3, 8.2
Соединение.СоздатьКаталог("/NewBin");
/// Как удалить каталог по FTP вместе с содержимым из 1с 8.3, 8.2
Соединение.Удалить("/trade_exchange");
/// Как удалить файлы по FTP из 1с 8.3, 8.2
Соединение.Удалить(
"/trade_exchange/01.01.2017.xml"
); // удаляем один файл по его адресу
Соединение.Удалить(
"/trade_exchange", // путь к удаляемым файлам
"*.xml" // маска для выбора
); // или несколько файлов поиском по маске
/// Как переименовать файл или каталог по FTP из 1с 8.3, 8.2
Соединение.Переместить(
"/NewBin", // старое имя
"/OldBin" // новое имя
);
КонецПроцедуры
Как получить страницу сайта через http-запрос из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПолучитьСтраницуСайтаЧерезHttpЗапросНаКлиенте()
// В сети есть сайт http://example.com
// Запросим содержимое его главной страницы.
// Подключаемся к сайту.
Соединение = Новый HTTPСоединение(
"example.com", // сервер (хост)
80, // порт, по умолчанию для http используется 80, для https 443
, // пользователь для доступа к серверу (если он есть)
, // пароль для доступа к серверу (если он есть)
, // здесь указывается прокси, если он есть
, // таймаут в секундах, 0 или пусто - не устанавливать
// защищенное соединение, если используется https
);
// Получаем текст корневой страницы через GET-запрос.
Запрос = Новый HTTPЗапрос("/");
// Если бы нужна была другая страница, мы бы указали,
// например, "/about" или "/news".
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код: " + Результат.КодСостояния);
// Что примерно означают коды результата запроса:
// [100, 299] - хороший код возврата
// [300, 399] - нас перенаправляют на другую страницу,
// причём 302 - код постоянного перенаправления
// [400, 499] - ошибка запроса
// [500, 599] - ошибка сервера
// в теле результата запроса - текст обычной html страницы
Сообщить("Тело результата: " + Результат.ПолучитьТелоКакСтроку());
КонецПроцедуры
Как обработать перенаправление в http-запросе из 1с 8.3, 8.2
&НаКлиенте
Процедура КакОбработатьПеренаправлениеВHttpЗапросеНаКлиенте()
// Предположим, что мы хотим отправить поисковый http запрос
// гуглу и получить от него страницу с результатами нашего
// запроса.
// К примеру, будем искать по строке "работа программистом 1с в моём городе".
Соединение = Новый HTTPСоединение("www.google.com", 80);
Запрос = Новый HTTPЗапрос("/search?q=работа программистом 1с в моём городе");
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
Если Результат.КодСостояния = 302 Тогда
Сообщить("Нас перенаправили на другую страницу.");
Сообщить("Адрес этой страницы находится в заголовке результата Location.");
Сообщить("Вот он: " + Результат.Заголовки.Получить("Location"));
// Воспользуемся вспомогательной функцией СтруктураURI, которая
// сама вытаскивает из адреса имя хоста, порт и путь к ресурсу.
URI = СтруктураURI(Результат.Заголовки.Получить("Location"));
// Делаем новое подключение и get запрос.
Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт);
Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
// Сохраним тело ответа (это и есть наша страница с результатами
// поиска) в виде htm файла и тут же покажем его пользователю.
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ФайлРезультатов = КаталогДляЭкспериментов + "\test.htm";
Текст = Новый ЗаписьТекста(ФайлРезультатов, КодировкаТекста.UTF8);
Текст.Записать(Результат.ПолучитьТелоКакСтроку());
Текст.Закрыть();
Сообщить("Результаты поиска сохранены в " + ФайлРезультатов);
ЗапуститьПриложение(ФайлРезультатов);
КонецЕсли;
КонецПроцедуры
Как сохранить картинку с сайта через http-запрос из 1с 8.3, 8.2
&НаКлиенте
Процедура КакСохранитьКартинкуСайтаЧерезHttpЗапросНаКлиенте()
// Запрашивать через http можно не только html-страницы,
// но и другие объекты, доступные нам через http,
// например, картинки.
// Сохраним на диск и покажем пользователю картинку, которая
// размещена в интернете по адресу:
// thumb7.shutterstock.com/display_pic_with_logo/1014806/270790184/
// stock-photo-summer-holidays-background-sea-background-270790184.jpg
Соединение = Новый HTTPСоединение("thumb7.shutterstock.com", 80);
// Get-запрос к ресурсу на сервере.
Запрос = Новый HTTPЗапрос("/display_pic_with_logo/1014806/270790184/" +
"stock-photo-summer-holidays-background-sea-background-270790184.jpg");
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
// Сама картинка - уже в теле ответа, осталось
// только записать её в файл на диск в виде двоичных данных.
КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
СоздатьКаталог(КаталогДляЭкспериментов);
ФайлКартинки = КаталогДляЭкспериментов + "\test.jpg";
// Записываем картинку на диск.
Результат.ПолучитьТелоКакДвоичныеДанные().Записать(ФайлКартинки);
Сообщить("Сохранили картинку по адресу " + ФайлКартинки);
// Покажем картинку пользователю.
ЗапуститьПриложение(ФайлКартинки);
КонецПроцедуры
Как послать защищенный https запрос к серверу из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПослатьЗащищенныйHttpsЗапросКСерверуНаКлиенте()
// Получим код страницы https://ya.ru
// Так как для доступа к ней используется защищенный
// протокол https - нам нужно заполнить последний
// параметр при соединении с сервером.
Соединение = Новый HTTPСоединение(
"ya.ru", // сервер (хост)
443, // порт, по умолчанию для http используется 80, для https 443
, // пользователь для доступа к серверу (если он есть)
, // пароль для доступа к серверу (если он есть)
, // здесь указывается прокси, если он есть
, // таймаут в секундах, 0 или пусто - не устанавливать
Новый ЗащищенноеСоединениеOpenSSL()
);
// Получаем текст корневой страницы через GET-запрос.
Запрос = Новый HTTPЗапрос("/");
// Если бы нужна была другая страница, мы бы указали,
// например, "/about" или "/news".
Результат = Соединение.Получить(Запрос);
Сообщить(Результат.КодСостояния);
Сообщить(Результат.ПолучитьТелоКакСтроку());
КонецПроцедуры
Как установить заголовки http-запроса из 1с 8.3, 8.2
&НаКлиенте
Процедура КакУстановитьЗаголовкиHttpЗапросаНаКлиенте()
// Возьмём чисто гипотетический пример.
// Нам нужно послать запрос к http://example.com/,
// передав ему в куках (cookie) session=231.
// Также мы будем передадим в запросе поле keep-alive,
// чтобы сервер не закрывал наше соединений к нему
// для повторых запросов.
// За всё это отвечают заголовки запроса.
Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", "session=231");
Заголовки.Вставить("Connection", "keep-alive");
// Подключаемся к сайту.
Соединение = Новый HTTPСоединение("example.com");
// Получаем текст корневой страницы через GET-запрос.
Запрос = Новый HTTPЗапрос("/", Заголовки);
// Если бы нужна была другая страница, мы бы указали,
// например, "/about" или "/news".
Результат = Соединение.Получить(Запрос);
КонецПроцедуры
Как указать прокси для http-запроса из 1с 8.3, 8.2
&НаКлиенте
Процедура КакУказатьПроксиДляHttpЗапросаНаКлиенте()
// Если для соединения с интернетом используется прокси,
// его нужно указывать так.
ПроксиСервер = Новый ИнтернетПрокси;
// авторизация
ПроксиСервер.Пользователь = "Vova";
ПроксиСервер.Пароль = "123";
// прокси сервер прописывается для каждого протокола отдельно
ПроксиСервер.Установить("http", "192.168.0.1", "8080");
ПроксиСервер.Установить("https", "192.168.0.1", "6547");
// Созданный объект указываем при http соединении.
Соединение = Новый HTTPСоединение("example.com",,,, ПроксиСервер);
КонецПроцедуры
Как послать post-запрос через http из 1с 8.3, 8.2
&НаКлиенте
Процедура КакПослатьPostЗапросНаКлиенте()
// Post-запрос отличается от Get-запроса только наличием
// тела запроса.
// То есть этот тот же самый HTTPЗапрос, но у которого
// вызыван метод УстановитьТелоИзСтроки.
// И это тело уже может быть и просто текстом, и текстом
// в формате xml, json, soap и так далее.
// В качестве большого примера рассмотрим фрагмент
// авторизации на сайте 1с, там используются и get
// и post запросы.
// Откуда мы узнали как и когда посылать какие запросы?
// Мы подсмотрели их у браузера (в Хроме нажмите F12, вкладка Network),
// а также использовали беплатный инструмент Fiddler
// для отладки и мониторинга http запросов.
// Если бы мы писали рабочий код - нам понадобилось
// всего несколько соединений с сервером, которые
// мы бы не закрывали. Но в учебных целях будем
// писать максимально просто ("тупо").
// 1. Первым делом - посылаем get-запрос к
// https://releases.1c.ru/total
Соединение = Новый HTTPСоединение("releases.1c.ru",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/total");
Результат = Соединение.Получить(Запрос);
// В куках нам должны вернуть идентификатор сессии.
Куки = Результат.Заголовки.Получить("Set-Cookie");
// Он идёт первым параметром и отделён от остальных
// частей точкой с запятой.
Куки = СтрЗаменить(Куки, ";", Символы.ПС);
ИдентификаторСессии1 = СтрПолучитьСтроку(Куки, 1);
Сообщить(ИдентификаторСессии1);
// 2. В результате первого запроса нас перенаправили
// на другую страницу, перейдём на неё новым get-запросом.
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("Код возврата " + Результат.КодСостояния);
Сообщить("Нас перенаправили на " + Перенаправление);
// При помощи служебной функции СтруктураURI разберём
// новый адрес на части.
URI = СтруктураURI(Перенаправление);
Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
Результат = Соединение.Получить(Запрос);
// В куках нам вернули второй идентификатор.
Куки = Результат.Заголовки.Получить("Set-Cookie");
Куки = СтрЗаменить(Куки, ";", Символы.ПС);
ИдентификаторСессии2 = СтрПолучитьСтроку(Куки, 1);
Сообщить(ИдентификаторСессии2);
// 3. В результате предыдущего Get-запроса в теле нам вернули
// страницу авторизации, вытащим из формы авторизации значения
// параметров name="lt", name="execution" и name="_eventId",
// чтобы затем сформировать код приглашения на сайт.
ltValue = "";
executionValue = "";
_eventIdValue = "";
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(Результат.ПолучитьТелоКакСтроку());
Для Индекс = 0 По Текст.КоличествоСтрок() Цикл
Строка = Текст.ПолучитьСТроку(Индекс);
Если Найти(Строка, "name=""lt""") > 0 Тогда
ltValue = ВытащитьЗначениеИзСтроки(Строка);
ИначеЕсли Найти(Строка, "name=""execution""") > 0 Тогда
executionValue = ВытащитьЗначениеИзСтроки(Строка);
ИначеЕсли Найти(Строка, "name=""_eventId""") > 0 Тогда
_eventIdValue = ВытащитьЗначениеИзСтроки(Строка);
КонецЕсли;
КонецЦикла;
Сообщить(ltValue);
Сообщить(executionValue);
Сообщить(_eventIdValue);
// Для формирования кода приглашения нам понадобится
// наш логин и пароль от ИТС.
ЛогинИТС = "";
ПарольИТС = "";
Если ЛогинИТС = "" Или ПарольИТС = "" Тогда
Сообщить("Для продолжения укажите в коде логин и пароль от ИТС.");
Возврат;
КонецЕсли;
КодПриглашения = "inviteCode=" +
"<=" + ltValue +
"&execution=" + executionValue +
"&_eventId=" + _eventIdValue +
"&username=" + ЛогинИТС +
"&password=" + ПарольИТС;
// 4. Наконец, посылаем Post-запрос, вкладывая в тело запроса
// код приглашения, а куках указыаем второй идентификатор сессии.
Ресурс =
"/login;" +
ИдентификаторСессии2 +
"?service=https%3A%2F%2Fusers.v8.1c.ru%2Fdistribution%2Fpublic%2Fsecurity_check%3B" +
ИдентификаторСессии1;
Соединение = Новый HTTPСоединение("login.1c.ru",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", ИдентификаторСессии2);
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзСтроки(КодПриглашения);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
Сообщить("Нам вернули код " + Результат.КодСостояния);
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("И перенаправили на " + Перенаправление);
// 5. В завершении авторизации переходим на следующую
// страницу, используя первый идентификатор сессии.
URI = СтруктураURI(Перенаправление);
Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("Cookie", ИдентификаторСессии1);
Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере, Заголовки);
Результат = Соединение.Получить(Запрос);
Сообщить("Нам вернули " + Результат.КодСостояния);
Перенаправление = Результат.Заголовки.Получить("Location");
Сообщить("И окончательно перенаправили на " + Перенаправление);
// Авторизация окончена, теперь можем запрашивать любые
// страницы сайта, используя первый идентификатор сессии.
КонецПроцедуры
&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт
СтрокаURI = СокрЛП(СтрокаURI);
// схема
Схема = "";
Позиция = Найти(СтрокаURI, "://");
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция - 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;
// строка соединения и путь на сервере
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = "";
Позиция = Найти(СтрокаСоединения, "/");
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
КонецЕсли;
// информация пользователя и имя сервера
СтрокаАвторизации = "";
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, "@");
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;
// логин и пароль
Логин = СтрокаАвторизации;
Пароль = "";
Позиция = Найти(СтрокаАвторизации, ":");
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция - 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;
// хост и порт
Хост = ИмяСервера;
Порт = "";
Позиция = Найти(ИмяСервера, ":");
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция - 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("Схема", Схема);
Результат.Вставить("Логин", Логин);
Результат.Вставить("Пароль", Пароль);
Результат.Вставить("ИмяСервера", ИмяСервера);
Результат.Вставить("Хост", Хост);
Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ВытащитьЗначениеИзСтроки(Строка)
Позиция2 = СтрДлина(Строка);
Пока Позиция2 > 1 Цикл
Если Сред(Строка, Позиция2, 1) = """" Тогда
Прервать;
КонецЕсли;
Позиция2 = Позиция2 - 1;
КонецЦикла;
Позиция1 = Позиция2 - 1;
Пока Позиция1 > 1 Цикл
Если Сред(Строка, Позиция1, 1) = """" Тогда
Прервать;
КонецЕсли;
Позиция1 = Позиция1 - 1;
КонецЦикла;
Возврат Сред(Строка, Позиция1 + 1, Позиция2 - Позиция1 - 1);
КонецФункции