Скачал, развернул конфу, открыл, ввел логин и пароль. Загрузка версий - кнопочка просто не работает. Загрузка - программ - долго думает и заканчивает свое действие без результата((
Что-то с вашим логином и паролем не так. В браузере со страницы login.1c.ru куда он приводит? Отладчиком на какой строке зависает? Дайте больше информации!
Можете подсказать как правильно указать параметры post? чтобы они в глобальный массив post пришли на сайте
так:
HTTPЗапрос1.Заголовки.Вставить("name=" + name + "&col=" + kol);
13.
Aleksey.Bochkov
344005.02.14 23:36 Сейчас в теме
По поводу списка файлов обновлений - конфигуратор умеет искать нужные обновления на серверах 1С, т.е. общий список есть.
Вот он (конфигуратор к нему обращается) - http://downloads.v8.1c.ru/tmplts/v8cscdsc.lst Раньше точно работало, сейчас пишет что файла нет. Или я не те логин-пароль использую, или ошибка у 1С из-за перестройки ресурсов.
Отлично. Действительно после обновления загрузка стала работать.
За это вам жирный "+"
По мне так: Что бы развивать программу можно сделать так:
Вместо одного логина/пасса от личного кабинет users.v8.1c.ru - сделать несколько учетных данных.
Т.е. я подписан, например на бюджет, хозрасчет, УТ под разными личными кабинетами.
Ваша программа последовательно открывает все учетки, скачивает заголовки, затем в таблице значений сворачивает по точным наименованиям. Ну как то так.
Таким образом мы получим более точный список ВСЕХ (тех, на которые есть подписка в одном/нескольких личных кабинетах) конфигураций
НУ и наверное последнее: Осталось включить возможность скачивать конфигурации, или на крайний случай получать "КОНЕЧНУЮ ПРЯМУЮ ССЫЛКУ НА ОБНОВЛЕНИЕ", а не рыскать каждый раз по сайту.
т.е. отметили галочками, какие конфигурации необходимо скачать и пошли чай пить. В программе предварительно в настройках в справочнике задаем конечные пути скачки.
По нажатию "скачать" скачиваем обновления, которые уже рассованы по нужным папкам, и спокойно едем обновляться.
Алексей, не вижу никаких извращений, вполне дельные требования к разработке. Надо только правильно спозиционироваться на целевой аудитории - кому такая разработка будет интересна - и вперед!
Что касается меня - я писал статью из просветительских побуждений. Если найдется смельчак доработать мою конфу - с удовольствием передам ему неисключительные права на нее (достаточно просто сослаться на меня) :)
(17) проанализировал вашу конфу и запрос HTML. 1С-ники очень хитро генерируют ссылку на скачивание. Предполагаю java скриптом... С разных сторон подходил, но так конечную ссылку не получилось выудить...
А может знает кто как реализовать автоматический редирект. Например при Oauth авторизации осуществляется редирект, а HTTPОтвет возвращает код 302. Было бы неплохо реализовать редирект автоматически. Как это сделать вручную я не сообразил.
В моем примере как раз редирект отрабатывается. На скриншоте посмотрите, код ответа 302, сервер возвращает в шапке ответа поле Location, в котором указан адрес редиректа
(26) за информер - да, а за загрузчик?
кстати, можно сделать иерархический список (как на картинке)
1. Справочник "Программы" делаем иерархическим (нужен один уровень иерархии).
2. Немного корректируем процедуру в форме обработки "ЗагрузкаПрограммИВерсий":
Процедура РекурсивныйПарсингСпискаКонфигураций(ДокументHTML)
ТекИмяГруппы = "";
ТекГруппа = Справочники.Программы.ПустаяСсылка();
Для Каждого ЭлДок Из ДокументHTML.ДочерниеУзлы Цикл
Если СокрЛП(ЭлДок.ТекстовоеСодержимое) = "Название" Тогда
//количество строк в таблице дистрибутивов
СписокУзловHTML = ЭлДок.РодительскийУзел.РодительскийУзел.РодительскийУзел.ДочерниеУзлы[1].ДочерниеУзлы;
КолЭлементов = СписокУзловHTML.Количество();
Для А=0 По КолЭлементов-1 Цикл
Если СписокУзловHTML[А].ДочерниеУзлы.Количество()=1 Тогда
ТекИмяГруппы = СокрЛП(СписокУзловHTML[А].ДочерниеУзлы[0].ДочерниеУзлы[0].ТекстовоеСодержимое);
КонецЕсли;
ТекЯчейка = СписокУзловHTML[А].ДочерниеУзлы[0].ДочерниеУзлы[0];
Если ТипЗнч(ТекЯчейка) = Тип("ЭлементЯкорьHTML") Тогда
Если ТекИмяГруппы<>"" Тогда
Если СокрЛП(ТекГруппа.Наименование)<>ТекИмяГруппы Тогда
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Название", ТекИмяГруппы);
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Программы.Ссылка
|ИЗ
| Справочник.Программы КАК Программы
|ГДЕ
| Программы.НазваниеПолное ПОДОБНО &Название
| И Программы.ЭтоГруппа";
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Если Выборка.Следующий() Тогда
ТекГруппа = Выборка.Ссылка;
Иначе
НовГруппа = Справочники.Программы.СоздатьГруппу();
НовГруппа.Наименование = ТекИмяГруппы;
НовГруппа.Записать();
ТекГруппа = НовГруппа.Ссылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Название = СокрЛП(ТекЯчейка.ТекстовоеСодержимое);
ГиперСсылка = ТекЯчейка.ГиперСсылка;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Название", Название);
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Программы.Ссылка,
| Программы.Родитель
|ИЗ
| Справочник.Программы КАК Программы
|ГДЕ
| Программы.НазваниеПолное ПОДОБНО &Название
| И НЕ Программы.ЭтоГруппа";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
НовыйСправочник = Справочники.Программы.СоздатьЭлемент();
НовыйСправочник.Наименование = Название;
НовыйСправочник.НазваниеПолное = Название;
НовыйСправочник.ГиперСсылка = ГиперСсылка;
НовыйСправочник.Родитель = ТекГруппа;
НовыйСправочник.Записать();
Загружено = Загружено + 1;
Иначе
Выборка.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Родитель<>ТекГруппа Тогда
НовыйСправочник = Выборка.Ссылка.ПолучитьОбъект();
НовыйСправочник.Родитель = ТекГруппа;
НовыйСправочник.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат;
КонецЕсли;
Если ЭлДок.ЕстьДочерниеУзлы() Тогда
РекурсивныйПарсингСпискаКонфигураций(ЭлДок);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
3. В самой форме перенастроить список - режим вывода: дерево, разворачивать все уровни.
(0) Да, и ещё вопрос автору: Чем пользовались для составления процедур парсинга?
Т.е. вижу по коду, что с помощью ЧтениеHTML и ПостроительDOM создавали объектную модель HTML-документа и дальше с ней работали...
Вопрос в том - с помощью какого вьювера просматривали DOM?
Огромное спасибо за вашу работу. Взял за основу вашу разработку, переделал конечно структуру, версии перенес в РС, переделал справочник Программ, сделал функцию обновления, подцепил к регламенту - в итоге свои идеи воплотил в вашу разработку :)
Можно еще больше оптимизировать, в место рекурсии обработать ДокументHTML одним циклом c получением всех данных
В цикле заполняется: Название, гиперссылка, номер версии, дата выхода, планируемый номер версии, планируемая дата выхода, планируемая дата обновления данных, ознакомительный номер версии, дата выхода ознакомительной версии
В место процедуры РекурсивныйПарсингСпискаКонфигураций(ДокументHTML)
Процедура ЗаполнитьДанные(ДокументHTML, ТаблицаДанных)
ТекГруппа = "";
ЭлементыDOM = ДокументHTML.ПолучитьЭлементыПоИмени("td");
Для Каждого Элемент Из ЭлементыDOM Цикл
Если Элемент.ИмяКласса = "groupColumn" Тогда
ИндексКолонки = 1;
ТекГруппа = СокрЛП(Элемент.ТекстовоеСодержимое);
Продолжить;
КонецЕсли;
Если Элемент.ИмяКласса = "nameColumn" Тогда
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Группа = ТекГруппа;
НоваяСтрока.Название = СокрЛП(Элемент.ТекстовоеСодержимое);
Если ТипЗнч(Элемент.ДочерниеУзлы[0]) = Тип("ЭлементЯкорьHTML") Тогда
НоваяСтрока.Гиперcсылка = СокрЛП(Элемент.ДочерниеУзлы[0].Гиперссылка);
КонецЕсли;
ИндексКолонки = 3;
Продолжить;
КонецЕсли;
ИндексКолонки = ИндексКолонки + 1;
НоваяСтрока[ТаблицаДанных.Колонки[ИндексКолонки].Имя] = СокрЛП(Элемент.ТекстовоеСодержимое);
КонецЦикла;
КонецПроцедуры
Добрый день.
Внедрили вашу систему в рабочую базу, все отлично. Потом решили перевести в регламентное задание и тут начались сложности: база в клиент серверном варианте. Регламентное задание запускается. Система получает JSESSIONID, но при получении страницы со списком конфигурации система ничего уже не возвращает. Подскажите куда смотреть
Не работает.
Не грузит список программ.
До какого то момента работало, потом перестало. Выдавало ошибку, после скачал исправленную.
Ошибка исчезла, но программы не грузит
(36) Спасибо за замечание!
Выпущена версия 2. 1С слегка изменила алгоритм авторизации, пришлось слегка переписать код, попутно удалось уменьшить количество запросов с 8 до 4.
(0) +
Статья супер, хороший толчок для новичка, чтобы освоить новую для себя технологию 1С. Вы когда писали конфу, то пользовались только платформой 1С и инструментами разработчика браузера, чтобы распутать эту хитрую регистрацию на сайте 1С?
(38) Спасибо за оценку! Я пользовался советами своего брата, работающего в Яндексе, поэтому использовал инструменты Яндекс-браузера. А вообще, как мне подсказали здесь, есть инструменты не хуже, например, Firebug для Firefox.
Спасибо за статью. У меня возник вопрос, а как выполнить метод PATCH в объекте Httpсоединение, есть методы PUT,POST,DELETE,GET, а метод PATCH я не обнаружил и не смог воспроизвести его, хоть 1с пишет что к REST можно обращаться с помощью метода PATCH.
(43) ОН используется для замены только указанных свойств, при этом остальные свойства остаются не тронутыми, его можно заменить методом PUT , но он очищает все незаполненные поля.
Плюс еще в объекте HTTPсервисы, появилась куча методов,которыми из 1с никак не обратиться.
Как определить какие строки для запроса на сервер включать в заголовки, а какие нет, а также как определить возможно какие-то еще параметры нужно задать?
Спасибо за статью. Обработка работает. Но не это главное, мне очень пригодился сам метод работы с сайтами, требующими аутентификации. Я оказывается всё делал не совсем правильно. Сэкономили мне массу времени. Ещё раз спасибо.
(51) markovki, по вашим словам, можно понять, что вы ни чего не меняли в процедуре, где идет парсинг страницы релиза, а она обновилась, там то же нужно менять, поэтому и ни чего не происходит, у меня пока только есть регламентное задание, могу показать как идет парсинг страницы, но он для обработки не подойдет.
(52) xsazar, вы правы, не менял.
Просто пытаюсь более детально разобраться как происходит переход на releases.1c.ru после авторизации.
Мне казалось, что для этого необходимы только логин/пароль и кукисы c login.1c.ru.
Зачем например, парсить страницу и собственно сама переменная inviteCode...
Здорово!
Прошу разрешение на использование Вашего кода для авторизации в моей разработке для скачивания файлов обновлений "updsetup.exe". Ссылки в коде и публикации гарантирую.
(56) Не возражаю. Но если 1С так часто будет менять сайт и авторизацию, то это нифига не enterprise solution! Замучаетесь выпускать заплатки... Я уже замучался...
Подскажите, пожалуйста. У нас здесь есть домены releases.1c.ru и login.1c.ru. Мы авторизуемся на login.1c.ru, шлем туда имя пользователя и пароль, а затем получаем страницу с releases.1c.ru. Куки разные. Как нас идентифицируют как одного и того же пользователя и дают доступ к releases.1c.ru?
(60)
Смотрим функцию НайтиJSESSIONID()
В первом запросе к releases.1c.ru нам присваивается JSESSIONID
Во втором запросе к login.1c.ru нам присваиваются параметры inviteCode
В третьем запросе мы отправляем inviteCode с логином-паролем и получаем ticket
В четвертом запросе мы связываем JSESSIONID и ticket
Внимание! Выпущена версия 5. Оптимизирован код. Заменены методы рекурсивных парсингов на конструкции ПолучитьЭлементПоИдентификатору и ПолучитьЭлементыПоИмени. Старые функции остались закоментированными.
Спасибо коллеге Avrobus за идею! :)
Соединение = Новый HTTPСоединение("toysland.crimea.ua");
Заголовки = Новый Соответствие;
Заголовки.Вставить("host", "toysland.crimea.ua");
Заголовки.Вставить("Connection", "keep-alive");
Заголовки.Вставить("Accept","text/html");
Заголовки.Вставить("Accept-Language", "ru");
Заголовки.Вставить("Content-Length",СтрДлина(СтрЗаменить(СтрЗаменить(action=secure-login&login="$ЛОГИН$"&passwd="$ПАРОЛЬ$","$ЛОГИН$",Объект.Пользователь),"$ПАРОЛЬ$",Объект.Пароль)));
Запрос = Новый HTTPЗапрос(ТекАдрес, Заголовки);
Запрос.УстановитьТелоИзСтроки(СтрЗаменить(СтрЗаменить(Объект.ШаблонПОСТ,"$ЛОГИН$",Объект.Пользователь),"$ПАРОЛЬ$",Объект.Пароль));
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Показать
Строку action=secure-login&login="$ЛОГИН$"&passwd="$ПАРОЛЬ$" подсмотрел снифером во время отправки данных на сервер браузером.
В
Ответ.ПолучитьТелоКакСтроку();
попадает заблокированная страница. Т.е. авторизацию не проходит...
Подскажите, пожалуйста , как все таки получать текст страницы полученной в сжатом виде gzip. Устанавливаю Заголовок "Accept-Encoding : gzip" По итогу HTTPОтвет.ПолучитьТелоКакСтроку() Возвращает сжатые данные
Здравствуйте, подскажите пожалуйста, не получается авторизоваться на сайте интернет банка. Там то тоже используется HTTPS, но если при авторизации на users.v8.1c.ru в теле POST запроса отправляются незашифрованные логин/пароль, то в интернет банк отправляется шифрованный пароль, причем всегда разный. Как сформировать POST запрос на авторизацию?
Разобрался со своей проблемой, там действительно при каждой авторизации происходит шифрование пароля. Я разобрал алгоритм шифрования и на авторизацию отправляю шифрованный пароль. HTTPS соединение и сертификаты здесь не причем. Кодирование идет встроенными процедурами сайта.
74.
info@itshkola.com
21.03.16 21:39 Сейчас в теме
Валерий, здравствуйте!
Можно Вас попросить эту обработку скинуть на business.kavun@gmail.com
Уж очень нужна, а нет возможности скачать.
Спасибо большое за статью - очень грамотно написана
Как разработка - возможно, неплохо. Как статья - хуже некуда. Собственно, статьи нет, есть пара цитат из СП и нихрена не понятно, как этим пользоваться. Разочарован.
(85) чтобы отвязаться от индексов можно сделать перебор элементов:
loginForm = ДокументHTML.ПолучитьЭлементПоИдентификатору("loginForm");
Элементы = loginForm .Элементы;
Для Каждого Элемент Из Элементы Цикл
Если Элемент.Имя = "inviteCode" Тогда
inviteCode = Элемент.Значение;
ИначеЕсли Элемент.Имя = "execution" Тогда
execution = Элемент.Значение;
ИначеЕсли Элемент.Имя = "_eventId" Тогда
eventId = Элемент.Значение;
КонецЕсли;
КонецЦикла;
loginForm = ДокументHTML.ПолучитьЭлементПоИдентификатору("loginForm");
execution = "";
Для Каждого Итератор Из loginForm.Элементы Цикл
Если Итератор.Имя = "execution" Тогда
execution = Итератор.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
Статья отличная!
Особенно порадовало то, что пример загрузки в базе был рабочий. ИТС легко открылся.
Очень долго не мог понять как работает вся эта пост- и гет- шняга в 1С83.
Посмотрел пример ИТС и нарисовал подобное для своей задачи.
Теперь спокойно захожу и скачиваю всё что необходимо на нужный мне сайт (https).
Гораздо быстрее и надежнее, чем собирался сделать при помощи InternetExplorer.Application.
По тому пути я дошел почти до конца, упёрся в сохранение файла, понял что окошко в IE11, предлагающее "Вы
хотите сохранить..." красивыми методами непобедимо, плюнул и пошёл разбираться с интернет запросами.
Попалась эта статья, один вечер и готово.
Единственное, маловато написано про то, как в яндекс.браузере правильно читать заголовки: откуда что брать
и куда что ложить в новом запросе. Думаю для тех кто впервые сталкивается с задачей подобного рода это лишним не было бы.
Доброго дня!
Никто не сталкивался с проблемой, что в в последние несколько дней информация по обновлениям версий конфигураций 1С не загружается?
Логин и пароль на портал releases.1c.ru внесены верно (на самом портале обновления есть), а вот в функции ЗагрузитьВерсииНаСервере
переменная versionsTable = ДокументHTML.ПолучитьЭлементПоИдентификатору("versionsTable") сейчас всегда принимает значение Неопределено.
Да, Поменяли Set-Cookie на set-cookie, и Location на location.
А поскольку HTTPОтвет.Заголовки имеет тип Соответствие, а не Структура, регистр имеет значение при обращении к заголовкам.
Я не знаю, надо ли выкладывать исправленную версию под статьёй?