Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- &НаКлиенте
- Процедура НаименованиеПриИзменении(Элемент)
- КомандаНайти(Неопределено);
- КонецПроцедуры
- &НаКлиенте
- Процедура КомандаНайти(Команда)
- ХтмлДокумент = "https://www.google.ru/search?q="+ТекстUnicodeToUTF8(Наименование)+"&tbm=isch";
- ЭтаФорма.ТекущийЭлемент = Элементы.ХтмлДокумент;
- КонецПроцедуры
- &НаКлиенте
- Процедура ХтмлДокументДокументСформирован(Элемент)
- Если Элементы.ХтмлДокумент.Документ.readyState = "complete" Тогда
- ОчиститьЭлемент("mngb");
- ОчиститьЭлемент("xjsc");
- ОчиститьЭлемент("searchform");
- ОчиститьЭлемент("rshdr");
- ОчиститьЭлемент("mngb");
- ОчиститьЭлемент("fbar");
- КонецЕсли;
- КонецПроцедуры
- &НаКлиенте
- Процедура ХтмлДокументПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
- Попытка
- струкУрл = РазложитьАдрес(ДанныеСобытия.Href);
- Если струкУрл <> Неопределено Тогда
- АдресКаринки = "";
- Если струкУрл.Свойство("imgurl", АдресКаринки) Тогда
- // двойное декодирование - особенность ссылок гугла
- АдресКаринки = ДекодироватьURL(ДекодироватьURL(АдресКаринки));
- СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(АдресКаринки);
- // при неудаче получим из кэша гугла
- Если ТипЗнч(СодержимоеАдреса) <> Тип("ДвоичныеДанные") Тогда
- СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(ДанныеСобытия.Element.src);
- КонецЕсли;
- Если ТипЗнч(СодержимоеАдреса) = Тип("ДвоичныеДанные") Тогда
- к = новый Картинка(СодержимоеАдреса);
- Закрыть(к);
- Иначе
- Сообщить("Не удалось получить изображение");
- КонецЕсли;
- Иначе
- Предупреждение("Это не ссылка!");
- КонецЕсли;
- КонецЕсли;
- Исключение
- Предупреждение("Не удалось получить изображение: "+ОписаниеОшибки());
- КонецПопытки;
- КонецПроцедуры
- &НаСервере
- Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
- Если ЭтаФорма.Параметры.Свойство("Наименование") Тогда
- ЭтаФорма.Наименование = УдалитьЗапрещенныеСимволыИмениФайла(ЭтаФорма.Параметры.Наименование);
- КонецЕсли;
- КонецПроцедуры
- &НаКлиенте
- Процедура ПриОткрытии(Отказ)
- Если ЗначениеЗаполнено(Наименование) Тогда
- КомандаНайти(Неопределено);
- КонецЕсли;
- КонецПроцедуры
- ///////////////////////////////////////////
- // Процедуры и функции общего назначения //
- ///////////////////////////////////////////
- &НаКлиентеНаСервереБезКонтекста
- Функция РазложитьАдрес(Знач Адрес_) Экспорт
- Если Найти(Адрес_, "http://") = 1 Тогда
- Адрес = СтрЗаменить(Адрес_, "http://", "");
- ИначеЕсли Найти(Адрес_, "https://") = 1 Тогда
- Адрес = СтрЗаменить(Адрес_, "https://", "");
- Иначе
- Возврат Неопределено;
- КонецЕсли;
- Результат = Новый Структура();
- СтрокиАдреса = СтрЗаменить(Адрес, "/", Символы.ПС);
- Результат.Вставить("АдресСервера", СтрПолучитьСтроку(СтрокиАдреса, 1));
- АдресСтраницы = "";
- Для Сч = 2 По СтрЧислоСтрок(СтрокиАдреса) Цикл
- АдресСтраницы = АдресСтраницы + СтрПолучитьСтроку(СтрокиАдреса, Сч) + "/";
- КонецЦикла;
- Результат.Вставить("АдресСтраницы", Лев(АдресСтраницы, СтрДлина(АдресСтраницы)-1));
- ПозПарамов = Найти(Адрес_, "?");
- Если ПозПарамов>0 Тогда
- Парамы = Сред(Адрес_, ПозПарамов+1);
- Парамы = СтрЗаменить(Парамы, "&", Символы.ПС);
- Для Сч = 1 По СтрЧислоСтрок(Парамы) Цикл
- ТекСтрПарам = СтрПолучитьСтроку(Парамы, Сч);
- ПозРавно = Найти(ТекСтрПарам, "=");
- ПарамИмя = Лев(ТекСтрПарам, ПозРавно-1);
- ПарамЗначение = Сред(ТекСтрПарам, ПозРавно+1);
- Результат.Вставить(ПарамИмя, ПарамЗначение);
- КонецЦикла;
- КонецЕсли;
- Возврат Результат;
- КонецФункции
- &НаКлиентеНаСервереБезКонтекста
- Функция УдалитьЗапрещенныеСимволыИмениФайла(Знач ИмяФайла, СимволЗамены=" ") Экспорт
- ИмяФайла = Лев(ИмяФайла, 50);
- Буквы = "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
- Цифры = "0123456789";
- ДополнительныеСимволы = ".,-_ ()";
- ВсеСимволы = Буквы+Цифры+ДополнительныеСимволы;
- Рез="";
- Для й=1 По СтрДлина(ИмяФайла) Цикл
- Символ = Сред(ИмяФайла, й, 1);
- Если Найти(ВсеСимволы, НРег(Символ))=0 Тогда
- Рез=Рез+СимволЗамены;
- Иначе
- Рез=Рез+Символ;
- КонецЕсли;
- КонецЦикла;
- Возврат Рез;
- КонецФункции
- // http://infostart.ru/public/101004/
- &НаКлиенте
- Функция ДекодироватьURL(URL, WindowsFileURI=Истина)
- ДлинаСтроки = СтрДлина(URL);
- Инд = 1;
- Результат = "";
- ПолныйКод = 0;
- ОсталосьСимволов = 0;
- Пока Инд <= ДлинаСтроки Цикл
- Код = КодСимвола(URL, Инд);
- Если Код = 37 Тогда
- // Символ(37) = "%"
- Код = Из16ВЧисло(Сред(URL, Инд+1, 2));
- Инд = Инд + 2;
- ИначеЕсли ОсталосьСимволов = 0 Тогда
- Если (Код = 43) и (не WindowsFileURI) Тогда
- // Символ(43) = "+"
- Код = 32; // Символ(32) = " " (пробел)
- КонецЕсли;
- Результат = Результат + Символ(Код);
- Инд = Инд + 1;
- Продолжить;
- КонецЕсли;
- Если Код <= 127 Тогда
- // Код = 0b0ххххххх
- Результат = Результат + Символ(Код);
- ИначеЕсли Код <= 191 Тогда
- // Код = 0b10хххххх
- ПолныйКод = (ПолныйКод*64) + (Код%64); // shl(ПолныйКод, 6) + (Код & 0x3F)
- ОсталосьСимволов = ОсталосьСимволов - 1;
- Если ОсталосьСимволов = 0 Тогда
- Результат = Результат + Символ(ПолныйКод);
- КонецЕсли;
- ИначеЕсли Код <= 223 Тогда
- // Код = 0b110ххххх
- ПолныйКод = Код % 32; // Код & 0x1F
- ОсталосьСимволов = 1;
- ИначеЕсли Код <= 239 Тогда
- // Код = 0b1110хххх
- ПолныйКод = Код % 16; // Код & 0x0F
- ОсталосьСимволов = 2;
- ИначеЕсли Код <= 247 Тогда
- // Код = 0b11110ххх
- ПолныйКод = Код % 8; // Код & 0x07
- ОсталосьСимволов = 3;
- ИначеЕсли Код <= 251 Тогда
- // Код = 0b111110хх
- ПолныйКод = Код % 4; // Код & 0x03
- ОсталосьСимволов = 4;
- ИначеЕсли Код <= 253 Тогда
- // Код = 0b1111110х
- ПолныйКод = Код % 2; // Код & 0x01
- ОсталосьСимволов = 5;
- КонецЕсли;
- Инд = Инд + 1;
- КонецЦикла;
- Возврат Результат;
- КонецФункции
- &НаКлиенте
- Функция Из16ВЧисло(Знач Значение)
- Результат = 0;
- Множитель = 1;
- Пока Значение <> "" Цикл
- Результат = Результат + Множитель * (Найти("0123456789ABCDEF", Прав(Значение,1))-1);
- Множитель = Множитель * 16;
- Значение = Лев(Значение,СтрДлина(Значение)-1);
- КонецЦикла;
- Возврат Результат;
- КонецФункции
- // Возвращает содержимое ответа HTTP-сервера, полученного методом GET, в виде строки или двоичных данных
- // ** Coded by Sergey (aka Porutchik) * 2014 http://forum.aeroion.ru/cat1.html
- &НаКлиенте
- Функция ПолучитьСодержимоеВебАдреса(Знач СерверПриемник, Знач АдресСтраницы = "",
- Знач ПараметрыСоединения = Неопределено, Заголовки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.html
- //Если сервер вернул один из статусов переадресации
- //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.КодСостояния <= 200 Тогда
- //Статус ответа в интервале между 100 и 200 Ok говорит о нормальном результате HTTP-запроса
- Если Ответ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.ПолучитьТелоКакДвоичныеДанные();
- КонецФункции // ПолучитьСодержимоеВебАдреса()
- &НаКлиенте
- Функция ЧислоDecToHex(Знач Число)
- ЧислаHex = "0123456789ABCDEF";
- Результат = "";
- Для Цифр = 1 По 2 Цикл
- ТекЦифра = Число % 16;
- Число = Цел(Число / 16);
- Результат = Сред(ЧислаHex, ТекЦифра + 1, 1) + Результат;
- КонецЦикла;
- Возврат Результат;
- КонецФункции
- &НаКлиенте
- Функция ТекстUnicodeToUTF8(Текст)
- СимволыUTF8 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~_-.";
- Результат = "";
- Для НомерСимвола = 1 По СтрДлина(Текст) Цикл
- ТекСимвол = Сред(Текст, НомерСимвола, 1);
- Если ТекСимвол = " " Тогда
- Результат = Результат + "%20";
- ИначеЕсли Найти(СимволыUTF8, ТекСимвол) > 0 Тогда
- Результат = Результат + ТекСимвол;
- Иначе
- КодСимвола = КодСимвола(ТекСимвол);
- Если КодСимвола < 128 Тогда
- Результат = Результат + "%" + ЧислоDecToHex(КодСимвола);
- Иначе
- Делитель = 32;
- ГруппаБайт = 8;
- HEX = "";
- Пока Делитель > 4 Цикл
- Остаток = КодСимвола % 64;
- HEX = "%" + ЧислоDecToHex(128 + Остаток) + HEX;
- Множитель = Цел(КодСимвола / 64);
- Если Множитель < Делитель Тогда
- HEX = "%" + ЧислоDecToHex((ГруппаБайт-2) * Делитель + Множитель) + HEX;
- Прервать;
- КонецЕсли;
- Делитель = Делитель / 2;
- ГруппаБайт = ГруппаБайт * 2;
- КонецЦикла;
- Результат = Результат + HEX;
- КонецЕсли;
- КонецЕсли;
- КонецЦикла;
- Возврат Результат;
- КонецФункции
- &НаКлиенте
- Процедура ОчиститьЭлемент(ид)
- элем = Элементы.ХтмлДокумент.Документ.getElementById(ид);
- Если элем <> Неопределено Тогда
- элем.innerHTML = "";
- КонецЕсли;
- КонецПроцедуры
Add Comment
Please, Sign In to add comment