Функция получение содержимого адреса url (веб-страницы) методом GET // Возвращает содержимое ответа HTTP-сервера, полученного методом GET, в виде строки или двоичных данных
// ** Coded by Sergey (aka Porutchik) * 2014 http://forum.aeroion.ru/cat1.html //
// Параметры
// СерверПриемник - - доменное имя сервера или полный адрес (url) запрашиваемой ссылки.
// Может включать протокол (http://, https://) и порт.
// АдресСтраницы - - опционально. Адрес страницы на сервере без протокола (http://, https://),
// доменного имени сервера (хоста) и порта.
// Если не указано, адрес страницы будет извлечён из параметра СерверПриемник
// ПараметрыСоединения - - опционально. Структура, содержащая дополнительные параметры для HTTPСоединение.
// Назначение ключей:
// Логин или Пользователь - Тип Строка - Имя пользователя на указанном сервере.
// Пароль - Тип Строка - Пароль пользователя на указанном сервере.
// Прокси - Тип ИнтернетПрокси - Прокси, используемый для соединения с сервером.
// Таймаут - Тип Число - Таймаут осуществляемого соединения и операций, в секундах. 0 - не устанавливать таймаут..
// ЗаголовкиHTTP - - опционально.
// Заголовки, которые будут отправлены на сервер в виде соответствия: "Заголовок" - "Значение".
// Если указано, функция возвратит в программу заголовки HTTP-ответа с кодом состояния в ключе StatusCode,
// имя файла в ключе FileName, url-кодированное имя в ключе EncodeFileName
// ПолучитьКакДвоичныеДанные - - опционально. Определяет, в каком виде получить содержимое ответа сервера
// По умолчанию Ложь.
// ЗащищенноеСоединение - - опционально. По умолчанию Ложь.
// Если Истина, соединение будет происходить по протоколу https://
//
// Возвращаемое значение:
// , - содержимое ответа сервера, если ресурс найден по указанному адресу.
//
Функция ПолучитьСодержимоеВебАдреса(Знач СерверПриемник, Знач АдресСтраницы = "",
Знач ПараметрыСоединения = Неопределено, ЗаголовкиHTTP = Неопределено,
Знач ПолучитьКакДвоичныеДанные = Ложь, Знач ЗащищенноеСоединение = Ложь) Экспорт
Перем ИмяФайлаОтветаКодированное, ИмяФайлаОтвета, Порт, Логин, Пользователь, Пароль, Прокси, Таймаут;
Если Не ЗначениеЗаполнено(СерверПриемник) Тогда Возврат Неопределено; КонецЕсли;
Если ТипЗнч(ЗаголовкиHTTP) Тип("Соответствие") Тогда ЗаголовкиHTTP = Новый Соответствие; КонецЕсли;
Если Найти(Нрег(СерверПриемник), "https://") = 1 Тогда ЗащищенноеСоединение = Истина; КонецЕсли;
Протокол = ?(Найти(Нрег(СерверПриемник), "https://") = 1 ИЛИ ЗащищенноеСоединение, "https://", "http://");
Если Лев(НРег(СерверПриемник), СтрДлина(Протокол)) = Протокол Тогда
СерверПриемник = Сред(СерверПриемник, СтрДлина(Протокол) + 1);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(АдресСтраницы) Тогда
Позиция = Найти(СерверПриемник, "/");
Если Позиция > 0 Тогда
АдресСтраницы = Сред(СерверПриемник, Позиция, СтрДлина(СерверПриемник));
СерверПриемник = Лев(СерверПриемник, Позиция - 1);
Иначе
АдресСтраницы = "/";
КонецЕсли;
КонецЕсли;
СерверПриемник = СтрЗаменить(СерверПриемник, "/", "");
//Выделяем порт из доменного имени
ПозицияДвоеточия = Найти(СерверПриемник, ":");
Если ПозицияДвоеточия > 0 Тогда
Порт = Число(Сред(СерверПриемник, ПозицияДвоеточия + 1));
СерверПриемник = Лев(СерверПриемник, ПозицияДвоеточия - 1);
КонецЕсли;
Если ТипЗнч(ПараметрыСоединения) = Тип("Структура") Тогда
Для каждого КлючЗначение из ПараметрыСоединения Цикл
Значение = КлючЗначение.Значение; Выполнить(КлючЗначение.Ключ + " = Значение;");
КонецЦикла;
Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Логин);
КонецЕсли;
НТТР = Новый HTTPСоединение(СерверПриемник, Порт, Пользователь, Пароль, Прокси, Таймаут,
?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено));
//Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
ОтветHTTP = НТТР.Получить(Новый HTTPЗапрос(АдресСтраницы, ЗаголовкиHTTP)); //
ОшибкаЗапроса = (ОтветHTTP.КодСостояния >= 400);
//После получения ответа сервера необходимо проверить статус или код состояния.
//http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.... //Если сервер вернул один из статусов переадресации
//301 Moved Permanently («перемещено навсегда») или 302 Moved Temporarily («перемещено временно»),
//то в этом случае можно попытаться перейти на ресурс, на который переадресовал сервер
Если ОтветHTTP.КодСостояния = 301 или ОтветHTTP.КодСостояния = 302 Тогда
Если ОтветHTTP.Заголовки.Количество() > 0 Тогда
//Адрес страницы переадресации содержится в поле Location заголовка ответа
АдресСтраницы = ОтветHTTP.Заголовки["Location"]; //
Если ЗначениеЗаполнено(АдресСтраницы) Тогда
Если Найти(НРег(АдресСтраницы), "http://") = 0 И Найти(НРег(АдресСтраницы), "https://") = 0 Тогда
АдресСтраницы = ?(Лев(АдресСтраницы, 1) = "/", Сред(АдресСтраницы, 2), АдресСтраницы);
Если Найти(АдресСтраницы, СерверПриемник + "/") = 0 Тогда
АдресСтраницы = Протокол + СерверПриемник + ?(ЗначениеЗаполнено(Порт), ":" + Порт, "") + "/" + АдресСтраницы;
КонецЕсли;
КонецЕсли;
//Если сервер вернул cookies (http://ru.wikipedia.org/wiki/HTTP_cookie, http://www.faqs.org/rfcs/rfc6265.html?#41;, //вставим их в заголовки для передачи на страницу перехода
Куки = ОтветHTTP.Заголовки["Set-Cookie"];//
Если ЗначениеЗаполнено(Куки) Тогда ЗаголовкиHTTP.Вставить("Cookie", Куки); КонецЕсли;
//Рекурсивный вызов
Возврат ПолучитьСодержимоеВебАдреса(АдресСтраницы, , , ЗаголовкиHTTP, ПолучитьКакДвоичныеДанные, ЗащищенноеСоединение);//
КонецЕсли;
КонецЕсли;
ИначеЕсли ОтветHTTP.КодСостояния >= 100 И ОтветHTTP.КодСостояния 0 Тогда
ТипСодержимого = ОтветHTTP.Заголовки["Content -Type"];
//http://ru.wikipedia.org/wiki/Список_MIME-типов Если Найти(ТипСодержимого, "text/") = 1 ИЛИ Найти(ТипСодержимого, "/javascript")
ИЛИ Найти(ТипСодержимого, "+xml") ИЛИ Найти(ТипСодержимого, "/xml") 0 ИЛИ Найти(ТипСодержимого, "/json") 0 Тогда
ПолучитьКакДвоичныеДанные = Ложь;
ИначеЕсли Найти(ТипСодержимого, "image/") = 1 ИЛИ Найти(ТипСодержимого, "video/") = 1
ИЛИ Найти(ТипСодержимого, "application/") = 1 ИЛИ Найти(ТипСодержимого, "audio/") = 1 Тогда
//Если содержимое полученного ответа представляет собой изображение, видео, приложение,
//возвращаем двоичные данные, так как возвращать в виде строки не имеет смысла.
ПолучитьКакДвоичныеДанные = Истина;
КонецЕсли;
//Некоторые сервера возвращают в типе содержимого имя отданного файла, например image/png; name="Имя файла.png"
//или отдают в заголовке Content -Disposition: attachment; filename=Имя файла.png (http://www.http11.ru/post.php?post=2) Если ОтветHTTP.Заголовки["Content -Disposition"] Неопределено Тогда
ТипСодержимого = ОтветHTTP.Заголовки["Content -Disposition"];
КонецЕсли;
ТипСодержимого = СтрЗаменить(СтрЗаменить(ТипСодержимого, """", ""), "'", "");
//в ключе filename*=UTF-8'' содержится url-кодированное имя файла
ПозицияИмениФайла = Найти(ТипСодержимого, "filename*=UTF-8");
Если ПозицияИмениФайла 0 Тогда
ИмяФайлаОтветаКодированное = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("filename*=UTF-8"));
ПозицияДвоеточия = Найти(ИмяФайлаОтветаКодированное, ";");
Если ПозицияДвоеточия 0 Тогда
ИмяФайлаОтветаКодированное = Лев(ИмяФайлаОтветаКодированное, ПозицияДвоеточия - 1);
КонецЕсли;
КонецЕсли;
//в ключе filename= содержится обычное имя файла
ПозицияИмениФайла = Найти(ТипСодержимого, "name=");
Если ПозицияИмениФайла 0 Тогда
ИмяФайлаОтвета = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("name="));
ПозицияДвоеточия = Найти(ИмяФайлаОтвета, ";");
Если ПозицияДвоеточия 0 Тогда
ИмяФайлаОтвета = Лев(ИмяФайлаОтвета, ПозицияДвоеточия - 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ЗаголовкиHTTP = ОтветHTTP.Заголовки;
//Добавляем в заголовки ответа код состояния (ответа) HTTP-сервера и имя файла содержимого, если есть.
ЗаголовкиHTTP.Вставить("StatusCode", ОтветHTTP.КодСостояния);
Если ЗначениеЗаполнено(ИмяФайлаОтвета) Тогда ЗаголовкиHTTP.Вставить("FileName", ИмяФайлаОтвета); КонецЕсли;
Если ЗначениеЗаполнено(ИмяФайлаОтветаКодированное) Тогда
ЗаголовкиHTTP.Вставить("EncodeFileName", ИмяФайлаОтветаКодированное);
КонецЕсли;
Если ОшибкаЗапроса ИЛИ НЕ ПолучитьКакДвоичныеДанные Тогда Возврат ОтветHTTP.ПолучитьТелоКакСтроку(); КонецЕсли;
Возврат ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
КонецФункции // ПолучитьСодержимоеВебАдреса()
//Источник: http://forum.aeroion.ru/topic749.html [/pre]Примеры использования:
// Получение содержимого в виде строки//
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса("
//
ЗаголовкиHTTP = Новый Соответствие;
ЗаголовкиHTTP.Вставить("Referer", "a href="http://some_site.com/" )"="">http://some_site.com/");
СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(" Категория: Нет
Отправка почты через Mail.ru с использованием технологии шифрования SSL Часто клиенты просят сделать автоматическую отправку счетов или отчетов на электронную почту, ниже приведены примеры кода для разных версий 1С:
Код 1C v 8.3
//Код для обычного приложения, для управляемого приложения отправка почты так же, только с файлами и предупреждение нужно изменить код
Функция ПолучитьПрофильПочты()
//Создаем профиль либо считываем из справочника
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";//Отправитель.АдресСервераSMTP; //"smtp.mail.ru";
Профиль.АдресСервераPOP3 = "pop.mail.ru"; //Отправитель.АдресСервераPOP3; //"pop.mail.ru";
Профиль.ПортPOP3 = 995;//Отправитель.ПортPOP3; //110;
Профиль.ПортSMTP = 465;//Отправитель.ПортSMTP; //587;
Профиль.Пользователь = "s_v@inbox.ru";// Отправитель.Email; //"test@mail.ru";
Профиль.Пароль = "8mFTnDjC4KftTzh"; //Отправитель.Пароль; //"123456789";
Профиль.ПользовательSMTP = "s_v@inbox.ru";//Отправитель.Email; //"test@mail.ru";
Профиль.ПарольSMTP = "8mFTnDjC4KftTzh";//Отправитель.Пароль; //"123456789";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ИспользоватьSSLSMTP = Истина;
//Создаем письмо
Возврат Профиль;
КонецФункции
Процедура ОсновныеДействияФормыСчетОтправитьНаПочту(Кнопка)
Если ЗначениеЗаполнено(Ответственный.ПочтаДляОтправкиСчета) Тогда
Почта = Новый ИнтернетПочта;
Письмо = Новый ИнтернетПочтовоеСообщение;
Текст = Письмо.Тексты.Добавить("В приложении счет");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
Письмо.Тема = Строка(Ссылка);
Письмо.Отправитель = "s_vmeste@inbox.ru";
Письмо.ИмяОтправителя = "1С";
Письмо.Получатели.Добавить(Ответственный.ПочтаДляОтправкиСчета);
врфайл=ПолучитьИмяВременногоФайла("pdf");
текТабдок=СчетФаксимилеТовары(); //Функция возвращает табличный документ печать счета
текТабдок.Записать(врфайл,ТипФайлаТабличногоДокумента.PDF);
Письмо.Вложения.Добавить(врфайл);
//добавляем вложение если нужно, например "C:\Приложение.doc"
//Вложений можно добавлять сколько требуется.
//Отправляем письмо
Попытка
Почта.Подключиться(ПолучитьПрофильПочты()); Почта.Послать(Письмо); Предупреждение("Письмо отправлено",3);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
//Закрываем письмо
Почта.Отключиться();
//Закрываем файл вложения
Письмо.Вложения.Очистить();
Иначе
Предупреждение("В настройках ответственного не указана почта для отправки счета");
КонецЕсли;
КонецПроцедуры
С версиями 8.2 сложнее, так как все почтовые сервисы перешли на SSL, а медоты:
Код 1C v 8.3 Профиль.ИспользоватьSSLPOP3 = Истина;
Профиль.ИспользоватьSSLSMTP = Истина;
появились только в 8.3.1 , остается использовать stunnel или CDO :
Код 1C v 8.2 УП //Отправка через CDO, Адрессаты через ";"
Функция ПослатьПоПочте(Знач Адрессаты, ТемаСообщения = "",ТекстСообщения = "" ,СписокВложений = "")Экспорт
Оправитель = "s_v@inbox.ru";
Пароль = "8mFTnDjC4KftTzh";
loConfig = Новый COMОбъект("CDO.Configuration");
loCdoMessage = Новый COMОбъект("CDO.Message");
loCdoMessage.Configuration = loConfig;
loCdoMessage.From = Строка("1С <"+Оправитель+">"); //loCdoMessage.From = "Тест 1C"""" <xxxxxxx@yandex.ru>";
loCdoMessage.To = Адрессаты; //loCdoMessage.To = "xxxxxxx@gmail.ru>";
loCdoMessage.Subject = ?(ТемаСообщения="","1С",ТемаСообщения);
loCdoMessage.TextBody = "1C";
HTMLBody = "<html>
|<head>
|<meta content =""text/html; charset=Windows-1251"" http-equiv=""content -type"">
|<title> Тестовое сообщение </title>
|</head>
|<body>
|<h4>" + ТекстСообщения + "</h4>
|<p></p>
|</body>
|</html>";
//loCdoMessage.BodyPart.Charset = "windows-1251";
loCdoMessage.HTMLBody = HTMLBody;
Если ТипЗнч(СписокВложений) = Тип("Строка") И Не СписокВложений = "" Тогда
Попытка
loCdoMessage.AddAttachment(СписокВложений);
Исключение
КонецПопытки;
ИначеЕсли ТипЗнч(СписокВложений) = Тип("СписокЗначений") Тогда
Для каждого ПутьКВложению Из СписокВложений Цикл
Попытка
loCdoMessage.AddAttachment(ПутьКВложению.Значение);
Исключение
КонецПопытки;
КонецЦикла;
КонецЕсли;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing"). Value = 2;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver"). Value = "smtp.mail.ru";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport"). Value = "465";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"). Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername"). Value = Оправитель;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword"). Value = Пароль;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl"). Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
loConfig.Fields.Update();
Попытка
loCdoMessage.Send();
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Процедура ОсновныеДействияФормыСчетТовары(Кнопка)
Если ЗначениеЗаполнено(Менеджер.ПочтаДляОтправкиСчета) Тогда
врфайл=ПолучитьИмяВременногоФайла("xls");
текТабдок=СчетФаксимилеТовары();
текТабдок.Записать(врфайл,ТипФайлаТабличногоДокумента.XLS);
ПослатьПоПочте(Менеджер.ПочтаДляОтправкиСчета,Строка(Ссылка),"Счет в приложении",врфайл);
Предупреждение("Письмо отправлено",3);
Иначе
Предупреждение("В настройках ответственного не указана почта для отправки счета");
КонецЕсли;
КонецПроцедуры
Через stunnel в 1С код, менять не нужно, только установить программу и изменить настройки подключения к почтовому ящику
Скачиваем stunnel c официального сайта (stunnel.org) и запускаем инсталятор, жмем yes при установке спросит страну и ваши данные, это нужно для создания сертификата на вашем компьютере.
После запуска в трее появится его иконка, правой клавишей и редактировать edit configuration
В блокноте откроется файл настроек, там будет пример для gmail дополняем или заменяем его следующим:
Код Batch File (DOS, CMD, BAT) [gmail-pop3]
client = yes
accept = 127.0.0.1:10110
connect = pop.gmail.com:995
[gmail-imap]
client = yes
accept = 127.0.0.1:10143
connect = imap.gmail.com:993
[gmail-smtp]
client = yes
accept = 127.0.0.1:10025
connect = smtp.gmail.com:465
[yandex-pop3]
client = yes
accept = 127.0.0.1:20110
connect = pop.yandex.ru:995
[yandex-imap]
client = yes
accept = 127.0.0.1:20143
connect = imap.yandex.ru:993
[yandex-smtp]
client = yes
accept = 127.0.0.1:20025
connect = smtp.yandex.ru:465
[mail-pop3]
client = yes
accept = 127.0.0.1:30110
connect = pop.mail.ru:995
[mail-imap]
client = yes
accept = 127.0.0.1:30143
connect = imap.mail.ru:993
[mail-smtp]
client = yes
accept = 127.0.0.1:30025
connect = smtp.mail.ru:465
Сохраняем файл и делаем Reload configuration
В настройка 1С меняем порты для работы
gmail
pop3 10110
imap 10143
smtp 10025
yandex
pop3 20110
imap 20143
smtp 20025
mail
pop3 30110
imap 30143
smtp 30025
Если в коде прописано, то:
Код 1C v 8.х Функция ПолучитьПрофильПочты()
//Создаем профиль либо считываем из справочника
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "localhost";//"smtp.mail.ru";//Отправитель.АдресСервераSMTP; //"smtp.mail.ru";
Профиль.АдресСервераPOP3 = "localhost";//"pop.mail.ru"; //Отправитель.АдресСервераPOP3; //"pop.mail.ru";
Профиль.ПортPOP3 = 30110;//Отправитель.ПортPOP3; //110; 995
Профиль.ПортSMTP = 30025;//Отправитель.ПортSMTP; //587; 465
Профиль.Пользователь = "s_v@inbox.ru";// Отправитель.Email; //"test@mail.ru";
Профиль.Пароль = "8mFTnDjC4KftTzh"; //Отправитель.Пароль; //"123456789";
Профиль.ПользовательSMTP = "s_v@inbox.ru";//Отправитель.Email; //"test@mail.ru";
Профиль.ПарольSMTP = "8mFTnDjC4KftTzh";//Отправитель.Пароль; //"123456789";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
//Профиль.ИспользоватьSSLPOP3 = Истина;
//Профиль.ИспользоватьSSLSMTP = Истина;
//Создаем письмо
Возврат Профиль;
КонецФункции
Все, можно отправлять и проверять работу через консоль Show log window в меню
P.S. Почтовый ящик в примерах не рабочий, как пример
Категория:
Работа с Интернет, Почтой (Mail), FTP Настройка автоматического резервного копирования 1С:Предприятия с помощью Effector saver Effector saver - это специализированная программа для автоматического резервного копирования 1С:Предприятия.Программа позволяет создавать резервные копии баз данных 1С:Предприятия, баз Microsoft SQL или PostgreSQL серверов, пользовательских папок и файлов.Сохранять же резервные копии можно на внешние, сетевые и локальные диски, FTP сервер.Effector saver вмещает большое количество расширенных функций, которые значительно упрощают резервное копирование: планирование и автоматический запуск задач, удобное заполнение настроек и тестирование баз 1С, автоотключение пользователей 1С:Предприятия 8.
Наша цель - создание ежедневных архивов. На компьютере где производится настройка, должна быть установлена программа 1С:Предприятие и подключена необходимая база данных.Скачаем программу с официального сайта https://efsaver.ru/download.html Запускаем файл инсталляции Мастера установки.
На последнем этапе Мастера установки, соглашаемся с запуском программы и нажимаем "Завершить".
Настроим параметры автозапуска "Агента". Для этого в Панели инструментов выбераем "Сервис" & "Параметры программы" & "Параметры запуска".
Выбираем "Запускать агент как приложение" (выбор зависит от установки программы на рабочую станцию или на сервер).
Нажимаем кнопку "Запустить агента" - "Сохранить".
Создаем задачу резервного копирования
Выбираем "Задачи" - "Добавить задачу".
Выбираем чем архивировать Поле "Наименование" оставим по умолчанию, оно автоматически изменится на имя выбранной базы 1С.
Из выпадающего списка "Вид задачи" выбираем "Архивирование средствами 1С:Предприятие 8".
Указываем базу для архивации В закладке "Подключение" нажимаем "Выбрать и заполнить". В открывшемся окне "Выбор базы 1С:Предприятия" указываем нужную нам базу и нажимаем "Выбрать".
Поля "Исполняемый файл", "Вариант базы" и "Каталог базы" автоматически заполнятся значениями в соответствии с выбранной базой или же их можно заполнить вручную.
Заполняем имя и пароль пользователя выбранной базы, под которым будет запускаться резервное копирование средствами конфигуратора 1С:Предприятия.У этого пользователя в базе должны быть соответствующие права. Обратите внимание, имя задачи автоматически изменилось на имя выбранной базы.
Если для защиты 1С используется USB ключ, то не нужно устанавливать флаг "Использовать программную лицензию 1С".
Указываем место размещения архивированной базы Переходим на вкладку "Настройка архивов". Указываем каталог для хранения архивов: нажимаем на кнопку с тремя точками в конце поля "Каталог архивов" и выбераем в диалоговом окне каталог, или, если потребуется, создайте новый каталог с помощью кнопки "Создать папку".
В параметре "Количество одновременно хранимых архивов" установим 10. Effector saver будет удалять более старые резервные копии данной задачи, как только их количество превысит 10 штук.
Выбираем когда производить архивирование Чтобы установить время выполнения задачи, переходим на вкладку "Расписание".
В нашем примере резервное копирование производится на рабочей станции, поэтому выбираем в поле "Назначить задание", пункт "Ежедневно после загрузки системы".
Если необходимо чтобы между стартом программы и архивированием прошла небольшая пауза, установите "Время задержки" в формате "чч:мм".
В поле "Время начала" установите произвольное время в формате "чч:мм" в тот период, когда последний пользователь прекращает работу с базой и до момента начала работы первого пользователя. Например ночь, 01:00.
Активация и сохранение настройки задачи Устанавливаем флаг "Выполнять задачу" в верхней части окна настройки.
Жмём кнопку "Сохранить".
{
}{ }
Проверка работы задачи После выбора и настройки всех параметров резервного копирования, приступаем непосредственно к проведению самого копирования.
Удостоверьтесь, что пользователи вышли из базы 1С:Предприятия.
В главном окне "Менеджера" кликнув мышкой делаем активной строку со своей задачей.
В меню "Задачи" нажимаем "Выполнить сейчас" и ждём, пока закончится процесс. Ранее мы запустили "Агент", поэтому задача будет выполнена немедленно.
{
}{ }
{
}{ }
Всё, готово. Резервная копия успешно создана.
Просмотр результатов работы задачи После завершения процесса резервного копирования во вкладке "Журнал" мы увидим дату и результат выполнения задачи по созданию бэкапа.
Для подробного просмотра результата выполнения задачи, выберите в меню "Журнал" - "Открыть запись", или сделайте двойной клик мышкой по записи выполнения задачи.
Во вкладке "Файлы" можно просмотреть список файлов бэкапа, которые были созданы в результате выполнения задачи.
Для просмотра файла бэкапа, выбираем в меню "Файлы" - "Открыть файл", или правый клик мыши по записи выполнения задачи - "Открыть файл".
{
}{ }
{
}{ }
{
}{ }
Таким вот образом, за считанные минуты, можно создать автоматическую задачу резервного копирования 1С:Предприятия, и тем самым обезопасить себя от потери важных данных. С резервными копиями, сбой жесткого диска или непреднамеренное удаление пройдет менее болезненно.
{
}{ }
Категория:
Администрирование Пример работы с общим макетом типа ActiveDocument в клиент-серверном варианте Код 1C v 8.х //**********************************************************************************
//получаем макет на сервере, сохраняем в файл и передаем на клиента
&НаСервере
Функция ПолучитьДанныеМакета()
АдресХранилища = Новый УникальныйИдентификатор();
Макет = ПолучитьОбщийМакет("Договор");
ВременныйФайл = ПолучитьИмяВременногоФайла("doc");
Макет.Записать(ВременныйФайл);
Адрес = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВременныйФайл), АдресХранилища);
УдалитьФайлы(ВременныйФайл);
Возврат Адрес;
КонецФункции
//**********************************************************************************
//код сотрудника, нужно для создания уникального имени файла для каждого пользователя
&НаСервере
Функция КодПользователя(Пользователь)
Возврат СокрЛП(Пользователь.Сотрудник.Код);
КонецФункции
//**********************************************************************************
//Ссылка - ссылка на договор(ссылка справочника, нужно для подстановки реквизитов)
//РеквизитыДляПечати - структура с нужными реквизитами
&НаКлиенте
Процедура ПечатьДоговора(Ссылка,РеквизитыДляПечати)
Пользователь = ОбщегоНазначения.ТекущийПользователь();
Каталог = КаталогВременныхФайлов();
Каталог = ?(Прав(Каталог,1) = "\", Каталог, Каталог+"\");
ПолноеИмяФайла = Каталог+"Договор_"+КодПользователя(Пользователь)+".doc";
Попытка
Индификатор = ПолучитьДанныеМакета();
МакетДоговора = ПолучитьИзВременногоХранилища(Индификатор);
МакетДоговора.Записать(ПолноеИмяФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Попытка
MSWord = Новый COMОбъект("Word.Application");
Исключение
Сообщить("Ошибка при попытке создать объект ""MS Word""!" + Символы.ПС +
"Возможно приложение ""MS Word"" не установлено или установлено неправильно.", СтатусСообщения.Внимание);
КонецПопытки;
MSWord.Documents.Open(ПолноеИмяФайла);
Попытка
Документ = MSWord.Application.Documents(1);
Документ.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке, и объект закрывается.
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
MSWord.Application.Quit();
Возврат;
КонецПопытки;
//*******************************************
//тут выполняем замену
Попытка
Замена = Документ.Content .Find;
Замена.Execute("{ЧтоМеняем}", Ложь, Истина, Ложь, , , Истина, , Ложь, "На что меняем");
Исключение
КонецПопытки;
// Делаем видимым приложение и активизируем его.
MSWord.Application.Visible = Истина;
MSWord.Activate();
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Как получить координаты выделенной области на Яндекс Карте? На одном проекте потребовалось получать координаты выделенной области на яндекс карте, после долгих изучений получилось следующее:
Вид Формы: На карте выделяете объект, нажимаете кнопку Получить координаты выделенной области и заполняется таблица координат
Код инициализации карты и обработчик кнопки получения координат:
Код 1C v 8.х Процедура ИнициализироватьКарту()
ПутьКФайлу = КаталогВременныхФайлов()+"yamaps.html";
Ф = новый Файл(ПутьКФайлу);
Если Ф.Существует() Тогда
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект.ПолучитьМакет("МакетЯндекс");
Т.УстановитьТекст(ТД.ПолучитьТекст());
Т.Записать(ПутьКФайлу);
ЭлементыФормы.Эксплорер.Перейти(ПутьКФайлу);
КонецПроцедуры
Процедура ВыполнитьСкрипт(Команда) Экспорт
ЭлементыФормы.Эксплорер.document.getElementById("WebClientOperation").value = Команда;
ЭлементыФормы.Эксплорер.document.getElementById("WebClient").click();
КонецПроцедуры
Процедура ПриОткрытии()
ИнициализироватьКарту();
КонецПроцедуры
Процедура ПолучитьКоординатыНажатие(Элемент)
ВыполнитьСкрипт("GetGEO();");
ТекКоординаты=ЭлементыФормы.Эксплорер.document.getElementById("geometry").innerText;
ТекКоординаты=СтрЗаменить(ТекКоординаты,"Координаты: [","");
МассивСтроки = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ТекКоординаты, "], [ ");
Точки.Очистить();
Для Каждого стр из МассивСтроки Цикл
Текстр=СтрЗаменить(стр,"[","");
Текстр=СтрЗаменить(Текстр,"]","");
Текстр=СокрЛП(Текстр);
нСтрок=Точки.Добавить();
симвЗапятой=Найти(Текстр,",");
нСтрок.Широта=Лев(Текстр,симвЗапятой-1);
нСтрок.Долгота=Сред(Текстр,симвЗапятой+2,СтрДлина(Текстр));
КонецЦикла;
//Сообщить(ТекКоординаты);
КонецПроцедуры
Макет
Код VBS <!DOCTYPE html">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content -Type" content ="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content ="IE=9"/>
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
<script src="http://yandex.st/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
var index = 1;
var MyMap, route;
var clusterer;
var PointArray = [];
var noclick = false;
ymaps.ready(init);
function init(){
myMap = new ymaps.Map ("map", {
center: [55.75, 37.62],
zoom: 10
}),
polygon = new ymaps.GeoObject({
geometry: {
type: "Polygon",
coordinates: []
}
});
myMap.behaviors.enable('scrollZoom');
myMap.behaviors.disable('dblClickZoom');
myMap.events.add('click', function (e) {
if (!noclick) {
// addMarker(e.get('coords'));
}else{
noclick = false;
}
});
myMap.events.add('drag end', function (e) {
noclick = true;
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
});
// создадим кластеризатор и запретим приближать карту при клике на кластеры
//clusterer = new ymaps.Clusterer({clusterDisableClickZoom: true, synchAdd: true});
//myMap.geoObjects.add(clusterer);
myMap.geoObjects.add(polygon);
polygon.editor.startDrawing();
$('input').attr('disabled', false);
// Обработка нажатия на любую кнопку.
$('input').click(
function () {
// Отключаем кнопки, чтобы на карту нельзя было
// добавить более одного редактируемого объекта (чтобы в них не запутаться).
$('input').attr('disabled', true);
GetGEO();
});
}
function addMarker(coordPosition){
myPlacemark = new ymaps.Placemark(coordPosition, {
// Свойства
// Текст метки
iconContent : 'Точка'+index
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
document.getElementById('CoordX').value = coordPosition[0].toPrecision(15);
document.getElementById('CoordY').value = coordPosition[1].toPrecision(15);
index++;
}
function calcRoute(options){
ymaps.route(options, {
// Опции маршрутизатора
mapStateAutoApply: true, // автоматически позиционировать карту
avoidTrafficJams: false // Учитывать пробки
}).then(
function (router) {
route = router;
myMap.geoObjects.add(route);
//заполняем и сохраняем инфо про маршрут
document.getElementById('RouteInfo').value = "Длина маршрута - " + route.getHumanLength() + ". Время - " + route.getHumanJamsTime();
//генерация события для перехвата в 1С
var evt = document.createEventObject();
document.body.fireEvent('ondatasetcomplete', evt);
},
function (error) {
alert("Возникла ошибка: " + error.message);
});
}
function calcLine(options){
var poly = new ymaps.Polyline(options, {
hintContent : "Маршрут",
balloonContent : "Маршрут экспедитора",
balloonContent Header: "",
balloonContent Body: "",
balloonContent Footer: ""
}, {
cursor: "pointer",
draggable: false,
hasBalloon: true,
hasHint: true,
interactiveZIndex: false,
opacity: 1,
openBalloonOnClick: true,
openEmptyBalloon: false,
openEmptyHint: false,
openHintOnHover: true,
strokeColor: '#E33926',
strokeOpacity: 0.8,
strokeStyle: '',
strokeWidth: 5,
syncOverlayInit: false,
visible: true
});
myMap.geoObjects.add(poly);
myMap.setBounds(poly.geometry.getBounds());
}
function Reset(){
// Удаляем все геообъекты на карте
myMap.geoObjects.removeAll();
PointArray = [];
index = 1;
}
function ChangeCityMSK(){
myMap.panTo([55.75, 37.62], {
flying: 1
});
}
function ChangeCitySPB(){
myMap.panTo([59.938531, 30.313497], {
flying: 1
});
}
function ChangeCityKRAS(){
myMap.panTo([45.04, 38.97], {
flying: 1
});
}
function ChangePlace(k,d){
myMap.panTo([k, d], {
flying: 1
});
}
function FindAdres(Adres){
Reset();
var myGeocoder = ymaps.geocode(Adres);
myGeocoder.then(
function (res){
var firstGeoObject = res.geoObjects.get(0);
if(firstGeoObject != null){
myMap.panTo(
// Координаты нового центра карты
firstGeoObject.geometry.getCoordinates(), {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(firstGeoObject.geometry.getCoordinates(), {
// Свойства
// Текст метки
iconContent : Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}else{
alert("Ничего не найдено");}
}
);
}
function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();
var CoordPosition = [CoordX, CoordY];
myMap.panTo(
// Координаты нового центра карты
CoordPosition, {
/* Опции перемещения:
разрешить уменьшать и затем увеличивать зум
карты при перемещении между точками
*/
flying: true
}
);
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent : Adres
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: 'islands#blueStretchyIcon'
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayM(CoordX, CoordY, TextC, Text){
var CoordPosition = [CoordX, CoordY];
myPlacemark = new ymaps.Placemark(CoordPosition, {
// Свойства
// Текст метки
iconContent : Text
}, {
// Опции
// Иконка метки будет растягиваться под ее контент
preset: TextC
});
myMap.geoObjects.add(myPlacemark);
}
function addToPointArrayPointOne(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent : ID,
hintContent : ID,
balloonContent : Text,
balloonContent Body: Text
}
});
myMap.geoObjects.add(point);
}
function addToPointArray(CoordX, CoordY, ID, Text){
var point = new ymaps.GeoObject({
geometry: {type: "Point", coordinates: [CoordX, CoordY>,
properties: {
clusterCaption: ID,
iconContent : ID,
hintContent : ID,
balloonContent : Text,
balloonContent Body: Text
}
});
PointArray.push(point);
}
function drawCluster(){
clusterer.add(PointArray);
myMap.geoObjects.add(clusterer);
}
function createPolygon(ArrayPoint, Name, color) {
// Создаем многоугольник
myPolygon = new ymaps.Polygon([
// Координаты вершин внешней границы многоугольника.
ArrayPoint
], {
//Свойства
hintContent : Name
}, {
// Опции.
// Цвет заливки (зеленый)
fillColor: color,
// Цвет границ (синий)
strokeColor: '#0000FF',
// Прозрачность (полупрозрачная заливка)
opacity: 0.6,
// Ширина линии
strokeWidth: 5,
// Стиль линии
strokeStyle: 'shortdash'
});
myMap.geoObjects.add(myPolygon);
}
function WebClientClick() {
//очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
var WebClientOperation = document.getElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0": // ничего не делаем
var a = 1;
default: // запускаем функцию
eval(WebClientOperation);
}
document.getElementById('WebClientOperation').value = "0";
}
function GetGEO(){
polygon.editor.stopEditing();
printGeometry(polygon.geometry.getCoordinates());
}
// Выводит массив координат геообъекта в <div id="geometry">
function printGeometry (coords) {
$('#geometry').html('Координаты: ' + stringify(coords));
function stringify (coords) {
var res = '';
if ($.isArray(coords)) {
res = '[ ';
for (var i = 0, l = coords.length; i < l; i++) {
if (i > 0) {
res += ', ';
}
res += stringify(coords[i]);
}
res += ' ]';
} else if (typeof coords == 'number') {
res = coords.toPrecision(6);
} else if (coords.toString) {
res = coords.toString();
}
return res;
}
}
</script>
</head>
<body>
<div id="geometry"/></div>
<div id="map" style="width:100%; height:100%"></div>
<input type="hidden" id="CoordX" name="CoordX" value="0"></input>
<input type="hidden" id="CoordY" name="CoordY" value="0"></input>
<input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input>
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input>
<input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();"></input>
<!-- <input type="button" value="Завершить редактирование" id="stopEditPolyline"/> -->
</body>
</html>
Категория:
Географическая схема Как установить HTTP соединение через прокси (proxy) сервер В этом посте я покажу несколько примеров HTTP соединения используя прокси сервера:
Общий пример установки параметров прокси:
Код 1C v 8.х // соединение с параметрами по умолчанию
Соединение = Новый HTTPСоединение("www.mysite.ru");
// сервер использует порт 8080
Соединение = Новый HTTPСоединение("www.mysite.ru", 8080);
// сервер использует защищенное соединение (https),
// для подключения к серверу используется прокси
ПроксиСервер = Новый интернетПрокси;
ПроксиСервер.Пользователь = имяПользователя;
ПроксиСервер.Пароль = парольПользователя;
Соединение = Новый HTTPСоединение("www.mysite.ru",,,, ПроксиСервер, Истина);
Пример загрузки файла
Код 1C v 8.х // Укажем настройки прокси-сервера
ПроксиСервер = Новый ИнтернетПрокси;
ПроксиСервер.Пользователь = "userfile";
ПроксиСервер.Пароль = "12345";
ПроксиСервер.Установить("http", "10.1.1.23", "3185");
СерверИсточник = "shop.com";
Адрес = "/price.asp";
ИмяВходящегоФайла = "c:\temp\input.html";
// Укажем в HTTP соединении что у нас есть проксик
НТТР = Новый HTTPСоединение(СерверИсточник,,,, ПроксиСервер);
НТТР.Получить(Адрес, ИмяВходящегоФайла);
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
Вот пример загрузки файла
Код 1C v 8.х //Создаем Файл для отправки
ИмяФайлаHTML = КаталогВременныхФайлов() + “My1cV8bNdr”;
ФайлHTML = Новый ЗаписьТекста(ИмяФайлаHTML, КодировкаТекста.ANSI);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr”);
ФайлHTML.ЗаписатьСтроку(”content -disposition: form-data; name=”"userfile”"; filename=”"test.htm”"”);
ФайлHTML.ЗаписатьСтроку(”Content -Type: text/html”);
ФайлHTML.ЗаписатьСтроку(”");
ФайлHTML.ЗаписатьСтроку(”Дальше вставляем html код.”);
ФайлHTML.ЗаписатьСтроку(”–My1cV8bNdr–”);
ФайлHTML.Закрыть();
// Если необходимо использовать прокси
ПроксиСервер = Новый ИнтернетПрокси();
ПроксиСервер.Сервер(”адрес прокси”);
ПроксиСервер.Порт(”порт прокси”);
ПроксиСервер.Пользователь = “пользователь прокси”;
ПроксиСервер.Пароль = “пароль прокси”;
// Формируем заголовок для запроса
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить(”Content -Type”, “multipart/form-data; boundary=My1cV8bNdr”);
// Устанавливаем соединение и отпровляем запрос
HTTP = Новый HTTPСоединение(”сервер куда соединяемся”, , , , ПроксиСервер);
HTTP.ОтправитьДляОбработки(ИмяФайлаHTML, “/upload.php”, КаталогВременныхФайлов() + “result.htm”, ЗаголовокHTTP);
HTTP = Неопределено;
Категория:
Работа с Интернет, Почтой (Mail), FTP Google maps : вывод точек на карту и режим панорамы В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают!
Для клиента нужно было сделать вывод объектов на карту
С возможностью просмотра панорамы:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html>
<html>
<head>
<meta name="viewport" content ="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content -Type" content ="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content ="IE=8">
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { height: 100% }
</style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.9&sensor=false"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="http://www.sitedev.by/lab/markerclusterer/markerclusterer.js"></script>
<script type="text/javascript">
var latlng;
var markers = [];
var myMap;
var index = 1;
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var infoWindow = new google.maps.InfoWindow;
var clusterer, mcOptions;
var trafficLayer = new google.maps.TrafficLayer();
var trafficOn = false;
var noclick = false;
var PointArray = [];
var polygons = [];
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
latlng = new google.maps.LatLng(55.75, 37.62);
var myOptions = {
zoom: 12,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
disableDoubleClickZoom: true,
panControl: true,
zoomControl: true,
mapTypeControl: true,
scaleControl: true,
streetViewControl: true,
overviewMapControl: true
};
myMap = new google.maps.Map(document.getElementById("map"),
myOptions);
google.maps.event.addListener(myMap, 'dragend', function() {
noclick = true;
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
});
google.maps.event.addListener(myMap, 'click', function(event) {
infoWindow.close();
if (!noclick) {
addMarker(event.latLng);
}else{
noclick = false;
}
});
mcOptions = {gridSize: 3, maxZoom: 15};
clusterer = new MarkerClusterer(myMap, markers, mcOptions);
//отображение кнопки управления трафиком - все спер с примера, только подцепил свою функцию
var trafficControlDiv = document.createElement('div');
trafficControlDiv.style.padding = '5px';
// Set CSS for the control border
var controlUI = document.createElement('div');
controlUI.style.backgroundColor = 'white';
controlUI.style.borderStyle = 'solid';
controlUI.style.borderWidth = '2px';
controlUI.style.cursor = 'pointer';
controlUI.style.textAlign = 'center';
controlUI.title = 'нажмите для вкл/выкл трафика';
trafficControlDiv.appendChild(controlUI);
// Set CSS for the control interior
var controlText = document.createElement('div');
controlText.style.fontFamily = 'Arial,sans-serif';
controlText.style.fontSize = '12px';
controlText.style.paddingLeft = '4px';
controlText.style.paddingRight = '4px';
controlText.innerHTML = '<b>Трафик</b>';
controlUI.appendChild(controlText);
google.maps.event.addDomListener(controlUI, 'click', function (){
if (!trafficOn){
trafficOn = true;
trafficLayer.setMap(myMap);
}else{
trafficOn = false;
trafficLayer.setMap(null);
}
});
trafficControlDiv.index = 1;
myMap.controls[google.maps.ControlPosition.TOP_RIGHT].push(trafficControlDiv);
};
//добавляем маркер и отправляем в массив
function addMarker(location) {
marker = new google.maps.Marker({
position: location,
map: myMap,
title: 'Точка'+index
});
infoWindow.setContent (marker.title);
infoWindow.open(myMap, marker);
google.maps.event.addListener(marker, 'click', function(){
var mark = this;
var latLng = mark.getPosition();
infoWindow.setContent (mark.title);
infoWindow.open(myMap, mark);});
markers.push(marker);
index++;
document.getElementById('CoordX').value = location.lat();
document.getElementById('CoordY').value = location.lng();
}
function calcRoute(options) {
//вытягиваем из массива переданных параметров значения
//и преобразуем их в формат LatLng
var option1 = options[0];//начальная точка
var option2 = options[1];//промежуточные точки
var option3 = options[2];//конечная точка
var start = new google.maps.LatLng(option1[0], option1[1]); //первый
var end = new google.maps.LatLng(option3[0], option3[1]); //последний
//получаем транзитные точки
var waypts = [];
if(option2.length > 0) {
for(var i = 0, l = option2.length; i < l; i++) {
temp = option2[i];
Qcoord = new google.maps.LatLng(temp[0], temp[1])
waypts.push({
location:Qcoord,
stopover:true
});
}
}
//return;
var request = {
origin: start,
destination: end,
waypoints: waypts,
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setMap(myMap);
directionsDisplay.setDirections(response);
var total = 0;
var myroute = response.routes[0];
for (i = 0; i < myroute.legs.length; i++) {
total += myroute.legs[i].distance.value;
}
total = total / 1000;
document.getElementById('RouteInfo').value = "Длина маршрута - " + total + "км.";
//генерация события для перехвата в 1С
var evt = document.createEventObject();
document.body.fireEvent('ondatasetcomplete', evt);
}else{
alert(status);
}
});
}
function Reset(){
directionsDisplay.setMap(null);
for (var i = 0; i < markers.length; i++) {
markers[i].setMap(null);
}
markers = [];
index = 1;
//обнуляем кластер маркеров
clusterer.clearMarkers();
for (var i = 0; i < polygons.length; i++) {
polygons[i].setMap(null);
}
polygons = [];
PointArray = [];
}
function FindAdres(Adres){
Reset();
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': Adres}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
latlng = results[0].geometry.location;
myMap.panTo(latlng);
marker = new google.maps.Marker({
map: myMap,
position: latlng,
animation: google.maps.Animation.BOUNCE,
title:Adres
});
markers.push(marker);
infoWindow.setContent (marker.title);
infoWindow.open(myMap, marker);
} else {
alert("Ничего не найдено: " + status);
}
});
}
function ReverseSearchAdres(CoordX, CoordY, Adres){
Reset();
latlng = new google.maps.LatLng(CoordX, CoordY);
myMap.panTo(latlng);
var marker = new google.maps.Marker({
map: myMap,
position: latlng,
animation: google.maps.Animation.BOUNCE,
title:Adres
});
markers.push(marker);
infoWindow.setContent (marker.title);
infoWindow.open(myMap, marker);
}
function addToPointArray(CoordX, CoordY, ID, IconT, Text){
var latLng = new google.maps.LatLng(CoordX, CoordY);
var point = new google.maps.Marker({'position': latLng, title: Text, icon: IconT});
PointArray.push(point);
}
function drawCluster(){
clusterer.addMarkers(PointArray);
//myMap.geoObjects.add(clusterer);
}
function createPolygon(ArrayPoint, Name, color) {
//создаем массив координат вершин многоугольника
var paths = [];
for(var i = 0, l = ArrayPoint.length; i < l; i++) {
var temp = ArrayPoint[i];
Qcoord = new google.maps.LatLng(temp[0], temp[1])
paths.push(Qcoord);
};
// Создаем многоугольник
myPolygon = new google.maps.Polygon({
paths: paths,
strokeColor: color,
strokeOpacity: 0.6,
strokeWeight: 5,
fillColor: "#0000FF"
});
myPolygon.setMap(myMap);
polygons.push(myPolygon);
}
function WebClientClick() {
//очистка перед кликом координат, иначе после клика в упр. формах идет считывание координат
document.getElementById('CoordX').value = "0";
document.getElementById('CoordY').value = "0";
var WebClientOperation = document.getElementById("WebClientOperation").value;
//alert(WebClientOperation);
switch (WebClientOperation) {
case "0": // ничего не делаем
var a = 1;
default: // запускаем функцию
eval(WebClientOperation);
}
document.getElementById('WebClientOperation').value = "0";
}
</script>
</head>
<body onload="initialize()">
<div id="map" style="width:100%; height:100%"></div>
<input type="hidden" id="CoordX" name="CoordX" value="0"></input>
<input type="hidden" id="CoordY" name="CoordY" value="0"></input>
<input type="hidden" id="RouteInfo" name="RouteInfo" value=""></input>
<input type="hidden" id="WebClientOperation" name="WebClientOperation" value="0"></input>
<input type="hidden" id="WebClient" name="WebClient" onclick="WebClientClick();"></input>
</body>
</html>
Код вывода карты:
Код 1C v 8.х Процедура ИнициализироватьКарту()
ПутьКФайлу = КаталогВременныхФайлов()+"Карта.html";
Ф = новый Файл(ПутьКФайлу);
Если Ф.Существует() Тогда
УдалитьФайлы(ПутьКФайлу);
КонецЕсли;
Т = новый ТекстовыйДокумент;
ТД = ЭтотОбъект.ПолучитьМакет("МакетГугл");
Т.УстановитьТекст(ТД.ПолучитьТекст());
Т.Записать(ПутьКФайлу);
ЭлементыФормы.Эксплорер.Перейти(ПутьКФайлу);
КонецПроцедуры
Процедура ОчиститьКарту()
ЭлементыФормы.Эксплорер.Документ.parentWindow.eval("Reset()");
КонецПроцедуры
//к сожалению, другого спососба получить "внутрь 1С" информацию о действии пользователя на карте я не сумел
//действие пользователя на карте изменяет поле HTML-документа, но не вызывает никакого события в 1с-ке
// поэтому через обработчикОжидания делаю непрерывный опрос карты
Процедура ПриОткрытии()
ИнициализироватьКарту();
КонецПроцедуры
// вывод точек на карту
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
ОчиститьКарту();
СписокВидов = Новый СписокЗначений;
Для Каждого стр из ВыборВывода Цикл
если стр.пометка тогда СписокВидов.Добавить(стр.наименование); КонецЕсли;
КонецЦикла;
табАдресов.Очистить();
табАдресов = получитьтабАдресов(СписокВидов);
табУникальныхАдресов = табАдресов.скопировать();
табУникальныхАдресов.свернуть("Уник");
тзДанных = табАдресов.скопировать();
табАдресов.очистить();
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура();
Отбор.Вставить("Уник",стр.Уник);
Строки = тзДанных.НайтиСтроки(Отбор);
НовСтр = табАдресов.добавить();
НовСтр.уник = стр.уник;
Если Строки.Количество() > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр.Адрес = тздстр.Адрес;
НовСтр.КД = тздстр.КД;
НовСтр.КШ = тздстр.КШ;
НовСтр.ВидОбъекта = тздстр.ВидОбъекта;
НовСтр.Наименование=Строка(НовСтр.Наименование)+Строка(тздстр.Наименование)+"; ";
КонецЦикла;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.табАдресов.СоздатьКолонки();
ВыборМасштаба = "50%";
ВыборРегиона = "Москва";
ЭлементыФормы.Надпись24.Заголовок = "Точек: "+Строка(табАдресов.количество());
Кол = табАдресов.Количество();
Индекс = 0;
Для Каждого ТекСтрока Из табАдресов Цикл Индекс = Индекс + 1; Если НЕ ЗначениеЗаполнено(ТекСтрока.КД) тогда Продолжить; КонецЕсли;
Широта = формат(ТекСтрока.КШ, "ЧРД=.");
Долгота = формат(ТекСтрока.КД, "ЧРД=.");
СодержимоеТочки = СокрЛП(ТекСтрока.ВидОбъекта)+": "+ СокрЛП(ТекСтрока.адрес); //опять же можно вставить свое название
Попытка
ЭлементыФормы.Эксплорер.Документ.parentWindow.eval("addToPointArray(" + Широта + "," + Долгота + ", '" + Строка(Индекс) + "', '" + СокрЛП(ТекСтрока.ВидОбъекта.ПутьКИконке)+ "', """ + СодержимоеТочки + """);");
Исключение
Сообщить("addToPointArray(" + Широта + "," + Долгота + ", '" + Строка(Индекс) + "', '" + СокрЛП(ТекСтрока.ВидОбъекта.ПутьКИконке)+ "', """ + СодержимоеТочки + """);",СтатусСообщения.Внимание);
КонецПопытки;
Состояние("Вывожу на карту " + Индекс + " из " + кол);
КонецЦикла;
ЭлементыФормы.Эксплорер.Документ.parentWindow.eval("drawCluster();");
КонецПроцедуры
Вырванная из конфигурации обработка GMaps.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Яндекс карта : вывод точек на карту Пример о том,как вывести яндекс карту на форму и далее работать с ней:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Примеры. Геокодирование.</title>
<meta http-equiv="Content -Type" content ="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANpUFEkFAAAAf7jmJwMAHGZHrcLKDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbduoIgTLAeFILaQ==" type="text/javascript"></script>
<script type="text/javascript">
var router;
var myPoints = new Array();
var myRouts = new Array();
var strOpen = "OPEN";
var strKontr = "Kontragent";
var t = new YMaps.Template('<b>$[name]</b><div id="descrID" >$[description]</div>');
YMaps.Templates.add("my#template", t);
var KopdinatShirota = 0;
var KopdinatDolgota = 0;
var UID_Zakaza = "";
/*vstavkaStiley;
var map, geoResult;
YMaps.jQuery(function () {
map = new YMaps.Map(YMaps.jQuery("#YMapsID")[0]);
map.setCenter(new YMaps.GeoPoint(37.62, 55.75), 12);
});
function showAddress (value, contrag, Styles, UID) {
var geocoder = new YMaps.Geocoder(value, {results: 1, boundedBy: map.getBounds()});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
if (this.length()) {
geoResult = this.get(0);
var point = new YMaps.GeoPoint(geoResult._point.__lng, geoResult._point.__lat);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}else {
}
});
YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error) {
alert("Произошла ошибка: " + error);
return null;
})
}
function showAddressCoord (shirota, dolgota, contrag, Styles, UID) {
var point = new YMaps.GeoPoint(dolgota, shirota);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}
function removeAllOverlays (map) {
map.removeAllOverlays();
}
function AddRoute(wayPoint1, wayPoint2) {
if (myRouts.length>0) {lastRouter = myRouts[myRouts.length-1]; map.removeOverlay(lastRouter)};
var myRouter = new YMaps.Router([wayPoint1, wayPoint2], [], {viewAutoApply: true});
map.addOverlay(myRouter);
YMaps.Events.observe(myRouter, myRouter.Events.Success, function (myRouter) {
myRouter.getWayPoint(0).setIconContent ('Начало маршрута');
myRouter.getWayPoint(1).setIconContent ('Конец маршрута');
dlMar = myRouter.getDistance()/1000;
document.title = 'Дистанция: '+ dlMar.toFixed(2);
});
myRouts.push(myRouter);
return true;
}
function mapRazmer(map, SentrSh, SentrDlg, razmer) {
map.setCenter(new YMaps.GeoPoint(SentrSh, SentrDlg), razmer);
}
function changeStyle(numTochki, imStyle){
var restoreDefault = true;
tochka = myPoints[numTochki];
tochka.setOptions({style: imStyle}, restoreDefault);
point = tochka.getCoordPoint();
map.setCenter(new YMaps.GeoPoint(point.__lng, point.__lat), 12);
map.redraw();
return tochka.description;
}
</script>
</head>
<body //~~onload~~>
<div id="YMapsID" style="width:100%;height:100%"></div>
</form>
</body>
</html>
Код вывода карты:
Код 1C v 8.х //берем HTML-текст из макета и доделываем его
//создаем столько стилей, сколько есть различных картинок в папке "icons_"
//Загружаем в поле HTML-документа
//и позиционируем центр карты на Москву
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Макет = ПолучитьМакет("Макет");
КодХТМЛ = Макет.ПолучитьТекст();
СтрокаСтиляНачальная = "var BurG = new YMaps.Style();
|BurG.iconStyle = new YMaps.IconStyle();
|BurG.iconStyle.offset = new YMaps.Point(-12, -12);
|BurG.iconStyle.href = ""http://www.burgerking.ru/favicon.ico"";
|BurG.iconStyle.size = new YMaps.Point(20, 20);
|BurG.hideIcon = false;
|BurG.balloonContent Style = new YMaps.BalloonContent Style(""my#template"");";
СтрокаСтиляИтоговая = "";
//
//имяКаталогаКартинок = "D:\!1C\MAPS\icons_";
//КаталогКартинок = Новый Файл(имяКаталогаКартинок);
//Если КаталогКартинок.ЭтоКаталог() тогда
// списокИменКартинок = новый таблицаЗначений;
// списокИменКартинок.Колонки.Добавить("ИмяСтиля");
// списокИменКартинок.Колонки.Добавить("ИмяФайлаКартинки");
// МассивНайденных = НайтиФайлы(имяКаталогаКартинок, "*.gif");
// Для Каждого Файл из МассивНайденных Цикл
//
// времСтрокаСтиля = СтрокаСтиляНачальная;
// времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "BurG", сокрЛП(Файл.ИмяБезРасширения));
// времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "C:/icons_/kv2_5_x.gif", "C:/icons_/" + сокрЛП(Файл.Имя));
//
// СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы.ПС;
//
// КонецЦикла;
//конецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВидыОбъектов.Ссылка,
| ВидыОбъектов.ПутьКИконке,
| ВидыОбъектов.Код
|ИЗ
| Справочник.ВидыОбъектов КАК ВидыОбъектов
|ГДЕ
| ВидыОбъектов.ПометкаУдаления = ЛОЖЬ";
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
времСтрокаСтиля = СтрокаСтиляНачальная;
времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "BurG", "s"+Строка(ВыборкаДетальныеЗаписи.код));
времСтрокаСтиля = стрЗаменить(времСтрокаСтиля, "http://www.burgerking.ru/favicon.ico", сокрЛП(ВыборкаДетальныеЗаписи.ПутьКИконке));
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы.ПС;
КонецЦикла;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + СтрокаСтиляНачальная + символы.ПС;
КодХТМЛ = стрЗаменить(КодХТМЛ, "/*vstavkaStiley;", СтрокаСтиляИтоговая);
путьККаталогуКартинок = СтрЗаменить(КаталогПрограммы(), "\", "/");
КодХТМЛ = СтрЗаменить(КодХТМЛ,"C:/",путьККаталогуКартинок);
ЭлементыФормы.Карта.УстановитьТекст(КодХТМЛ);
табАдресов = получитьтабАдресов();
табУникальныхАдресов = табАдресов.скопировать();
табУникальныхАдресов.свернуть("Уник");
тзДанных = табАдресов.скопировать();
табАдресов.очистить();
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура();
Отбор.Вставить("Уник",стр.Уник);
Строки = тзДанных.НайтиСтроки(Отбор);
НовСтр = табАдресов.добавить();
НовСтр.уник = стр.уник;
Если Строки.Количество() > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр.Адрес = тздстр.Адрес;
НовСтр.КД = тздстр.КД;
НовСтр.КШ = тздстр.КШ;
НовСтр.ВидОбъекта = тздстр.ВидОбъекта;
НовСтр.Наименование=Строка(НовСтр.Наименование)+Строка(тздстр.Наименование)+"; ";
КонецЦикла;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.табАдресов.СоздатьКолонки();
ВыборМасштаба = "50%";
ВыборРегиона = "Москва";
ЭлементыФормы.Надпись24.Заголовок = "Точек: "+Строка(табАдресов.количество());
КонецПроцедуры
// Вывод точек на карту
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
//имя стиля совпадает с именем картинки без расширения
Всего=Строка(табАдресов.Количество()); н=0;
Для каждого строкаАдреса Из табАдресов Цикл
н=н+1; Состояние("Вывод "+Строка(н)+" из "+Всего);
////ЭТО ПРИМЕР ВЫВОДА ТОГО ИЛИ ИНОГО МАРКЕРА В ЗАВИСИМОСТИ ОТ НЕКОЕГО ПАРАМЕТРА
//Если строкаАдреса.ДокументПродажи.суммаДокумента <1000 тогда
// имяСтиля = "BurG";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <10000 тогда
// имяСтиля = "tr2_3_x";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <20000 тогда
// имяСтиля = "kv3_4_x";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <50000 тогда
// имяСтиля = "tr4_1_x";
//ИначеЕсли строкаАдреса.ДокументПродажи.суммаДокумента <100000 тогда
// имяСтиля = "kv5_2_x";
//Иначе
// имяСтиля = "cr6_3_x";
//конецЕсли;
УИД_Дока = Строка(н);
имяСтиля = "s"+Строка(строкаАдреса.ВидОбъекта.код);
Попытка
Если ЗначениеЗаполнено(строкаАдреса.КД) Тогда
ВызовФункции = "showAddressCoord(" + сокрЛП(строкаАдреса.КШ) + ", " + сокрЛП(строкаАдреса.КД) + ", '"+ сокрЛП(строкаАдреса.адрес) + "', " + имяСтиля + ", '" + сокрЛП(строкаАдреса.ВидОбъекта.наименование) + "')";
Иначе
ВызовФункции = "showAddress('" + сокрЛП(строкаАдреса.адрес) + "', '" + сокрЛП(строкаАдреса.адрес) + "', " + имяСтиля + ", '" + сокрЛП(строкаАдреса.ВидОбъекта.наименование) + "')";
КонецЕсли;
ЭлементыФормы.Карта.Document.parentWindow.eval(ВызовФункции);
исключение
Сообщить("Точка с адресом " + сокрЛП(строкаАдреса.адрес) + " не может быть отбражена на карте!" );
конецПопытки
КонецЦикла;
ТочкиНеСозданы = Ложь;
ЭлементыФормы.Карта.ПолучитьТекст();
КонецПроцедуры
//Изменение масштаба
Процедура Кнопка1Нажатие(Элемент)
если ЭлементыФормы.ВыборРегиона.значение = "Москва" Тогда
СтрокаКоординат = "37.64, 55.76, ";
ИначеЕсли ЭлементыФормы.ВыборРегиона.значение = "Тверь" Тогда
СтрокаКоординат = "35.90, 56.83, ";
ИначеЕсли ЭлементыФормы.ВыборРегиона.значение = "Балашиха" Тогда
СтрокаКоординат = "37.97, 55.82, ";
Иначе
СтрокаКоординат = "37.64, 55.76, ";
конецесли;
Если ВыборМасштаба = "" тогда
возврат;
конецесли;
числоМасштаба = Число(Лев(ВыборМасштаба, стрдлина(ВыборМасштаба)-1));
числоМасштаба = числоМасштаба + 5;
ВыборМасштаба = строка(числоМасштаба) + "%";
ТекущийМасштаб = Строка(Цел((числоМасштаба/125)*(20)+4));
если стрДлина(ТекущийМасштаб) =1 тогда
ТекущийМасштаб = "0" + ТекущийМасштаб;
конецесли;
ЭлементыФормы.Карта.Document.parentWindow.eval("mapRazmer(map," + СтрокаКоординат + ТекущийМасштаб + ")");
КонецПроцедуры
Пример обратного геокодирования - получение координат по адресу:
Код 1C v 8.х Процедура ПолучитьКоординаты() Экспорт
Яндекс = Новый HTTPСоединение("geocode-maps.yandex.ru",,,,,Истина);
ВременныйФайл = КаталогВременныхФайлов() + "Yandex_geocode_" + СокрЛП(Новый УникальныйИдентификатор);
Попытка
Яндекс.Получить("/1.x/?geocode=" + Адрес + "&results=1", ВременныйФайл);
Исключение
Сообщить("Ошибка при попытке геокодировать по яндексу адрес: " + Адрес);
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ВременныйФайл);
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM.Прочитать(ЧтениеXML);
СписокText = ДокументДОМ.ПолучитьЭлементыПоИмени("text");
СписокPos = ДокументДОМ.ПолучитьЭлементыПоИмени("pos");
Если (СписокText.Количество() = 0) ИЛИ (СписокPos.Количество() = 0) Тогда
Возврат;
КонецЕсли;
Для ъ = 0 по СписокText.Количество()-1 Цикл
Координаты = СписокPos[Ъ].ТекстовоеСодержимое;
Разделитель = Найти(Координаты," ");
Широта = Число(Сред(Координаты, Разделитель + 1));
Долгота = Число(Лев(Координаты, Разделитель - 1));
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли;
КД = Долгота;
КШ = Широта;
КонецЦикла;
КонецПроцедуры
Обработка вырванная из конфигурации: YandexMap.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Универсальный парсер RSS для 1С На одном проекте - клиент попросил отображать в программе данные, которые выдаю специализированные сайта в формате RSS - Что делать !?
Писать парсер rss для 1С
Первым делом, взглянув на ссылки, подумал что - обычный XML, сейчас его разложу и быстренько загружу в базу, но:
Выяснилось что сайты имеют разные форматы ввода RSS и главное они не валидные(
таким образом, написав небольшой код, который получает ссылку, далее XMLФайл.Прочитать() на одном сайте проходил на ура (этот пример я описывал в статье: Чтение данных с сайта в формате XML и загрузка в 1С ), а вот второй сайт, и третий тоже, при попытке прочитать() выдавали:
{ОбщийМодуль.РегЗадания.Модуль(79)}: Ошибка при вызове метода контекста (Прочитать)
Пока XMLФайл.Прочитать() Цикл
по причине:
Ошибка разбора XML: - [1,1]
Фатальная ошибка:
Extra content at the end of the document
SystemId url rss
решил попробовать на rss других известных сайтов - 80% из проверяемых выдавали ошибку
Пришлось написать прямой построчный парсер RSS: Структура конфигурации
ИсточникиRSS - URL на RSS, ДанныеRSS - сюда записываются загруженные данные новостей
Код получился таким(в принципе код универсальный, но возможно что-то придется подпилить):
Код 1C v 8.3
// RSS
Процедура ПрочитатьRSS(ИсточникRSS)
url = ИсточникRSS.UrlRSS;
// Получим Сервер
Если Найти(url,".ru")>0 Тогда urlСервер = Лев(url,Найти(url,".ru")+2);
ИначеЕсли Найти(url,".com")>0 Тогда urlСервер = Лев(url,Найти(url,".com")+3);
ИначеЕсли Найти(url,".org")>0 Тогда urlСервер = Лев(url,Найти(url,".org")+3);
ИначеЕсли Найти(url,".info")>0 Тогда urlСервер = Лев(url,Найти(url,".info")+4);
ИначеЕсли Найти(url,".pro")>0 Тогда urlСервер = Лев(url,Найти(url,".pro")+3);
КонецЕсли;
//Определим тип соединения
Если Лев(url,5)="https" Тогда
//ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
ssl = Новый ЗащищенноеСоединениеOpenSSL( неопределено, неопределено );
ТекАдрес = СтрЗаменить(url,urlСервер,""); Сервер = СтрЗаменить(urlСервер,"https://","");
Соединение = Новый HTTPСоединение(Сервер,,,,,
5, // таймаут в секундах
ssl // защищенное HTTPS соединение
);
Иначе //Обычный HTTP
ТекАдрес = СтрЗаменить(url,urlСервер,""); Сервер = СтрЗаменить(urlСервер,"http://","");
Соединение = Новый HTTPСоединение(Сервер);
КонецЕсли;
Заголовки = Новый Соответствие;
Заголовки.Вставить("host", Сервер);
Запрос = Новый HTTPЗапрос(ТекАдрес, Заголовки);
Ответ =Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда // Данные получены, обрабатываем их
Содержимое= Ответ.ПолучитьТелоКакСтроку();
//Преобразуем содержимое
Содержимое = СтрЗаменить(Содержимое,"<br/>","|");
Содержимое = СтрЗаменить(Содержимое,"<![CDATA[",""); Содержимое = СтрЗаменить(Содержимое,"]]>","");
Содержимое = СтрЗаменить(Содержимое,Символы.ПС,""); Содержимое = СтрЗаменить(Содержимое,Символы.ВК,"");
Содержимое = СтрЗаменить(Содержимое,Символы.ВТаб,""); Содержимое = СтрЗаменить(Содержимое,Символы.Таб,"");
Содержимое = СтрЗаменить(Содержимое,"><",">"+Символы.ПС+"<");
RegExp = Новый COMОбъект("VBScript.RegExp"); //Регулярка
RegExp.IgnoreCase = Ложь;
RegExp.Global = Истина;
RegExp.MultiLine = Истина;
RegExp.Pattern = "<[^>]*>"; //Ищем теги HTML
//Разберем полученный текст в таблицу
ЭтоЗапись=Ложь;
Для н=1 По СтрЧислоСтрок(Содержимое)Цикл
обрТекст=СтрПолучитьСтроку(Содержимое,н);
Если обрТекст = "<item>" Тогда //Началась запись
ЗаписьСтр = Новый Структура(); ЭтоЗапись=Истина; Продолжить;
ИначеЕсли обрТекст = "</item>" Тогда //Закончилась запись
/////////////// ЗАПИСЬ Закончилась //////////////
/// теперь запишем ее в базу - Справочник ДанныеRSS
// сначала ПОИСК ДУБЛЕЙ - вдруг уже загружен
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеRSS.Ссылка
|ИЗ
| Справочник.ДанныеRSS КАК ДанныеRSS
|ГДЕ
| ДанныеRSS.ИсточникRSS =ИсточникRSS
| И ДанныеRSS.link ПОДОБНОlink";
Запрос.УстановитьПараметр("link", "%"+ЗаписьСтр.link+"%");
Запрос.УстановитьПараметр("ИсточникRSS", ИсточникRSS);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
Если РезультатЗапроса.Следующий() Тогда
// Такая запись уже есть, пока ничего не делаем
Иначе
//СОЗДАЕМ Новый
НовЭлем = Справочники.ДанныеRSS.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(НовЭлем,ЗаписьСтр);
НовЭлем.ИсточникRSS = ИсточникRSS;
НовЭлем.Записать();
КонецЕсли;
/////////////////////// *** /////////////////////
ЭтоЗапись=Ложь; Продолжить;
КонецЕсли; //Данные записи
Если ЭтоЗапись Тогда
Если Найти(обрТекст,"title>")>0 и Найти(обрТекст,"/title>")>0 Тогда
обрТекст = СтрЗаменить(обрТекст,"title",""); обрТекст = СтрЗаменить(обрТекст,"<>",""); обрТекст = СтрЗаменить(обрТекст,"</>","");
ЗаписьСтр.Вставить("Наименование",СокрЛП(обрТекст));
КонецЕсли;
Если Найти(обрТекст,"link>")>0 и Найти(обрТекст,"/link>")>0 Тогда
обрТекст = СтрЗаменить(обрТекст,"link",""); обрТекст = СтрЗаменить(обрТекст,"<>",""); обрТекст = СтрЗаменить(обрТекст,"</>","");
ЗаписьСтр.Вставить("link",СокрЛП(обрТекст));
КонецЕсли;
Если Найти(обрТекст,"description>")>0 и Найти(обрТекст,"/description>")>0 Тогда
обрТекст = СтрЗаменить(обрТекст,"description",""); обрТекст = СтрЗаменить(обрТекст,"<>",""); обрТекст = СтрЗаменить(обрТекст,"</>","");
обрТекст=RegExp.Replace(обрТекст, ""); //Удалим все теги
ЗаписьСтр.Вставить("desc",СокрЛП(обрТекст));
КонецЕсли;
Если Найти(обрТекст,"pubDate>")>0 и Найти(обрТекст,"/pubDate>")>0 Тогда
обрТекст = СтрЗаменить(обрТекст,"pubDate",""); обрТекст = СтрЗаменить(обрТекст,"<>",""); обрТекст = СтрЗаменить(обрТекст,"</>","");
ЗаписьСтр.Вставить("pubDate",ПреобразоватьRFC822КДате0(СокрЛП(обрТекст)));
КонецЕсли;
Если Найти(обрТекст,"enclosure")>0 Тогда
обрТекст = СтрЗаменить(обрТекст,"""",""); обрТекст = СтрЗаменить(обрТекст,"<enclosure url=","");
обрТекст = СтрЗаменить(обрТекст,"<enclosure url=",""); обрТекст = СтрЗаменить(обрТекст,"type=image/png length=/>","");
ЗаписьСтр.Вставить("img",СокрЛП(обрТекст));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПроверкаRSS() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИсточникиRSS.Ссылка КАК Ссылка
|ИЗ
| Справочник.ИсточникиRSS КАК ИсточникиRSS
|ГДЕ
| ИсточникиRSS.Использовать
| И ДОБАВИТЬКДАТЕ(ИсточникиRSS.ДатаПоследнегоОбновления, СЕКУНДА, ИсточникиRSS.ПериодОбновленияВСекундах) <ТекДата";
Запрос.УстановитьПараметр("ТекДата", ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ПрочитатьRSS(ВыборкаДетальныеЗаписи.Ссылка);
// Запишем дату последнего обновления
ТекОб = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
ТекОб.ДатаПоследнегоОбновления = ТекущаяДата();
ТекОб.Записать();
КонецЦикла;
КонецПроцедуры
Функция ПреобразоватьRFC822КДате0(ДатаВФорматеRFC822) Экспорт
КопияСтроки = ДатаВФорматеRFC822;
СтруктураДаты = Новый Структура("Год,Месяц,День,Час,Минута,Секунда", "","","","","","");
Месяцы = Новый Структура("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", "01","02","03","04","05","06","07","08","09","10","11","12");
Для каждого КлючИЗначение Из Месяцы Цикл
Позиция = Найти(КопияСтроки,КлючИЗначение.Ключ);
Если Позиция > 0 Тогда
СтруктураДаты.Месяц = КлючИЗначение.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
Состояние = 0;
КопияСтроки = СтрЗаменить(КопияСтроки,", 1 ",", 01 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 2 ",", 02 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 3 ",", 03 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 4 ",", 04 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 5 ",", 05 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 6 ",", 06 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 7 ",", 07 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 8 ",", 08 ");
КопияСтроки = СтрЗаменить(КопияСтроки,", 9 ",", 09 ");
Для ш=0 По СтрДлина(КопияСтроки) Цикл
ТекущийСимвол = Сред(КопияСтроки,ш,1); //ПолучитьСимвол(КопияСтроки, ш);
ТекСимволЦифра= ЭтоЦифра(ТекущийСимвол);
Если ТекСимволЦифра И Состояние = 0 Тогда
СтруктураДаты.День = СтруктураДаты.День + ТекущийСимвол;
Состояние = 1; //начало день
ИначеЕсли ТекСимволЦифра И Состояние = 1 Тогда
СтруктураДаты.День = СтруктураДаты.День + ТекущийСимвол;
Состояние = 2; //ждем год
ИначеЕсли ТекСимволЦифра И Состояние = 2 Тогда
СтруктураДаты.Год = СтруктураДаты.Год + ТекущийСимвол;
Состояние = 3; //продолжаем год
ИначеЕсли ТекСимволЦифра И Состояние = 3 Тогда
СтруктураДаты.Год = СтруктураДаты.Год + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = " " И Состояние = 3 Тогда
Состояние = 4; //дальше час
ИначеЕсли ТекСимволЦифра И Состояние = 4 Тогда
СтруктураДаты.Час = СтруктураДаты.Час + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = ":" И Состояние = 4 Тогда
Состояние = 5; //дальше минута
ИначеЕсли ТекСимволЦифра И Состояние = 5 Тогда
СтруктураДаты.Минута = СтруктураДаты.Минута + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = ":" И Состояние = 5 Тогда
Состояние = 6; //дальше секунда
ИначеЕсли ТекСимволЦифра И Состояние = 6 Тогда
СтруктураДаты.Секунда = СтруктураДаты.Секунда + ТекущийСимвол;
ИначеЕсли ТекущийСимвол = " " И Состояние = 6 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Попытка
Результат = Дата(СтруктураДаты.Год+СтруктураДаты.Месяц+СтруктураДаты.День
+СтруктураДаты.Час+СтруктураДаты.Минута+СтруктураДаты.Секунда);
Исключение
Результат = Неопределено;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ЭтоЦифра(Символ) Экспорт
Если (КодСимвола(Символ)>=48) И (КодСимвола(Символ)<=57) Тогда Возврат Истина; Иначе Возврат ложь; КонецЕсли;
КонецФункции
Функция ПолучитьСимвол(КопияСтроки, ш)
Возврат Сред(КопияСтроки,ш,1);
КонецФункции
Результат загрузки новостей RSS HelpF.pro
Кстати, как позже выяснилось, здесь уже есть статья с примером через IE и DOM: Получения новостей с RSS-канала сайта buh.ru
Категория:
Работа с Интернет, Почтой (Mail), FTP Как в 1С проложить маршрут используя GoogleMaps API V3 Клиенты частенько просят настроить отображение маршрутов перемещения по разным адресам в 1С, например для курьеров и т.д.
В примере описан способ отражения карт GoogleMaps в 1С:
Код 1C v 8.2 УП Для Каждого Стр Из НаВходе Цикл
нСтр = ПроверкаСовпадений.Добавить();
нСтр.Адрес = Стр.Адрес;
нСтр.Контрагент = Стр.Контрагент;
//Если адрес начальный или конечный - пропускаем
Если Стр.НомерСтроки = 1 или Стр.НомерСтроки = НаВходе.Количество() Тогда
Продолжить;
КонецЕсли;
опАдреса = опАдреса + "
|waypts.push({location:'" + нСтр.Адрес + "',stopover:true});";
КонецЦикла;
//Подставляем параметры в макет "Карта"
опМаршрут = ПолучитьМакет("Карта").ПолучитьТекст();
опМаршрут = СтрЗаменить(опМаршрут,"[=-опАдреса-=]",опАдреса);
опМаршрут = СтрЗаменить(опМаршрут,"[=-опНач-=]",опНач);
опМаршрут = СтрЗаменить(опМаршрут,"[=-опКон-=]",опКон);
ЭлементыФормы.Карта.УстановитьТекст(опМаршрут);
Скрипт отображения из макета Карта (выделила как VBS, но по факту это HTML ):
Код VBS <HTML><HEAD>
<META content ="text/html; charset=utf-8" http-equiv=Content -Type></META>
<META name=viewport content ="initial-scale=1.0, user-scalable=no"></META>
<STYLE type=text/css>HTML {
HEIGHT: 100%
}
BODY {
HEIGHT: 100%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px
}
#map_canvas {
HEIGHT: 100%
}
</STYLE>
<SCRIPT type=text/javascript src="http://maps.google.com/maps/api/js?sensor=false">
</SCRIPT>
<SCRIPT type=text/javascript>
var directionDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
var chicago = new google.maps.LatLng(55.81234, 37.664425);
var myOptions = {
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP,
center: chicago
}
map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
directionsDisplay.setMap(map);
calcRoute();
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map);
}
function calcRoute() {
var start = "[=-опНач-=]";
var end = "[=-опКон-=]";
var waypts = [];
var checkboxArray = document.getElementById("waypoints");
[=-опАдреса-=]
var request = {
origin: start,
destination: end,
waypoints: waypts,
optimizeWaypoints: true,
travelMode: google.maps.DirectionsTravelMode.DRIVING
};
directionsService.route(request, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
var route = response.routes[0];
var summaryPanel = document.getElementById("directions_panel");
summaryPanel.innerHTML = "";
// For each route, display summary information.
for (var i = 0; i < route.legs.length; i++) {
var routeSegment = i+1;
summaryPanel.innerHTML += 'опЗаполнитьМаршрут("' + String.fromCharCode(routeSegment+65) + '","' + String.fromCharCode(route.legs.length+65) + '","' + route.legs[i].start_address + '","' + route.legs[i].end_address + '","' + route.legs[i].distance.text + '");';
}
}
});
}
</SCRIPT>
<META name=GENERATOR content ="MSHTML 11.00.9600.17239"></META><BASE href="v8config://c924c032-2565-45e2-b49f-9a30494bc69f/mdobject/ida329e781-b8d1-431e-9e2f-8321c1a691fc/8eb4fad1-1fa6-403e-970f-2c12dbb43e23"></BASE></HEAD>
<BODY onload=initialize()>
<DIV id=map_canvas style="HEIGHT: 100%; WIDTH: 100%"></DIV>
<DIV id=directions_panel style="MARGIN: 20px; DISPLAY: none; BACKGROUND-COLOR: #ffee77"></DIV></BODY></HTML>
Файл отображающий пример работы GoogleMaps API V3 - Прокладываем маршрут в 1С
Скрин это обработки
Категория:
HTML, JS, VML Работа с почтой с помощью внешней компоненты DialMail Скачать компоненту dialmail.dll и примеры работы в 1С Скачивать файлы может только зарегистрированный пользователь!
Подключение:
Код 1C v 7.x Процедура ПриОткрытии()
Путь = КаталогИБ() + "DialMail.dll";
Если ЗагрузитьВнешнююКомпоненту(Путь) = 0 Тогда Сообщить("Неудачная попытка загрузить DialMail.dll"); КонецЕсли;
КонецПроцедуры;
Отправка почты:
Код 1C v 7.x Процедура ОтправитьПочту()
ОтправкаПочты = СоздатьОбъект("AddIn.SMTP");
ОтправкаПочты.РабочийКаталог=СокрЛП(КаталогИБ());
ОтправкаПочты.УстановитьКодировкуИСпособКодирования(14, 1);
ОтправкаПочты.MakeContent DescriptionTag = 0;
ОтправкаПочты.ПочтоваяПрограмма = "Имя почтовой программы";
//В моем случае ошибки пишутся в отдельный каталог в текстовые файлы, имена которых соответствуют дате.
ВыбФайл = СокрЛП(КаталогОшибок) +"\"+ СокрЛП(ДатаЧисло(ТекущаяДата())) + СокрЛП(ДатаМесяц(ТекущаяДата()))+ СокрЛП(ДатаГод(ТекущаяДата())) + ".txt";
//имя файла - вложения должно быть в кавычках.
ВыбФайл = """" + ВыбФайл + """";
// От кого, Кому, Копии - это адреса почты.
ОтправкаПочты.СоздатьПисьмо(ОтКого,Кому,СокрЛП(СпрПочта.Копии),"Ошибки обмена в " + СокрЛП(Константа.Магазин.Наименование),,"Данное письмо сформировано автоматически. Смотри вложение",СокрЛП(ВыбФайл));
Если ОтправкаПочты.Подключиться("smtp.mail.ru","25",ИмяПользователя,Пароль)=0 тогда
Сообщить("Не смогли подключиться к SMTP-серверу");
КонецЕсли;
Если ОтправкаПочты.ОтправитьВсеПисьма(0,1,0) = -100 Тогда
Сообщить("Успешно отправлено");
КонецЕсли;
КонецПроцедуры
******************************* FAQ **************************************
(1) Как организовать дозвон? (тонкости организации дозвона)
1. Во первых, надо вручную создать подключение в списке удаленного
доступа (win 2000 - пуск, настройка, сеть и уд.доступ, создание
нового подключения).
Или создать подключение с помощью компоненты (см. "Атрибуты
подключений" и "СохранитьНастройкиПодключения()").
2. Если импульсный набор, то перед номером телефона надо ставить "p"
напр "p212121", тоновый - по умолчанию или "t". Если необходимо ждать
гудка после цифры, то ставится "w", напр. "t8w0952223333".
3. (только если RAS-сервер находится под управлением Windows 95-98)
Если система-клиент NT, 2000 или XP тогда в свойствах созданного
в п.1 соединения в разделе "Безопасность" выберите возможность
отправления незашифрованного пароля (win 2000 - закладка
"безопасность", п. Дополнительные (особые параметры), кн
"Настройка", п.Разрешить следующие протоколы, галочка
ТОЛЬКО на "Незашифрованный пароль PAP")
4. При вызове дозвона, необходимо использовать имя созданного в
п.1 подключения в качестве первого параметра.
5. При использовании процедуры "ОбработкаВнешнегоСобытия" (последний
параметр = 1 в Дозвониться (RASDIAL), ПолучитьПисьмо,
ПолучитьВсеПисьма (POP3), ОтправитьПисьмо, ОтправитьВсеПисьма(SMTP)
форма подключения в обязательном порядке должна быть в "фокусе",
иначе события могут теряться. Вернее они не теряются, а начинают
(пытаются) обрабатываться в глобальном модуле.
*********************************************************************
(2) Через какие объекты добраться до общих методов ?
Если методы и свойства "общие" это значит, что у объектов POP3 и SMTP есть одинаково действующие
методы и свойства.
Код 1C v 7.x Получ=СоздатьОбъект("AddIn.POP3");
Отпр=СоздатьОбъект("AddIn.SMTP");
Получ.РабочийКаталог="c:\Export\";
Отпр.РабочийКаталог="c:\Import\";
!!! Отметим при этом, что Получ.РабочийКаталог<>Отпр.РабочийКаталог !!!
"РабочийКаталог" - одинаковое свойство для объектов POP3 и SMTP
*********************************************************************
(3) Почему при дозвоне компонента 3 раза подряд генерирует
событие "Начало Аутенфикации"?.
Дозвон происходит через системную DLL'ку RasDial.
Все события, которые генерируются этой DLL'кой перенаправляются
компонентой DialMail в 1С (процедура ОбработкаВнешнегоСобытия(...))
Так что от компоненты в данном случае ничего не зависит.
Причина этого (можно предположить) лежит на уровне того сервера,
к которому идет подсоединение (кто мешает аутенфикацию
проводить 3 раза или 3-мя различными способами?).
*********************************************************************
(4) При дозвоне (отправке, приеме почты) у меня в форме перестают
генерироваться события в процедуре ОбработкаВнешнегоСобытия(...),
хотя дозвон (отправка, прием почты) продолжает свою работу.
Это глюк 1С. Проявляется иногда во время работы компоненты при
сворачивании окон программ,открытия новых окон программ, при
потере фокуса 1С-Предприятием. Лечится это следующим образом.
На самом деле все события, сгенерированные компонентой, не пропадают
если процедуру ОбработкаВнешнегоСобытия(...) разместить
в глобальном модуле. В этом случае нам нужна будет глобальная
переменная - контекст нашей формы. Все переменные, которые нам
понадобятся в процедуре ОбработкаВнешнегоСобытия(...), можно
сделать либо глобальными, либо разместить на нашей форме в виде
невидимых реквизитов.
КоличествоСобытий - реквизит, размещенный на нашей форме
Код 1C v 7.x //Глобальный модуль
========================================
Перем КонтекстНашейФормы Экспорт;
...
Процедура ВзятьКонтекст(Конт) Экспорт
КонтекстНашейФормы=Конт;
КонецПроцедуры
Процедура ОсвободитьКонтекст() Экспорт
КонтекстНашейФормы=-1;
КонецПроцедуры
...
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
...
Если КонтекстНашейФормы<>-1 тогда
КонтекстНашейФормы.КоличествоСобытий=КоличествоСобытий+1;
КонтекстНашейФормы.Форма.Обновить(0);
КонецЕсли;
...
КонецПроцедуры
...
КонтекстНашейФормы=-1;
========================================
Модуль нашей формы
========================================
Перем Дозвон;
Процедура ПриОткрытии()
...
ЗагрузитьВнешнююКомпоненту("DialMail.dll");
Дозвон=СоздатьОбъект("AddIn.RasDial");
ВзятьКонтекст(Конт);
...
КонецПроцедуры
Процедура ПриЗакрытии()
...
ОсвободитьКонтекст(Конт)
...
КонецПроцедуры
Процедура НашДозвон()
Дозвон.Дозвониться("Мое соединение",
"логин","пароль","p1055555",1);
КонецПроцедуры
========================================
*********************************************************************
(5) Можно ли использовать дозвон для разговоров по телефону?
Нет. Компонента не предназначена для простых звонков на
телефон. Только для установления "сетевого" соединения между
2-мя компьютерами (например, между клиентским компьютером и
компьютером провайдера).
*********************************************************************
(6) Хотелось бы использовать компоненту DialMail в проектах,
написанных на Visual Basic, Delphi и т.д.
Компонента 1С хоть и полностью COM объект, но интерфейс
особый, свой - 1С-ий. Чтобы работать с данной компонентой
из других средств разработки, надо полностью переписывать
компоненту. Мне это не нужно, да и нет времени.
*********************************************************************
(7) Дайте исходники!
Модули Synapse, на которых базируются почтовые клиенты компонеты, лежат
в http://www.ararat.cz/synapse/ , могу прислать примеры компоненты
и интерфейсный модуль RasUnit.pas (для облегченной работы с RAS API -
тоже кстати из инета). Могу оказать посильную помощь, если что-то с этими
исходниками будет неясно. Но полностью исходники выложу в свободное
распространение только когда не буду поддерживать компоненту.
*********************************************************************
(8) Почему при передаче/приеме почты возникает ошибка 10054?
10054 - "Connection reset by peer", т.е. "Соединение сброшено удаленной
системой"
Происходит в результате:
1. Выключения сокета на удаленной машине в
рез-те ресета или таймаута
2. Вызывается локальной машиной при обнаружении потери
соединения (например, если дозванивались по dial-up и соединение
разорвалось - свойственно плохим модемам и плохим тел. линиям)
3. Связано с неправильным использованием "потоков" при приеме/передаче
Например, последовательность
Код 1C v 7.x pop3.ПолучитьВсеПисьма(0,1,1);
pop3.Отключиться();
может вызвать именно эту ошибку.
Пояснение: Т.к. получение запущено в отдельном потоке (3-ий параметр=1),
команда отключения вызовет закрытие сокета. Поток, который принимает почту,
из-за закрытия сокета "внешним процессом" инициирует данную ошибку -
фактически причина №2.
*********************************************************************
(9) RasDial: Как задать импульсный/тоновый набор номера,
паузу для ожидания гудка, и т.п. ?
Начинаться номер телефона может с "p" или "t" - cоответственно импульсный
или тоновый набор номера, по умолчанию - тоновый набор номера.
"w" - пауза, дождемся гудка - "линия свободна", "," - пауза в не помню сколько
времени (1 сек?) Пример задания телефонного номера: p8w095,,1234567
В данном примере - 'p' - импульсный набор, после '8' пауза, дождемся гудка,
после '095' подождем 2 сек и продолжим набирать номер. Более подробную
информацию по данным управляющим символам можно найти на просторах интернета.
*********************************************************************
Компонента DIALMAIL. (c) SWA corp. (e-mail:SWA@list.ru) Категория:
Работа с Интернет, Почтой (Mail), FTP Замена текста в автофигуре word Есть документ Word.
Заполняю программно:
TextFind.Execute("[V1]", Ложь, Истина, Ложь, , , Истина, , Ложь, "test", 2);
Текст [V1] находится в таблице, которая находится в автофигуре.
Почему-то текст не заменяется, хотя вне автофигуры все отрабатывает нормально.
Ответ:
Примерный код такой:
Код 1C v 8.х Договор = ПолучитьМакет("Договор");
// Получить объект из макета.
MSWord = Договор.Получить();
Попытка
Документ = MSWord.Application.Documents(1);
Документ.Activate();
//Определим имена
Заказчик = "Петр Иванович КакВасТам";
Исполнитель = "helpf.pro - Помощник по 1С"
// Получить объект, который будем использовать для поиска и замены.
Замена = Документ.Content .Find;
// Заменить заранее определенные ключевые конструкции на требуемый текст.
Замена.Execute("[Заказчик]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик);
Замена.Execute("[Исполнитель]", Ложь, Истина, Ложь, , , Истина, , Ложь, Исполнитель);
// Далее аналогично для остальных ключевых конструкций.
// ...
// Делаем видимым приложение и активизируем его.
MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке и объект закрывается.
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;
Более подробно:
Как сформировать новый договор, документ на основании файла, шаблона Microsoft Office Word? Категория:
Работа с Microsoft Office и OpenOffice Управляем 1С со стороны используя web-сервис Передача команд 1С на выполнение через ссылки в письме.
web-сервисы помогают интегрировать 1С с различными программами, делая её более гибкой. Статей в интеренете достаточно можно, но в основном там описывается выгрузка из 1С, обмен между двумя 1С или 1С и каким-то мощным программным продуктом написанным на C или других языках.
Для меня же была поставлена задача возможности управление 1С через браузер. Как пример: обрабатывать завершение задачи БП в 1С по ссылке в письме (примерно такого типа http://site.ru/?user=000000001&bp=000000555, т.е. отсюда видно, что пользователь 000000001 хочет закрыть задачу 000000555), т.е. пользователь со своего смартфона не имеющего доступа к 1С как таковому, должен получить возможность управлять ею извне. Собственно, более сложной задачей можно поставить написание собственных web-форм, более легких и компактных, с произвольным дизайном для управления 1С.
Задача с точки зрения написания кода 1С очень легкая. Основная сложность заключалась в освоении HTML и JavaScript для управления извне. Начальные знаний по этому вопросу я подчерпнул из статьи Примеры пользования web сервисов 1С из браузера.
Настройка 1С
Для возможности использовать 1С в вебе необходимо:
1. Установить модуль расширения веб-сервера;
2. Настроить Windows: доустановить компоненты IIS и настроить проверку подлинности. Всё это можно прочитать в статье
Настройка веб-клиента 1С:Предприятие 8.2 под Windows 7 x64 и IIS.
Программирование 1С
Теперь можно приступить к конфигурированию.
1. Создадим Web-сервис Input:
1.1. Input имеет операцию InputData которая принимает два параметра: User и Command, и возвращает параметр типа "boolean (http://www.w3.org/2001/XMLSchema)". Текст функции InputData:
Код 1C v 8.х Функция InputData(User, Command)
обДанные = Справочники.Данные.СоздатьЭлемент();
обДанные.Наименование = User + ":" + Command;
обДанные.Записать();
Возврат Истина;
КонецФункции
1.2. Устанавливаем для Input URI пространства имен = "http://infostart.ru". Здесь может быть любое уникальное имя, обычно это ссылка на сайт.
1.3. Устанавливаем для Input имя файла публикации = "input.1cws". Это имя web-сервиса к которому будем устанавливать соединение.
2. Для наглядности примера создадим справочник Данные, все параметры оставим по умолчанию.
3. Публикуем нашу конфигурацию и web-сервис: Администрирование -> Публикация на веб сервере...
На этом конфигурирование заканчивается, всё остальное сделает за нас 1С.
Разработка HTML страницы
Эта часть далась для меня тяжело, т.к. я ещё только делаю первые шаги в этой теме. Буду рад замачаниям и советам. А так, я постараюсь объяснить всё на пальцах тем, кто как и я знаком по большей части с 1С.
После установки ISS (я уже давал ссылку в начале статьи) на диске C появится каталог C:\inetpub\wwwroot, в этом каталоге располагается сайт. Для локальной машины (на которой установили ISS) он виден так http://localhost/, ну а для пользователей извне, как-то так http://infostart.ru (по правде там немного сложнее, но не суть, мы сейчас не про это). Заглавная страница сайта будет грузиться из файла index.htm каталога C:\inetpub\wwwroot
Исходники файлов можно скачать здесь:
Скачивать файлы может только зарегистрированный пользователь!
Код файла index.htm попытаюсь объяснить как могу, т.к. сам некоторые моменты не понимаю:
Код [html xmlns="http://www.w3.org/1999/xhtml"] // Неважно. Используется в XHTML для объявления пространства имен.
[head] // Предназначен для хранения других элементов, цель которых — помочь браузеру в работе с данными.
[meta http-equiv="Content -Type" content ="text/html; charset=utf-8" /] // Неважно. Мета-теги используются для указания описания.
[title]Тест веб сервиса 1С[/title] // Неважно. Определяет заголовок документа, то что видит пользователь как текст вкладки.
[script type="text/javascript" src="../js/connect1c.js"] [/script] // Важно. Подключение JavaScript библиотек. В моём случае это мой модуль соединения с 1С.
[script type="text/javascript" src="../js/parameters.js"] [/script] // Важно. А это модуль обработки параметров строки браузера.
[/head]
[body] // Предназначен для хранения содержания веб-страницы (контента), отображаемого в окне браузера.
[p id="response1C"][/p] // Важно. Метка response1C, куда вернёться ответ запроса 1С.
[/body]
[script type="text/javascript"] // Важно. Начало основного скрипта, который выдёргивает из строки браузера всё что идёт дальше знака вопроса,
а дальше парсит по определенному алгоритму. В нашем случае будут искаться ключевые слова "user=" и "command=".
user = GetParameter("user"); // Важно. Находим значение user. Сам метод GetParameter находится в библиотеке parameters.js, о которой поговорим чуть позже.
command = GetParameter("command"); // Важно. Находим значение command.
Inquiry1C(user, command); // Важно. Запрос к 1С с найденными параметрами. Сам метод Inquiry1C находится в библиотеке connect1c.js
[/script]
[/html]
Заменил < на [, а > - ], замените перед использованием обратно.
Рассмотрим библиотеку parameters.js, которая находится в папке C:\inetpub\wwwroot\js
f
Код unction GetParameter(pName) { // Сам метод я нашёл на просторах интернета.
search = window.location.search; // window.location - это по сути URL, метод search этого объекта возвращает часть адреса после символа "?", включая символ "?".
begin = search.indexOf(pName) + pName.length + 1; // Вычисляем позицию начала строки значения параметра для вырезания. +1 - в нашем случае это знак "=".
Итого, для search = "?user=007" мы найдём позицию начала равной 6 (нумерация с нуля).
end = search.indexOf('&', begin); // Находим позицию конца выражения. В нашем случае, разделение параметров осуществляется знаком "&", и если мы его не найдём,
то позицией конца будет последний символ строки search (смотри дальше код).
if (end == -1) {
end = search.length;
};
return unescape(search.substring(begin, end)); // Метод unescape возвращает строку, содержащую данные типа charString (не знаю зачем это надо,
но видимо такое приведение типа здесь необходимо). Ну а метод substring - извлекает подстроку из строки.
}
Теперь рассмотрим библиотеку connect1c.js, которая также находится в папке C:\inetpub\wwwroot\js
function Inquiry1C(pUser, pCommand) { // Основной метод этой библиотеки. Запрос к 1С.
XMLHTTP = CreateRequestObject(); // Создание XML HTTP запроса. Сам метод я узнал из википедии.
XMLHTTP.open('POST', '../TestWeb/ws/Input.1cws', true, "Admin", "1"); // Создаём соединение типа POST, где второй параметр - адрес; параметр true - значит асинхронное,
то есть браузер не будет ждать ответа сервера, а продолжит работу; далее пользователь и пароль с правами на операцию InputData (этот тот метод, который мы написали в 1С),
саму операцию можно выполнять в привилегированном режиме, чтобы не мучиться с правами для пользователя Admin.
XMLHTTP.onreadystatechange = function() {WhenAnswering1C(XMLHTTP)}; // Когда 1С отработает, автоматически сработает метод WhenAnswering (о нём чуть ниже по тексту этой библиотеки).
XMLHTTP.send(''
+ ' '
+ ' '
+ ''
+ pUser + ' '
+ ''
+ pCommand + ' '
+ ' '); // Отправка XML запроса, где описывается метод к исполнению в 1С, с переданными параметрами из нашей строки URL.
// Строку запроса можно раскурить минут за 5
}
function CreateRequestObject() { // Чудо метод из википедии "Пример использования". По сути, ничего сложного.
if (typeof XMLHttpRequest === 'undefined') {
XMLHttpRequest = function() {
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {}
throw new Error("This browser does not support XMLHttpRequest.");
};
}
return new XMLHttpRequest();
}
function WhenAnswering1C(pXMLHTTP) { // Метод, который срабатывает после обработки запроса 1С.
status = StausRequest(pXMLHTTP); // Вычисляется статус для отправки сообщения пользователю (о нём чуть ниже).
document.getElementById("response1C").appendChild(document.createTextNode(status)); // Вывод на экран в помеченную область response1C (о ней я писал в основном файле).
Метод getElementById возвращает ссылку на узел документа.
Метод appendChild добавляет нод в конце списка дочерных нодов элемента, т.е. встраивает в нашу область нужный нам текст.
}
function StausRequest(pXMLHTTP) // Определение статуса.
{
status = "";
if (pXMLHTTP.readyState == 4) { // Опять же, читая википедию можно понять, readyState - это текущее состояние объекта (0 — не инициализирован, 1 — открыт,
2 — отправка данных, 3 — получение данных и 4 — данные загружены).
if (pXMLHTTP.status != 200) { // status - HTTP-статус в виде числа (404 — «Not Found», 200 — «OK» и т. д.)
status = "Запрос завершился неудачно. Ответ сервера: " + pXMLHTTP.responseText; // responseText -текст ответа на запрос.
Если состояние не 3 или 4, возвращает пустую строку.
}
else {
if (RequestSuccessful(pXMLHTTP)) { // Проверка ответа от 1С (о нём чуть ниже).
status = "Запрос отработан.";
}
else {
status = "Запрос был отклонён.";
};
};
};
return status;
}
function RequestSuccessful(pXMLHTTP) { // Проверка ответа от 1С. Здесь мы получим возвращаемое от 1С значение (в нашем случае 1С может вернуть тип булево).
DOM = pXMLHTTP.responseXML.getElementsByTagName("return")[0]; // responseXML - Текст ответа на запрос в виде XML, который затем может быть обработан посредством DOM.
Если состояние не 4, возвращает null.
response = DOM.childNodes[0].data; // Достаём данные из ответа.
return response == "true"; // Если правда, то правда
По правде, я не смог преобразовать сроку в булево, поэтому пришлось оставить так.
}
Проверка
Открываем браузер и вводим строку "localhost/?user=007&command=hello world!":
После чего можно открыть 1С и убедиться что создался элемент справочника:
На этом пример ознакомления управления 1С извне можно считать законченным
Автор:
Soloist Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Идентификация Web сервисов 1C 1. Если на web сервере стоит Anonymous access
1.1 В базе нет пользователей – идеальный вариант для тестирования web-сервиса, чтобы не заморачиваться…
1.2 Если хочется, чтобы вэб сервис работал под определенным пользователем 1С. Добавляем в файл default.vrd строку идентификации типа:
ib='Srvr="SERVER";Ref="TEST";usr=Администратор;pwd=*****'
1.3 HTTP Basic идентификация: (http://en.wikipedia.org/wiki/Basic_access_authentication)
Если на превый запрос вы получаете окно идентификации, можете туда забить логин и пароль. У меня на Firefox c русскими пользователями это не работает. Делаем английского пользователя и все нормально коннектиться. Но все-таки интересно как это происходит – смотрим в Firefox Web-console:
Хорошо.что это стандартная идентификация. значит мы ее может использовать программно:
И добавляем в ajax запрос параметр Authorization. Преобразуем строку “sikudaws:123456″ при помощи Base64:
Код $.ajax({
url: sikudaULRWebService,
type: "POST",
content Type: "text/xml",
dataType: "text",
data: soapEnv,
content Type: "text/xml charset='utf-8'",
Authorization: "Basic c2lrdWRhd3M6MTIzNDU2"
}).success( function(dataResponce) {...
Преобразовывать строки в Base64 b и назад можно здесь: http://rumkin.com/tools/compression/base64.php
И получаем идентификацию сразу. УРА.
Это даже легче PОST идентификация тонкого клиента:
http://its.1c.ru/db/v83doc#
content :16:1(Требуется доступ по ITS)
2. Идентификация средствами операционной системы в 1С к сожалению решается предыдущим способом. Требует введения имени и пароля пользователя Windows и не дает какого либо преимущества. Ее рассматривать не будем.
Источник:
sukuda Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Парсер сайта на 1С В этой статье я постараюсь описать процесс парсинга сайтов средствами 1С с примером.
Это статья не является инструкцией к применению, а лишь демонстрирует возможности 1С.
Что мы имеем?
1. Сайт в интернете, на котором располагается список товаров. В моем случае – это интернет магазин салона «Связной»
2. Понимание основ сайтостроения… хотя бы знание HTML тегов
3. Умение кодить в 1С 8
Для начала парсинга стоит определиться с тем что мы хотим спарсить и какая у нас будет иерархия. В моем случае это категория сотовых телефонов. Верхний уровень иерархии будет производители. Почему именно так? Потомы что я так захотел. Вы же вправе использовать любую иерархию.
Далее нам будут интересны такие поля как: Наименование, Цена, Картинка и Описание... ну и пожалую захватим операционную систему, чтобы пример получился более наглядным.
1. Создаем внешнюю обработку. Те, кто не знают как это сделать - дальше могут не читать
2. Создаем форму обработки с командной панелью снизу и сверху (они могут быть полезными)
3. Размещаем на ней Панель и обзываем первую страницу "СамСайт"
4. Кладем на страницу "СамСайт" ПолеHTMLДокумента и обзываем его к примеру "Сайт"
5. Переименовываем кнопку "Выполнить", которая находится на нижней панели в "Загрузить сайт"
6. Описываем процедуру нажатия на эту кнопку так:
Код 1C v 8.х ЭлементыФормы.Сайт.Перейти("http://www.svyaznoy.ru/catalog/phone/224"); //Категория с мобильными телефонами
7. Проверяем работу нашей обработки. У меня появился сайт связного. А у Вас?
Дальше сложнее. Все еще хочешь парсить сайты? Тогда читай:
Сам парсинг сайта заключается в обходе всех элементов загруженной страницы, выдергивания необходимой информации и запихивания их в табличную часть. Для этого:
1. Создадим табличную часть "Производители" с реквизитами "Отметка" (Булево), "Наименование" (Строка 100) и "Ссылка" (Строка 300).
2. Добавляем еще одну страницу на панели и обзываем ее "Производители"
3. Размещаем на этой странице одноименную табличную часть
4. Добавляем на нижней панели кнопку "Заполнить производителей" с кодом:
Код 1C v 8.х Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл
Если Стр.tagName = "H1" и Стр.innerText = "Производители" Тогда
Для Каждого опСтр из Стр.nextSibling.children Цикл
новСтр = Производители.Добавить();
новСтр.Наименование = опСтр.innerText;
новСтр.Ссылка = опСтр.firstChild.href;
КонецЦикла;
Возврат;
КонецЕсли;
КонецЦикла;
Здесь напрашиваются небольшие пояснения:
tagName - имя HTML тега в HTML документе
nextSubling - следующий элемент HTML документа от текущего
children - список дочерних элементов
firstChild - первый дочерний элемент от текущего
5. Проверям. При проверке важно, находиться на странице "СамСайт", чтобы заполнять производителей
Производители заполнены. Теперь к самим телефонам
1. Создаем табличную часть "Товары" с реквизитами "Производитель" (Строка 100), "Наименование" (Строка 100), "Цена" (Число 10,2), "Картинка" (Строка 300), "Описание" (Строка Неограниченная), "ОС" (строка 100), "Ссылка" (Строка,300)
2. Добавляем еще одну страницу на панели и обзываем ее "Товары"
3. Размещаем на этой странице одноименную табличную часть
4. Добавляем на нижней панели кнопку "Заполнить товары" с кодом:
Код 1C v 8.х Для Каждого Стр из Производители Цикл
//Если отметку сняли - то не трогаем этого производителя
Если Не Стр.Отметка Тогда
Продолжить;
КонецЕсли;
Форма = ПолучитьФорму("ФормаТоваров");
Форма.ЭлементыФормы.Сайт.Перейти(Стр.Ссылка);
Форма.ТекущийПроизводитель = Стр;
Форма.ОткрытьМодально();
КонецЦикла;
5. Создаем форму обработки "ФормаТоваров"
6. Кладем на "ФормаТоваров" ПолеHTMLДокумента и называем его "Сайт"
7. На событие ДкументСформирован у ПоляHTMLДокумента пишем код:
Код 1C v 8.х Если ЭлементыФормы.Сайт.Документ.body.all.length>1 Тогда
ГрузимТовары();
КонецЕсли;
8. Создаем переменную в модуле формы
перем ТекущийПроизводитель Экспорт;
9. Создаем процедуру ГрузимТовары():
Код 1C v 8.х Процедура ГрузимТовары()
Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл
Если Стр.className = "ct_desc cleared" Тогда
новСтр = Товары.Добавить();
Для Каждого опСтр из Стр.children Цикл
Если опСтр.className = "pic_and_comp" Тогда
новСтр.Картинка = СтрЗаменить(Сред(опСтр.firstChild.style.backgroundImage,5),")","")
КонецЕсли;
Если опСтр.className = "name" Тогда
новСтр.Наименование = опСтр.innerText;
новСтр.Ссылка = опСтр.firstChild.href;
КонецЕсли;
Если опСтр.className = "price" Тогда
новСтр.Цена = Число(СтрЗаменить(СтрЗаменить(опСтр.innerText,"-","")," ",""));
КонецЕсли;
Если опСтр.className = "desc" Тогда
новСтр.Описание = опСтр.innerText;//опСтр.innerHTML - если нужно вместе с тегами
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Закрыть();
КонецПроцедуры
10. Проверям. Все работает.
Дело осталось за "операционной системой" и еще надо загрузить картинки. Давайте по порядку. Чтобы получить "ОС" нам надо открыть этот товар и считать "ОС" оттуда. Для этого делаем следующее:
1. Добавляем на нижней панели кнопку "Доп Инфо" с кодом:
Код 1C v 8.х Для Каждого Стр из Товары Цикл
Форма = ПолучитьФорму("ФормаДопИнфо");
Форма.ЭлементыФормы.Сайт.Перейти(Стр.Ссылка);
Форма.ТекущийТовар = Стр;
Форма.ОткрытьМодально();
КонецЦикла;
2. Создаем форму обработки "ФормаДопИнфо"
3. Кладем на "ФормаДопИнфо" ПолеHTMLДокумента и называем его "Сайт"
4. На событие ДкументСформирован у ПоляHTMLДокумента пишем код:
Код 1C v 8.х Если ЭлементыФормы.Сайт.Документ.body.all.length>1 Тогда
ГрузимДопИнфо();
КонецЕсли;
5. Создаем переменную в модуле формы
перем ТекущийТовар Экспорт;
6. Создаем процедуру ГрузимДопИнфо():
Код 1C v 8.х Процедура ГрузимДопИнфо();
Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл
Если Стр.className = "card_spec" Тогда
Для Каждого опСтр из Стр.children Цикл
Если Найти(опСтр.innerText,"Операционная система:") Тогда
ТекущийТовар.ОС = СокрЛП(СтрЗаменить(опСтр.innerText,"Операционная система:",""));
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Закрыть();
КонецПроцедуры
7. Проверяем и переходим к последнему пункту
Заметили как похожи две последние инструкции? То-то же. Стремился к универсальности. Ну и наконец последний этап - Сохраним все изображения к примеру на диск "С" в папку "связной". Поехали
1. Добавляем на нижней панели кнопку "Сохранить Картинки" с кодом:
Код 1C v 8.х Для Каждого Стр из Товары Цикл
путьСамФайл = Лев(Стр.Картинка,Найти(Стр.Картинка,".jpg/") + 3);
самФайл = СтрЗаменить(СтрЗаменить(ПутьСамФайл,"http://static.svyaznoy.ru/upload/iblock/",""),"/","");
Стр.Картинка = СохранитьКартинкуСайта("C:\Svyaznoy",ПутьСамФайл,СамФайл);
КонецЦикла;
2. Добавляем функцию СохранитьКартинкуСайта:
Код 1C v 8.х Функция СохранитьКартинкуСайта(КаталогСохранения,КартинкаНаСайте,КартинкаУНас)
ИмяФайлаКартинки = КаталогСохранения + "\" + КартинкаУНас;
ГетЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
ГетЗапрос.SetTimeouts(10000, 10000, 10000, 10000);
БазовыйУРЛ = КартинкаНаСайте;
Хидер1 = "Content -Type";
Хидер2 = "image/jpg"; // Тип рисунка.
ГетЗапрос.Open("GET", БазовыйУРЛ, False); // Синхронный режим.
ГетЗапрос.setRequestHeader(Хидер1, Хидер2);
ГетЗапрос.Send();
СтатусОтправки = ГетЗапрос.status;
Если СтатусОтправки <> 200 Тогда
Сообщить("Ошибка отправки запроса на: "
+ КартинкаНаСайте);
Возврат "";
КонецЕсли;
Стрим = Новый COMОбъект("ADODB.Stream");
Стрим.Mode = 3;
Стрим.Type = 1;
Стрим.Open();
Стрим.Write(ГетЗапрос.responseBody);
Стрим.SaveToFile(ИмяФайлаКартинки, 2);
Стрим.Close();
Возврат ИмяФайлаКартинки;
КонецФункции
На этом наша эпопея с парсингом закончена. Это всего лишь пример того, как это можно сделать. Приложив сюда немного своего кода - можно сделать парсер для любого сайта.
Скачивать файлы может только зарегистрированный пользователь!
Имея парсер 1С - я могу спарсить все, кроме этого парсера. Имя два парсера 1С - я могу спарсить все
Автор:
opx Категория:
Работа с Интернет, Почтой (Mail), FTP