helpf.pro
Регистрация

v7: Импорт курсов валют

sd2012
14.10.2012 20:38Прочитано: 3791
Доброго времени суток!

Нужна помощь в составлении кода, т.к. сам вообще мало чего понимаю в коде 1С.
В общем ситуация такая:

Код 1C v 7.x
 //*******************************************
Перем XMLДокумент,ФлСоединения,ТЗ,стрДата,ДатаДня, Спр, Текст;
//----------------------------
Процедура Установить(Режим)
Для Н=1 по СписокВалют.РазмерСписка() Цикл
Если Режим = "Все" Тогда
СписокВалют.Пометка(Н,1);
ИначеЕсли Режим = "Сброс" Тогда
СписокВалют.Пометка(Н,0);
ИначеЕсли Режим = "Реверс" Тогда
Если СписокВалют.Пометка(Н)=1 Тогда
СписокВалют.Пометка(Н,0);
Иначе
СписокВалют.Пометка(Н,1);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
//---------------------------
Процедура ПросмотрИстории()
Спр.НайтиЭлемент(СписокВалют.ПолучитьЗначение(СписокВалют.ТекущаяСтрока()));
ТЗД.Очистить();
ТЗД.НоваяКолонка("Дата");
ТЗД.НоваяКолонка("Курс");
Период = СоздатьОбъект("Периодический");
Период.ИспользоватьОбъект("Курс",СписокВалют.ПолучитьЗначение(СписокВалют.ТекущаяСтрока()));
Период.ВыбратьЗначения(,ДатаКон);
Пока Период.ПолучитьЗначение()=1 Цикл
ТЗД.НоваяСтрока();
ТЗД.Дата = Период.ДатаЗнач;
ТЗД.Курс = Период.Значение;
КонецЦикла;
ТЗД.Сортировать("Дата-");
Текст = "История курсов для: "+СокрЛП(Спр.Наименование)+" ("+СокрЛП(Спр.ПолноеНаименование)+")";
Форма.ИспользоватьСлой("История,Копирайт",2);
КонецПроцедуры
//----------------------------
Процедура СформироватьСписок()
Спр = СоздатьОбъект("Справочник.Валюты");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 Цикл
Если Спр.ПометкаУдаления()=0 Тогда
СписокВалют.ДобавитьЗначение(Спр.ТекущийЭлемент()," "+СокрЛП(Спр.Наименование)+" ("+СокрЛП(Спр.ПолноеНаименование)+")");
СписокВалют.Пометка(СписокВалют.РазмерСписка(),1);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
//----------------------
Процедура ЗагрузкаВсех()
Если ЗагрузитьВсе=1 Тогда
Форма.СписокВалют.Доступность(0);
ИначеЕсли ЗагрузитьВсе=0 Тогда
Форма.СписокВалют.Доступность(1);
КонецЕсли;
КонецПроцедуры
//-------------------------------------
Процедура СоединениеССервером(Период=0)
Соединение = СоздатьОбъект("Addin.V7HttpReader");
Попытка
стр = "http://www.nbrb.by/Services/XmlExRates.aspx?ondate="+период;
сообщить(стр);
Соединение.ПолучитьКакСтроку(стр,XMLДокумент);
ФлСоединения=1;
Исключение
Сообщить(Соединение.СтрокаСостоянияОтвета);
ФлСоединения=0;
КонецПопытки ;
КонецПроцедуры
//-----------------------
Процедура ПолучитьКурсы()
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Код");
ТЗ.НоваяКолонка("КодН");
ТЗ.НоваяКолонка("Кратность");
ТЗ.НоваяКолонка("Наименование");
ТЗ.НоваяКолонка("Курс");

Анализатор=СоздатьОбъект("AddIn.XMLParser");
Док=Анализатор.СоздатьДокумент();
Док.ЗагрузитьИзСтроки(XMLДокумент);
УзелВалют=Док.ВыбратьУзел("DailyExRates"); //выбрали основной узел
Кол=УзелВалют.КоличествоПодчиненных();
Для Н=1 по кол Цикл
// ДанныеВалют=УзелВалют.ПолучитьПодчиненныйПоНомеру(ин);//спозиционировались на валюты
ДанныеВалют=УзелВалют.ПолучитьПодчиненныйПоНомеру(Н);
ТЗ.НоваяСтрока();
Данные = ДанныеВалют.ПолучитьПодчиненныйПоНомеру(1);// NumCode - цифровой код
ТЗ.Код = Данные.Значение;
Данные = ДанныеВалют.ПолучитьПодчиненныйПоНомеру(2);// CharCode - буквенный код ТЗ.КодН = Данные.Значение;
ТЗ.КодН = Данные.Значение;
Данные = ДанныеВалют.ПолучитьПодчиненныйПоНомеру(3);// Scale - номинал
ТЗ.Кратность = Данные.Значение;
Данные = ДанныеВалют.ПолучитьПодчиненныйПоНомеру(4);// Name - наименование валюты
ТЗ.Наименование =Данные.Значение;
Данные = ДанныеВалют.ПолучитьПодчиненныйПоНомеру(5);// Rate - курс.
ТЗ.Курс = Данные.Значение;
КонецЦикла;

//Записываем данные в справочник
Если ЗагрузитьВсе=1 тогда
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Если Спр.НайтиПоКоду(ТЗ.Код)=0 Тогда
Спр.Новый();
Спр.Код = ТЗ.Код;
Спр.ПолноеНаименование = ТЗ.Наименование;
Спр.Наименование = ТЗ.КодН;
Спр.Записать();
КонецЕсли;
Спр.Кратность.Установить(ДатаДня,ТЗ.Кратность);
Спр.Курс.Установить(ДатаДня, ТЗ.Курс);
Спр.Записать();
Сообщить(Строка(ДатаДня)+" "+Строка(ТЗ.КодН)+" "+Строка(ТЗ.Курс));
КонецЦикла;
Иначе
Для С=1 по СписокВалют.РазмерСписка() Цикл
Если СписокВалют.Пометка(С)=0 Тогда
Продолжить;
КонецЕсли;
Спр.НайтиЭлемент(СписокВалют.ПолучитьЗначение(С));
стрТЗ=0;
ТЗ.НайтиЗначение(Спр.Код,СтрТЗ,"Код");
Если стрТЗ<>0 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(стрТЗ);
Спр.Кратность.Установить(ДатаДня,ТЗ.Кратность);
Спр.Курс.Установить(ДатаДня, ТЗ.Курс);
Сообщить(Строка(ДатаДня)+" "+ТЗ.КодН+" "+Строка(ТЗ.Курс));
Иначе
Сообщить("для "+СокрЛП(Спр.Наименование)+" (код "+Спр.Код+") не найдено соответствие!
|Проверьте код справочника");
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
//-----------------------
Процедура Сформировать()
Для ДатаДня=ДатаНач по ДатаКон Цикл
День = Сред(Строка(ДатаДня),1,2);
Месяц = Сред(Строка(ДатаДня),4,2);
Год = ДатаГод(ДатаДня);
СтрДата = Строка(Месяц)+"/"+Строка(День)+"/"+Строка(Год);
//Сообщить(СтрДата);
СоединениеССервером(СтрДата);
Если ФлСоединения=0 Тогда
Предупреждение("Невозможно установить связь с сервером");
Возврат;
КонецЕсли;
ПолучитьКурсы();
КонецЦикла;
КонецПроцедуры
//-----------------------

//---------------------
Процедура ПриОткрытии()
Форма.ИспользоватьСлой("Основной,Копирайт",2);
ДатаНач = ТекущаяДата();
ДатаКон = ТекущаяДата();
СформироватьСписок();
Попытка
ЗагрузитьВнешнююКомпоненту("v7plus.dll");
Сообщить("Компонента v7plus загружена!");
Исключение
Сообщить("Пытались, но не загрузили компоненту v7plus )");
КонецПопытки;
КонецПроцедуры


Все как бы нормально, но глюк начинается вот тут:
Код 1C v 7.x
 Анализатор=СоздатьОбъект("AddIn.XMLParser");
Док=Анализатор.СоздатьДокумент();
Док.ЗагрузитьИзСтроки(XMLДокумент);


Ошибка вот такая:
Код 1C v 7.x
 Док.ЗагрузитьИзСтроки(XMLДокумент); 
{путь к отчету\Импорт курсов.ERT(81)}: : Invalid at the top level of the document.
[п»ї<?xml version="1.0" encoding="utf-8"?> (error position = 2)]


... как я понимаю, косяк весь в этих символах &#239;»&#191; перед <?xml version="1.0" encoding="utf-8"?>. Если же ХМЛ сохранить локально и сделать ему кодировку utf-8 без BOM, то все отлично ипортируется, за исключением одного НО, русские названия валют сохраняются в справочник "кракозябрами"...
Вопрос как можно решить 2 этих проблемы? Отчет .ert в приложении
Спасибо
Yandex
Возможно, вас также заинтересует
Реклама на портале
sd2012
15.10.2012 04:29Ответ № 1
Сам себе отвечу)

Код 1C v 7.x
 Попытка 
стр = "http://www.nbrb.by/Services/XmlExRates.aspx?ondate="+период;
сообщить(стр);
Соединение.ПолучитьКакСтроку(стр, XMLДокумент);
XMLДокумент=СтрЗаменить(XMLДокумент, "п»ї", "");
ФлСоединения=1;
Исключение
Сообщить(Соединение.СтрокаСостоянияОтвета);
ФлСоединения=0;
КонецПопытки ;
Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.