Чтение данных с сайта в формате XML и загрузка в 1С При разработке веб проекта нам потребовалось получать с одного сайта данные в формате XML и загружать их в 1С.
Сайт выдает XML вида (Ссылка на этот xml в коде, внизу):
Код 1C v 8.3 This XML file does not appear to have any style information associated with it. The document tree is shown below.
< updates version= "1.0" generator= "SEOBudget" url= "http://seobudget.ru/updates/" >
< update id= "cy" name= "Обновление тИЦ Яндекса" >
< date id= "1823" index= "1419324939" timestamp= "1419324939" > 23.12 . 2014 11 : 55 : 39 MSK< / date>
< date id= "1792" index= "1415776885" timestamp= "1415776885" > 12.11 . 2014 10 : 21 : 25 MSK< / date>
< date id= "1760" index= "1412923802" timestamp= "1412924102" > 10.10 . 2014 10 : 55 : 02 MSK< / date>
< / update>
< update id= "serp" name= "Обновление поисковой выдачи Яндекса" >
< date id= "1872" index= "1424898000" timestamp= "1425604249" > 06.03 . 2015 04 : 10 : 49 MSK< / date>
< date id= "1871" index= "1423602000" timestamp= "1425586715" > 05.03 . 2015 23 : 18 : 35 MSK< / date>
< date id= "1868" index= "1423602000" timestamp= "1425402241" > 03.03 . 2015 20 : 04 : 01 MSK< / date>
< / update>
< update id= "yaca" name= "Обновление Яндекс.Каталога" >
< date id= "1875" index= "1425931200" timestamp= "1425973201" > 10.03 . 2015 10 : 40 : 01 MSK< / date>
< date id= "1874" index= "1425758400" timestamp= "1425886502" > 09.03 . 2015 10 : 35 : 02 MSK< / date>
< date id= "1873" index= "1425585600" timestamp= "1425628803" > 06.03 . 2015 11 : 00 : 03 MSK< / date>
< / update>
< update id= "pr" name= "Обновление Google PR" >
< date id= "1512" index= "1386353345" timestamp= "1386353345" > 06.12 . 2013 22 : 09 : 05 MSK< / date>
< date id= "1265" index= "1360130400" timestamp= "1360130400" > 06.02 . 2013 10 : 00 : 00 MSK< / date>
< date id= "1196" index= "1352376123" timestamp= "1352376123" > 08.11 . 2012 16 : 02 : 03 MSK< / date>
< / update>
< update id= "user" name= "Обновление ПФ в Яндексе" >
< date id= "1799" index= "1415950021" timestamp= "1416986821" > 26.11 . 2014 10 : 27 : 01 MSK< / date>
< date id= "1763" index= "1409237032" timestamp= "1413211432" > 13.10 . 2014 18 : 43 : 52 MSK< / date>
< date id= "1665" index= "1400617705" timestamp= "1401222505" > 28.05 . 2014 00 : 28 : 25 MSK< / date>
< / update>
< / updates> < br>
В результате была написана обработка загрузки данных с сайта в 1С, ее код:
Код 1C v 8.3 &НаСервере
Функция ЧтениеXMLВДерево(Путь)
Дерево = Новый ДеревоЗначений;
Дерево. Колонки. Добавить( "Имя" ) ;
Дерево. Колонки. Добавить( "Значение" ) ;
XMLФайл = Новый ЧтениеXML;
XMLФайл. ОткрытьФайл( Путь) ;
ПрочитатьXMLПоТегам( XMLФайл, Дерево. Строки) ;
XMLФайл. Закрыть( ) ;
ТекДанные = Неопределено ;
Для каждого СтрокаП из Дерево. Строки Цикл
Для каждого СтрокаВ из СтрокаП. Строки Цикл
Для каждого СтрокаТ из СтрокаВ. Строки Цикл
Если СтрокаТ. Значение = "cy" тогда
ТекДанные = Перечисления. Показатель. TiC;
ИначеЕсли СтрокаТ. Значение = "serp" тогда
ТекДанные = Перечисления. Показатель. SYa;
ИначеЕсли СтрокаТ. Значение = "yaca" тогда
ТекДанные = Перечисления. Показатель. CatYa;
ИначеЕсли СтрокаТ. Значение = "pr" тогда
ТекДанные = Перечисления. Показатель. RP;
ИначеЕсли СтрокаТ. Значение = "user" тогда
ТекДанные = Перечисления. Показатель. PFYa;
КонецЕсли ;
Для каждого СтрокаД из СтрокаТ. Строки Цикл
Если СтрокаД. Имя= "timestamp" Тогда
ДатаИзменения = МестноеВремя( '19700101 '+ СтрокаД. значение) ;
НовЗапись = РегистрыСведений. ТиЦиRP. СоздатьМенеджерЗаписи( ) ;
НовЗапись. Показатель = ТекДанные;
НовЗапись. Период = ДатаИзменения;
НовЗапись. Записать( ) ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
КонецФункции
&НаСервереБезКонтекста
Процедура ПрочитатьXMLПоТегам(XMLФайл, ТекущийНаборСтрок)
Пока XMLФайл. Прочитать( ) Цикл
Если XMLФайл. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
НоваяСтрока = ТекущийНаборСтрок. Добавить( ) ;
НоваяСтрока. Имя = XMLФайл. Имя;
НоваяСтрока. Значение = "" ;
Пока XMLФайл. ПрочитатьАтрибут( ) Цикл
НоваяСтрокаАтрибут = НоваяСтрока. Строки. Добавить( ) ;
НоваяСтрокаАтрибут. Имя = XMLФайл. Имя;
НоваяСтрокаАтрибут. Значение = СокрЛП( XMLФайл. Значение) ;
КонецЦикла ;
ПрочитатьXMLПоТегам( XMLФайл, НоваяСтрока. Строки) ;
ИначеЕсли XMLФайл. ТипУзла = ТипУзлаXML. КонецЭлемента Тогда
Возврат ;
ИначеЕсли XMLФайл. ТипУзла = ТипУзлаXML. Текст Тогда
ТекущийНаборСтрок. Родитель. Значение = СокрЛП( XMLФайл. Значение) ;
Иначе
Сообщить( "Тип узла: " + XMLФайл. ТипУзла + " НЕ ОБРАБОТАН" , СтатусСообщения. Важное) ;
Конецесли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура СборXML(Команда)
ЧтениеXMLВДерево( "http://seobudget.ru/downloads/updates.xml" ) ;
КонецПроцедуры
Результат загруженный в регистр сведений:
Категория:
Работа с Интернет, Почтой (Mail), FTP Отбор по текущему значению в динамическом списке Код 1C v 8.2 УП &НаКлиенте
Процедура ОтборПоТекущемуЗначению(Команда)
ТекДанныеСписка = Элементы. СписокОтчетов. ТекущиеДанные;
Если ТекДанныеСписка = Неопределено Тогда
Предупреждение( "Не указано значение отбора" ) ;
Возврат ;
КонецЕсли ;
ИмяПараметраОтбора = СтрЗаменить( Элементы. СписокОтчетов. ТекущийЭлемент. Имя, "СписокОтчетов" , "" ) ;
ЗначениеПараметраОтбора = Неопределено ;
ТекДанныеСписка. Свойство( ИмяПараметраОтбора, ЗначениеПараметраОтбора) ;
СписокОтчетов. Отбор. Элементы. Очистить( ) ;
ЭлементОтбора = СписокОтчетов. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ЭлементОтбора. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( ИмяПараметраОтбора) ;
ЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. Равно;
ЭлементОтбора. ПравоеЗначение = ЗначениеПараметраОтбора;
ЭлементОтбора. Использование = Истина ;
Элементы. СписокОтчетов. Обновить( ) ;
КонецПроцедуры
Категория:
Схема Компоновки Данных Динамический список ~ Как программно выделить все строки динамического списка? В платформе “1с предприятие 8.2″ появился такой замечательный объект как
“динамический список“ . Данный объект я часто использую в подборах, если не нужно делать сложные расчеты, а просто показать данные и выбрать.
Бывают такие ситуации, что список большой, более 10 позиций, и пользователю необходимо выбрать все строки. Стандартного способа как это сделать я не нашел.
Для решения это задачи я использовал объект “WSCript.Shell“.
В процессе реализации у меня получилось 2 варианта:
Вариант №1
Определим кнопку “Выделить все строки” и в модуль обработчика добавим код:
Код 1C v 8.2 УП wsh = Новый COMОбъект( “WSCript. Shell”) ;
ЭтаФорма. ТекущийЭлемент = Элементы. ДинамическийСписок;
wsh. sendkeys( “^ {A}”) ;
С помощью данного кода выполняется нажатие клавиш “Ctrl + A“, т.е. “выделить все”.
Вариант №2
Вариант №1 не всегда срабатывал. Тогда данный код я переписал следующим образом:
Добавим реквизит формы
“ПоследняяСтрокаСписка”
Для списка укажем свойство “Начальное отображение списка” = В конце списка
В процедуру
“ПриОткрытии” добавим заполнение реквизита, определенного в пункте 1.
Код 1C v 8.2 УП ПоследняяСтрокаСписка = Элементы. ДинамическийСписок. ВыделенныеСтроки[0 ];
Определим кнопку “Выделить все строки” и в модуль обработчика добавим код:
Код 1C v 8.2 УП wsh = Новый COMОбъект( “WSCript. Shell”) ;
ЭтаФорма. ТекущийЭлемент = Элементы. ДинамическийСписок;
wsh. sendkeys( “{END}”) ;
ТекДанные = Элементы. ДинамическийСписок. ТекущиеДанные;
Если ТекДанные < > Неопределено Тогда
wsh. sendkeys( “+ {UP ” + ПоследняяСтрокаСписка + “}”) ;
КонецЕсли ;
С помощью данного кода выполняется нажатие клавиш “Shift + кнопка вверх“.
Хочу обратить внимание. Данное решение не будет работать на клиентах, которые запускаются на Линукс.
Автор
Сергей Сопелев Категория:
Работа с Формой (Диалог) и её элементами