Для полного понимания происходящего смотрите исходный код вэб-страницы. Подобным примитивным образом можно получить любую информацию,
опираясь на значения id и class html блоков.
Из этого фрагмента страницы будем получать значения:
Код 1C v 8.х
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Сохраняем нужную страницу для дальнейшей работы
Сервер = "kkb.kz";
Адрес = "/";
ИмяВходящегоФайла = КаталогВременныхФайлов() + "rate.html";
НТТР = Новый HTTPСоединение(Сервер);
НТТР.Получить(Адрес, ИмяВходящегоФайла);
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
//Получаем текст страницы
Текст = Новый ТекстовыйДокумент;
Текст.Прочитать(ИмяВходящегоФайла);
Содержимое = Текст.ПолучитьТекст();
//Получаем дату курса
НачалоБлокаСДатой = "<div class=" + """" + "w100fl" + """" + " id=" + """" + "kurs" + """" + ">";
КонецБлокаСДатой = "<div class=" + """" + "tbl_menu" + """" + " id=" + """" + "tbl_menu" + """" +">";
БлокСДатой = Сред(Содержимое, Найти(Содержимое, НачалоБлокаСДатой) + СтрДлина(НачалоБлокаСДатой), Найти(Содержимое, КонецБлокаСДатой) - Найти(Содержимое, НачалоБлокаСДатой) - СтрДлина(НачалоБлокаСДатой));
НачалоБлокаСДатой = "<nobr>";
КонецБлокаСДатой = "</nobr>";
Дата = Дата(Сред(БлокСДатой, Найти(БлокСДатой, НачалоБлокаСДатой) + СтрДлина(НачалоБлокаСДатой), Найти(БлокСДатой, КонецБлокаСДатой) - Найти(БлокСДатой, НачалоБлокаСДатой) - СтрДлина(НачалоБлокаСДатой)) + ":00");
//Выделяем блок, где содержится информация о курсах
НачалоТекста = Найти(Содержимое, "<" + "div id=" + """" + "div_sub1" + """" + ">");
КонецТекста = Найти(Содержимое, "<" + "div id=" + """" + "div_sub2" + """");
БлокКурса = Сред(Содержимое, НачалоТекста, КонецТекста - НачалоТекста);
//Получаем курс (в нашем случае функции можем передать ещё значения "EUR" и "RUB")
Курс = ПолучитьКурсВалюты("USD", БлокКурса);
Покупка = Курс[0];
Продажа = Курс[1];
КонецПроцедуры
Функция ПолучитьКурсВалюты(Валюта, БлокКурса)
БлокКурса = СтрЗаменить(БлокКурса, Символы.ПС, "");
БлокКурса = СтрЗаменить(БлокКурса, " ", "");
СтрокаНачала = "<td><strong>" + Валюта + "</strong></td>";
НачалоБлокаВалюты = Найти(БлокКурса, СтрокаНачала);
ОстатокБлока = Сред(БлокКурса, НачалоБлокаВалюты + СтрДлина(СтрокаНачала), СтрДлина(БлокКурса) - НачалоБлокаВалюты);
КонецБлокаПокупки = Найти(ОстатокБлока, "</td>") - 1;
ЦенаПокупки = Число(СтрЗаменить(Сред(ОстатокБлока, 1, КонецБлокаПокупки), "<td>", ""));
ОстатокБлока = Сред(ОстатокБлока, КонецБлокаПокупки + 6, СтрДлина(ОстатокБлока) - КонецБлокаПокупки + 6);
КонецБлокаПродажи = Найти(ОстатокБлока, "</td>") - 1;
ЦенаПродажи = Число(СтрЗаменить(Сред(ОстатокБлока, 1, КонецБлокаПродажи), "<td>", ""));
Массив = Новый Массив;
Массив.Добавить(ЦенаПокупки);
Массив.Добавить(ЦенаПродажи);
Возврат Массив;
КонецФункции
Есть ли в 8.х аналог ИспользоватьСписокЭлементов?
В динамических списках документов, справочников и т.д. может быть программно установлен отбор по полю Ссылка с указанием в качестве вида сравнения вхождения в список значений. Это позволяет отображать в списке только определенные объекты.
Однако эта возможность может иметь только ограниченное применение, так как динамический список имеет достаточно большое количество универсальных возможностей (установка отбора пользователем, переходы по уровням в иерархических списках и т.д.) и совмещение в прикладных решениях этих механизмов с отбором по конкретным значениям ссылок достаточно сложно реализуется.
В большинстве случаев, если необходимо обеспечить отображение в списке специально отобранного перечня объектов, можно рекомендовать использовать другие возможности (например, выборку данных запросом и отображение в форме с помощью таблицы значений или табличного документа). При этом система обеспечивает возможность полноценного взаимодействия с такими формами других системных механизмов.
Код 1C v 8.х Запрос = Новый Запрос();
Запрос.Текст = " ВЫБРАТЬ
| СпецификацииНоменклатуры.Ссылка
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
|ГДЕ
| СпецификацииНоменклатуры.Владелец.Ссылка = &НоменклатураСсылка
| И СпецификацииНоменклатуры.Организация В ИЕРАРХИИ (&Организация)";
Запрос.УстановитьПараметр("НоменклатураСсылка", ГотоваяПродукция);
Запрос.УстановитьПараметр("Организация", Организация);
СписокСпецификаций = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
ФормаВыбора = Справочники.СпецификацииНоменклатуры.ПолучитьФормуВыбора(,Элемент,Элемент);
ЭлементОтбора = ФормаВыбора.СправочникСписок.Отбор.Ссылка;
ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбора.Значение = СписокСпецификаций;
ЭлементОтбора.Использование = Истина;
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
Код 1C v 8.2 УП &НаКлиенте
Процедура ПоУмолчаниюОпцияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = ПолучитьФорму("Справочник.ОпцииАвтомобилей.Форма.ФормаВыбора");
ФормаВыбора.Открыть();
ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокОпций;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//считаем данные по опциям доступной для данной модели
СписокОпций.ЗагрузитьЗначения(Объект.Владелец.ОпцииМодели.Выгрузить().ВыгрузитьКолонку("Опция"));
КонецПроцедуры
Для 7.7 используем метод ИспользоватьСписокЭлементов
Автор:
Antoska
Для решения данной задачи я решил воспользоваться методом формы списка "ИспользоватьСписокЭлементов(<СписокЗначений>)", так как использование процедуры "ОбработкаПодбора()" требует наличия реквизита справочника для отбора, а это мне не очень подходит. Вот как я реализовал этот алгоритм (код из модуля формы списка справочника):
Код 1C v 7.x Функция СоответствуетУсловиямФильтра(ЭлементСправочника)
Если ПустоеЗначение(ЭлементСправочника) = 0 Тогда
//Условие фильтра: текущий остаток не равен нулю
Если Регистр.ПартииТоваров.СводныйОстаток("",ЭлементСправочника.ТекущийЭлемент(),,,,,"ОстатокТовара") <> 0 Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Возврат 0;
КонецФункции
Процедура УстановитьФильтр(Знач Группа="", Знач Иерархия="")
//Для флажка Фильтр задана формула "УстановитьФильтр()"
Если Фильтр = 1 Тогда
//Определяем параметры процедуры
Группа = ?(Группа="",ТекущийЭлемент().Родитель,Группа);
Иерархия = ?(Иерархия="",ИерархическийСписок(),Иерархия);
СписокФильтра = СоздатьОбъект("СписокЗначений");
Спр = СоздатьОбъект("Справочник.Номенклатура");
//Определяемся с использованием родителя при выборке элементов
Если ПустоеЗначение(Группа) = 0 Тогда
Спр.ИспользоватьРодителя(Группа);
КонецЕсли;
Спр.ВключатьПодчиненные(0);
//Выбираем элементы с учётом иерархии
Спр.ВыбратьЭлементы(Иерархия);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
//Показваем группы, для удобства навигации
Если Спр.ЭтоГруппа() = 1 Тогда
//Добавляем группу в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
Продолжить;
КонецЕсли;
//Проверяем элемент на соответствие условиям фильтра
Если СоответствуетУсловиямФильтра(Спр.ТекущийЭлемент()) = 1 Тогда
//Добавляем элемент в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
//Устанавливаем фильтр
ИспользоватьСписокЭлементов(СписокФильтра);
Иначе
//Снимаем фильтр
ИспользоватьСписокЭлементов();
КонецЕсли;
КонецПроцедуры
Процедура ПриВыбореРодителя(Элемент)
УстановитьФильтр(Элемент)
КонецПроцедуры
Процедура ПриСменеИерархии(Способ)
УстановитьФильтр(,Способ)
КонецПроцедуры
Функцией "СоответствуетУсловиямФильтра(ЭлементСправочника)" можно задавать любые условия фильтрации списка
опираясь на передаваемый ей элемент справочника.
Скорость работы приемлема, но можно попробовать реализовать и через запрос...