Как декодировать (преобразовать) Unicode в 1С При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok" :"true" ,"description" :"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d" }
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение. УстановитьСтроку( стрВходящая) ;
ДанныеЛога = ПрочитатьJSON( Чтение) ;
Чтение. Закрыть( ) ;
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3
Функция ДекодироватьUniCodeВJSON(стрВходящая)
Чтение = Новый ЧтениеJSON;
Чтение. УстановитьСтроку( стрВходящая) ;
ДанныеЛога = ПрочитатьJSON( Чтение) ;
Чтение. Закрыть( ) ;
Текст = "" ;
Для каждого Элемент Из ДанныеЛога Цикл
Текст = Текст + ? ( НЕ ПустаяСтрока( Текст) , Символы. ПС, "" ) ;
Текст = Текст + Элемент. Ключ + " = " + Элемент. Значение;
КонецЦикла ;
Возврат Текст;
Запись = Новый ЗаписьJSON;
Запись. УстановитьСтроку( Новый ПараметрыЗаписиJSON( ПереносСтрокJSON. Нет) ) ;
ЗаписатьJSON( Запись, ДанныеЛога, ) ;
Возврат Запись. Закрыть( ) ;
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив( 66 ) ;
МасУкр[0 ]= "А" ; МасУкр[1 ]= "Б" ; МасУкр[2 ]= "В" ; МасУкр[3 ]= "Г" ; МасУкр[4 ]= "Ґ" ; МасУкр[5 ]= "Д" ;
МасУкр[6 ]= "Е" ; МасУкр[7 ]= "Є" ; МасУкр[8 ]= "Ж" ; МасУкр[9 ]= "З" ; МасУкр[10 ]= "И" ; МасУкр[11 ]= "І" ;
МасУкр[12 ]= "Ї" ; МасУкр[13 ]= "Й" ; МасУкр[14 ]= "К" ; МасУкр[15 ]= "Л" ; МасУкр[16 ]= "М" ; МасУкр[17 ]= "Н" ;
МасУкр[18 ]= "О" ; МасУкр[19 ]= "П" ; МасУкр[20 ]= "Р" ; МасУкр[21 ]= "С" ; МасУкр[22 ]= "Т" ; МасУкр[23 ]= "У" ;
МасУкр[24 ]= "Ф" ; МасУкр[25 ]= "Х" ; МасУкр[26 ]= "Ц" ; МасУкр[27 ]= "Ч" ; МасУкр[28 ]= "Ш" ; МасУкр[29 ]= "Щ" ;
МасУкр[30 ]= "Ь" ; МасУкр[31 ]= "Ю" ; МасУкр[32 ]= "Я" ;
МасУкр[33 ]= "а" ; МасУкр[34 ]= "б" ; МасУкр[35 ]= "в" ; МасУкр[36 ]= "г" ; МасУкр[37 ]= "ґ" ; МасУкр[38 ]= "д" ;
МасУкр[39 ]= "е" ; МасУкр[40 ]= "є" ; МасУкр[41 ]= "ж" ; МасУкр[42 ]= "з" ; МасУкр[43 ]= "и" ; МасУкр[44 ]= "і" ;
МасУкр[45 ]= "ї" ; МасУкр[46 ]= "й" ; МасУкр[47 ]= "к" ; МасУкр[48 ]= "л" ; МасУкр[49 ]= "м" ; МасУкр[50 ]= "н" ;
МасУкр[51 ]= "о" ; МасУкр[52 ]= "п" ; МасУкр[53 ]= "р" ; МасУкр[54 ]= "с" ; МасУкр[55 ]= "т" ; МасУкр[56 ]= "у" ;
МасУкр[57 ]= "ф" ; МасУкр[58 ]= "х" ; МасУкр[59 ]= "ц" ; МасУкр[60 ]= "ч" ; МасУкр[61 ]= "ш" ; МасУкр[62 ]= "щ" ;
МасУкр[63 ]= "ь" ; МасУкр[31 ]= "ю" ; МасУкр[65 ]= "я" ;
МасКод = Новый Массив( 66 ) ;
МасКод[0 ]= "0410" ; МасКод[1 ]= "0411" ; МасКод[2 ]= "0412" ; МасКод[3 ]= "0413" ; МасКод[4 ]= "0490" ; МасКод[5 ]= "0414" ;
МасКод[6 ]= "0415" ; МасКод[7 ]= "0404" ; МасКод[8 ]= "0416" ; МасКод[9 ]= "0417" ; МасКод[10 ]= "0418" ; МасКод[11 ]= "0406" ;
МасКод[12 ]= "0407" ; МасКод[13 ]= "0419" ; МасКод[14 ]= "041A" ; МасКод[15 ]= "041B" ; МасКод[16 ]= "041C" ; МасКод[17 ]= "041D" ;
МасКод[18 ]= "041E" ; МасКод[19 ]= "041F" ; МасКод[20 ]= "0420" ; МасКод[21 ]= "0421" ; МасКод[22 ]= "0422" ; МасКод[23 ]= "0423" ;
МасКод[24 ]= "0424" ; МасКод[25 ]= "0425" ; МасКод[26 ]= "0426" ; МасКод[27 ]= "0427" ; МасКод[28 ]= "0428" ; МасКод[29 ]= "0429" ;
МасКод[30 ]= "042C" ; МасКод[31 ]= "042E" ; МасКод[32 ]= "042F" ;
МасКод[33 ]= "0430" ; МасКод[34 ]= "0431" ; МасКод[35 ]= "0432" ; МасКод[36 ]= "0413" ; МасКод[37 ]= "0491" ; МасКод[38 ]= "0434" ;
МасКод[39 ]= "0435" ; МасКод[40 ]= "0454" ; МасКод[41 ]= "0436" ; МасКод[42 ]= "0437" ; МасКод[43 ]= "0438" ; МасКод[44 ]= "0456" ;
МасКод[45 ]= "0457" ; МасКод[46 ]= "0439" ; МасКод[47 ]= "043A" ; МасКод[48 ]= "043B" ; МасКод[49 ]= "043C" ; МасКод[50 ]= "043D" ;
МасКод[51 ]= "043E" ; МасКод[52 ]= "043F" ; МасКод[53 ]= "0440" ; МасКод[54 ]= "0441" ; МасКод[55 ]= "0442" ; МасКод[56 ]= "0443" ;
МасКод[57 ]= "0444" ; МасКод[58 ]= "0445" ; МасКод[59 ]= "0446" ; МасКод[60 ]= "0447" ; МасКод[61 ]= "0448" ; МасКод[62 ]= "0449" ;
МасКод[63 ]= "044C" ; МасКод[31 ]= "044E" ; МасКод[65 ]= "044F" ;
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина( Строка) Цикл
Если Лев( Строка, 1 ) = "\" Тогда
Если Лев( Строка, 2 ) = "\u" Тогда
тмпСтрока = Прав( Лев( Строка, 6 ) , 4 ) ;
Если МасКод. Найти( тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав( тмпСтрока, 1 ) ;
тмпСтрока = СтрЗаменить( тмпСтрока, СтрокаЗамены, ТРег( СтрокаЗамены) ) ;
Если МасКод. Найти( тмпСтрока) = Неопределено Тогда
Сообщить( "Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод. Найти( тмпСтрока) ] ;
КонецЕсли ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод. Найти( тмпСтрока) ] ;
КонецЕсли ;
Строка = Прав( Строка, ( СтрДлина( Строка) - 6 ) ) ;
Иначе
Строка = Прав( Строка, ( СтрДлина( Строка) - 2 ) ) ;
КонецЕсли ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев( Строка, 1 ) ;
Строка = Прав( Строка, ( СтрДлина( Строка) - 1 ) ) ;
КонецЕсли ;
КонецЦикла ;
Возврат ГотововаяСтрока ;
КонецФункции
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Нет прав на запуск требуемого вида клиента Новый пользователь пытается открыть программу и получает ошибку ошибка: «Нет права на запуск требуемого вида клиента».
Откройте Конфигуратор - Администрирование - Пользователи:
1. Если Пользователей нет, то создайте пользователя, введите имя, пароль и на закладке прочее установите Полные права
2. Если пользователи есть, то отройте проблемного пользователя и на закладке Прочее установите галки напротив нужных прав:
И отметьте галками права на запуск толстого и тонкого клиента:
Если у вас нет в списке Запуск толстого клиента или Запуск тонкого клиента, то нужно через конфигурацию открыть назначенную роль пользователю:
В окне редактирования роли отметить галками требуемые клиенты
Сохранить конфигурацию и все запустится
Категория:
Управляемое приложение, Тонкий клиент Как установить параметр динамического списка? Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента
Для вывода используется используется запрос:
Код 1C v 8.3 ВЫБРАТЬ
РегистрСведенийFinans. Период,
РегистрСведенийFinans. Клиент,
РегистрСведенийFinans. Движение,
РегистрСведенийFinans. Расшифровка,
РегистрСведенийFinans. СуммаОбщая,
РегистрСведенийFinans. РасходыСервиса,
РегистрСведенийFinans. W1C
ИЗ
РегистрСведений. Finans КАК РегистрСведенийFinans
ГДЕ
РегистрСведенийFinans. Клиент = Клиент
Чтобы при открытии не отображалась информацию по другим клиентам, необходимо установить параметр динамического списка , сделаем это так:
Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Финансы. Параметры. УстановитьЗначениеПараметра( "Клиент" , Объект. Ссылка) ;
КонецПроцедуры
Можно и просто настроить отбор через настройки, используя ЭлементОтбораКомпоновкиДанных
Подробнее об этом: Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором?
Категория:
Работа с Формой (Диалог) и её элементами Открытие формы не записанного документа Нередко необходимо программно создать новый документ или элемент справочника и заполнить его данными. А затем, НЕ ЗАПИСЫВАЯ его в базу данных, открыть форму для того чтобы пользователь получил возможность его отредактировать и потом сам принял решение о его записи в БД(или отказался от записи). На платформах 8.0, 8.1 (и даже 7.7) это не представляло никакой сложности, а вот в тонком клиенте управляемого приложения 8.2 эта задача уже ни кажется столь тривиальной.
Первый способ заключается в том, что необходимо заранее подготовить некую структуру, которая будет содержать данные для заполнения документа, передать эту структуру в открываемую форму, а уже в самой форме в событии
ПриСозданииНаСервере() заполнять вновь открываемую форму переданными в неё данными. Этот способ не нов, но у него есть один серьезный недостаток – необходимо изменить модуль формы самого объекта, чтобы добавить/изменить событие формы
ПриСозданииНаСервере() , это очень не понравится тем кто работает с типовыми конфигурациями находящимися на поддержке. Кроме того этот подход не применим во внешних обработках, что сильно сокращает потенциал его применения.
Второй способ решения этой задачи лишен вышеупомянутых недостатков:
Код 1C v 8.2 УП &НаКлиенте
Процедура КомандаОткрытьФорму(Команда)
Форма = ПолучитьФорму( "Справочник.Пользователи.ФормаОбъекта" ) ;
ДанныеФормы = Форма. Объект;
ЗаполнитьНаСервере( ДанныеФормы) ;
КопироватьДанныеФормы( ДанныеФормы, Форма. Объект) ;
Форма. Открыть( ) ;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗаполнитьНаСервере(НовыйОбъект) ;
НовыйОбъект. Наименование = "Новый элемент" ;
Для К= 1 По 100 Цикл
НоваяСтрока = НовыйОбъект. ТЧ. Добавить( ) ;
НоваяСтрока. РеквизитТЧ = К;
КонецЦикла ;
КонецПроцедуры
Источник: [url=obrabotki.com]http://www.obrabotki.com/1s-openform-manag
edf orms/[/url]
еще вариант:
Код 1C v 8.2 УП &НаКлиенте
Процедура СоздатьДокумент(Команда)
Форма = ПолучитьФорму( “Документ. Реализация. ФормаОбъекта”) ;
ДанныеФормы = Форма. Объект;
ЗаполнитьДокументНаСервере( ДанныеФормы) ;
КопироватьДанныеФормы( ДанныеФормы, Форма. Объект) ;
Форма. Открыть( ) ;
КонецПроцедуры
&НаСервере
Функция ЗаполнитьДокументНаСервере(ДанныеФормы) ;
Док = ДанныеФормыВЗначение( ДанныеФормы, Тип( “ДокументОбъект. Реализация) ) ;
Для каждого Стр Из ТЗ Цикл
СтрДок = Док. Товары. Добавить( ) ;
СтрДок. Количество = Стр. Количество;
СтрДок. Номенклатура = Стр. Номенклатура;
КонецЦикла ;
ЗначениеВДанныеФормы( Док, ДанныеФормы) ;
КонецФункции
Категория:
Документы Как загрузить данные из Access в 1С ? Загружаем данные из Access в 1С
Код 1C v 8.х Файл = "C:\files\demo.mdb" ;
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Файл + ";"" " ;
Connection = Новый COMОбъект( "ADODB.Connection" ) ;
Попытка
Connection. Open( СтрокаПодключения) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
Command = Новый COMОбъект( "ADODB.Command" ) ;
Command. ActiveConnection = Connection;
Command. CommandText = "S_elect * FROM Table1" ;
Command. CommandType = 1 ;
RecordSet = Новый COMОбъект( "ADODB.RecordSet" ) ;
RecordSet = Command. Execute( ) ;
стр = "" ;
Пока RecordSet. EOF( ) = 0 Цикл
для н= 0 по Recordset. Fields. Count - 1 цикл
стр = стр + " " + Recordset. Fields( н) . Value;
КонецЦикла ;
Сообщить( стр) ;
стр = "" ;
RecordSet. MoveNext( ) ;
КонецЦикла ;
RecordSet. Close( ) ;
Connection. Close( ) ;
Код 1C v 7.x Акцесс = СоздатьОбъект( "ADODB.CONNECTION" ) ;
Попытка
СтрокаПодключения= "Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\mybase.mdb;Uid=Admin;Pwd=" ;
Акцесс. Open( СтрокаПодключения) ;
Исключение
Сообщить( "Все плохо:" + ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
Команда = СоздатьОбъект( "ADODB.Command" ) ;
Команда. ActiveConnection= Акцесс;
ТекстСелект = "S_elect * FROM tblCustoms" ;
НаборЗаписей = СоздатьОбъект( "ADODB.RecordSet" ) ;
Команда. CommandText= ТекстСелект;
Попытка
НаборЗаписей= Команда. Execute;
Исключение
Сообщить( "Обломись:" + ОписаниеОшибки( ) ) ;
КонецПопытки ;
Попытка
НаборЗаписей. MoveFirst( ) ;
Исключение
НаборЗаписей. Close( ) ;
Возврат ;
КонецПопытки ;
Пока НаборЗаписей. EOF( ) = 0 Цикл
ИНН = НаборЗаписей. Fields( "INN" ) . Value;
НаборЗаписей. MoveNext( ) ;
КонецЦикла ;
НаборЗаписей. Close( ) ;
СтрокаПодключения= "Driver= Microsoft Access Driver (*.mdb)};systemDB=C:\wg.mdw;Dbq=C:\mybase.mdb;Uid=Admin;Pwd=" ;
Работа с ACCESS из 1С через DAO
Код 1C v 7.x Процедура Выполнить()
Спр = СоздатьОбъект( "Справочник.ТоварыВПрайсе" ) ;
Спр. ИспользоватьВладельца( ФасВладелец) ;
dbe = СоздатьОбъект( "dao.DBEngine.36" ) ;
wksp = dbe. Workspaces( 0 ) ;
db = 0 ;
Если ФС. СуществуетФайл( КаталогИБ( ) + "Pric_list.mdb" ) = 0 Тогда
db = wksp. CreateDataBase( КаталогИБ( ) + "Pric_list.mdb" , ";LANGID=0x0419;Cp=1251;Country=0" ) ;
db. Execute( "Create table [" + Строка( фасВладелец) + "]
|(Rec_ind integer,
|Код text,
|Артикул text,
|Цена integer,
|Товар text,
|Единица text,
|Val text);"
) ;
db. Execute( "Create index Rec_ind on [" + Строка( фасВладелец) + "] (Rec_ind);" ) ;
Иначе
db= wksp. OpenDataBase( КаталогИБ( ) + "Pric_list.mdb" ) ;
Попытка
rs = db. OpenRecordset( Строка( фасВладелец) ) ;
Исключение
Сообщить( "Создается новая таблица" ) ;
КонецПопытки ;
Если ПустоеЗначение( rs) = 1 Тогда
db. Execute( "Create table [" + Строка( фасВладелец) + "]
|(Rec_ind integer,
|Код text,
|Артикул text,
|Цена integer,
|Товар text,
|Единица text,
|Val text);"
) ;
db. Execute( "Create index Rec_ind on [" + Строка( фасВладелец) + "] (Rec_ind);" ) ;
КонецЕсли ;
db. Execute( "Delete * From [" + Строка( фасВладелец) + "];" ) ;
КонецЕсли ;
rs = db. OpenRecordset( Строка( фасВладелец) ) ;
Y = 1 ;
Спр. ВыбратьЭлементы( ) ;
Пока Спр. ПолучитьЭлемент( ) = 1 Цикл
лсЕдиницы = "" ;
Если Спр. асТовар. апТип= Перечисление. ТипТовара. Услуга Тогда
лсЕдиницы = "" ;
ИначеЕсли Спр. асТовар. апТип= Перечисление. ТипТовара. Весовой Тогда
лсЕдиницы = "г" ;
ИначеЕсли Спр. асТовар. апТип= Перечисление. ТипТовара. Штучный Тогда
лсЕдиницы = "шт." ;
КонецЕсли ;
Если Спр. ЭтоГруппа( ) = 0 Тогда
rs. AddNew( ) ;
rs. Rec_ind = Y;
rs. Код= Спр. асТовар. ПолныйКод( ) ;
rs. Артикул = Спр. асТовар. сАртикул;
rs. Цена = Спр. чЦена;
rs. Товар= Спр. асТовар. сПолнНаименование;
rs. Единица = лсЕдиницы;
rs. Val = Спр. асВалюта. Код;
rs. Update( ) ;
Y= Y+ 1 ;
КонецЕсли ;
КонецЦикла ;
db. Close( ) ;
Сообщить( "Выгрузка завершена" ) ;
КонецПроцедуры
Код 1C v 7.x
Процедура ACCESS()
dbe=CreateObject("DAO.DBEngine.36");
wksp=dbe.Workspaces(0);
db=0;
// в ковычках имя фаила с расширением MDB
Если ФС.СуществуетФайл(КаталогПользователя()+"sr.mdb")=0 Тогда
// создание файла базы данных с русским порядком сортировки
db=wksp.CreateDataBase(КаталогПользователя()+"mars_sr.mdb",";LANGID=0x0419;CP=1251;COUNTRY=0");
// DDL - запрос на создание таблицы
// описание языка DDL (подмножество SQL) смотрите в хелпе по MS Access
// не пытайтесь делать это с другими форматами - DDL через DAO поддерживается только для MDB
//Создадим еще таблицу
db.Execute("CREATE TABLE BANKS
|(REC_IND INTEGER,
|BANKCODE INTEGER,
|BANKNAME TEXT ,
|ModifiedF lg BIT,
|ChangeSeqFlg BIT);"
);
// индекс на нужные поля
db.Execute("CREATE INDEX REC_IND ON BANKS (REC_IND);");
Иначе
// просто открываем базу данных в разделенном режиме
db=wksp.OpenDataBase(КаталогПользователя()+"sr.mdb");
// и очищаем имеющиеся данные
db.Execute("DELETE * FROM BANKS;");
КонецЕсли;
// rs-это как раз сама таблица, куда мы будем добавлять записи
rs=db.OpenRecordset("BANKS");
// добавление записи
rs.AddNew();
// присвоение значений полям
rs.REC_IND = "1";
rs.BANKCODE = "34";
rs.BANKNAME = "Инвест";
rs.ModifiedF lg = "1";
// запомним запись
rs.Update();
// и так далее ...
db.Close(); // закрытие базы данных
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice Примеры работы с Деревом значений в УП Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в
платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное что при этом нужно было не забыть так это СоздатьКолонки() .
В управляемом приложении 1С 8.2 сделать это не так просто как кажется на первый взгляд.
Обращаю внимание, что
ДеревоЗначений доступно только на сервере, в толстом клиенте и внешнем соединение. В данных самой управляемой формы для моделирования дерева используется тип ДанныеФормыДерево. Для преобразования ДеревоЗначений <-> ДанныеФормыДерево используются методы управляемой формы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение(). Для непосредственного отображения дерева используется элемент формы типа ТаблицаФормы связанный через реквизит ПутьКДанным с реквизитом формы типа ДанныеФормыДерево. Если Вам не очень понятна вышеописанная связь объектов, не огорчайтесь, ниже рассмотрим практический пример и все встанет на свои места.
Задача: Имеется дерево значений, необходимо отобразить его на управляемой форме.
Создаем новую внешнюю обработку (
Скачивать файлы может только зарегистрированный пользователь! ), добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить(
Новый РеквизитФормы( Колонка. Имя, Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
КонецЦикла ;
КонецПроцедуры
Механизм Drag and D_rop (или проще говоря “Перетаскивания”) для ДереваЗначений расположенного на управляемой форме управляемого приложения
Основная сложность реализации механизма перетаскивания заключается в том, что у строки ДереваЗначений платформа не позволяет просто изменить родителя, т.е. переподчинить строку. Единственный способ это сделать – создать новую строку вместе со всеми подчиненными строками, т.е. полностью скопировать всю ветку дерева вместе со всей иерархией и подчинить ее требуемой строке-родителю, после чего удалить исходную ветку. Данная задача распадается на две подзадачи:
1). Перед перетаскиванием необходимо проверить корректность данной операции, узел дерева нельзя переносить в узлы подчиненные ему самому, т.е. родительский узел нельзя переносить в дочерние, т.к. это приведет к “бесконечной рекурсии” и “падению” платформы. Это реализуется с помощью обработчика события ЭлементДеревоПроверкаПеретаскивания(…)
2). Если перетаскивание возможно, то при помощи обработчика ЭлементДеревоПеретаскивание(…) запускается рекурсивная функция, которая создает новую ветку дерева, подчиненную требуемому родителю, а исходную удаляет.
Обращаю особое внимание на то, что в платформе 8.2 реализован механизм множественного выбора элементов, поэтому вышеуказанные операции необходимо произвести для всех выбранных пользователем элементов. (
Скачивать файлы может только зарегистрированный пользователь! )
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементДерево. МножественныйВыбор= Истина ;
ЭлементДерево. РазрешитьПеретаскивание= Истина ;
ЭлементДерево. РазрешитьНачалоПеретаскивания= Истина ;
ЭлементДерево. УстановитьДействие( "ПроверкаПеретаскивания" ,
"ЭлементДеревоПроверкаПеретаскивания" ) ;
ЭлементДерево. УстановитьДействие( "Перетаскивание" ,
"ЭлементДеревоПеретаскивание" ) ;
КонецПроцедуры
&НаКлиенте
Функция ПроверитьВозможностьПереноса(ПереносимыйЭлемент, Знач НовыйРодитель)
Пока НЕ НовыйРодитель = Неопределено Цикл
Если ПереносимыйЭлемент = НовыйРодитель Тогда
Возврат Ложь ;
КонецЕсли ;
НовыйРодитель = НовыйРодитель. ПолучитьРодителя( ) ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
&НаКлиенте
Функция СкопироватьСтрокуДерева(РеквизитДерево, Приемник, Источник)
Перем НоваяСтрока, ОбратныйИндекс, КолПодчиненныхСтрок;
Если Источник = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли ;
Если Приемник = Неопределено Тогда
НоваяСтрока = РеквизитДерево. ПолучитьЭлементы( ) . Добавить( ) ;
Иначе
НоваяСтрока = Приемник. ПолучитьЭлементы( ) . Добавить( ) ;
КонецЕсли ;
ЗаполнитьЗначенияСвойств( НоваяСтрока, Источник) ;
КолПодчиненныхСтрок = Источник. ПолучитьЭлементы( ) . Количество( ) ;
Для ОбратныйИндекс = 1 По КолПодчиненныхСтрок Цикл
ПодчиненнаяСтрока = Источник. ПолучитьЭлементы( )
[КолПодчиненныхСтрок - ОбратныйИндекс];
СкопироватьСтрокуДерева( РеквизитДерево, НоваяСтрока, ПодчиненнаяСтрока) ;
КонецЦикла ;
Если Источник. ПолучитьРодителя( ) = Неопределено Тогда
РеквизитДерево. ПолучитьЭлементы( ) . Удалить( Источник) ;
Иначе
Источник. ПолучитьРодителя( ) . ПолучитьЭлементы( ) . Удалить( Источник) ;
КонецЕсли ;
Возврат НоваяСтрока;
КонецФункции
&НаКлиенте
Процедура ЭлементДеревоПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь ;
РеквизитДерево = ЭтаФорма["Дерево" ];
ИДНовыйРодитель = Строка;
НовыйРодитель = ? ( ИДНовыйРодитель = Неопределено , Неопределено ,
РеквизитДерево. НайтиПоИдентификатору( ИДНовыйРодитель) ) ;
МассивИДПереносимыхЭлементов = ПараметрыПеретаскивания. Значение;
Для каждого ИДПереносимыйЭлемент из МассивИДПереносимыхЭлементов Цикл
ПереносимыйЭлемент = РеквизитДерево. НайтиПоИдентификатору(
ИДПереносимыйЭлемент) ;
Если НЕ ПроверитьВозможностьПереноса( ПереносимыйЭлемент,
НовыйРодитель) Тогда
ПараметрыПеретаскивания. Действие= ДействиеПеретаскивания. Отмена;
Прервать ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ЭлементДеревоПеретаскивание(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка= Ложь ;
РеквизитДерево = ЭтаФорма["Дерево" ];
ИДПриемник = Строка;
Приемник = ? ( ИДПриемник = Неопределено , Неопределено ,
РеквизитДерево. НайтиПоИдентификатору( ИДПриемник) ) ;
МассивИДИсточник = ПараметрыПеретаскивания. Значение;
Для Каждого ИДИсточник Из МассивИДИсточник Цикл
Источник = РеквизитДерево. НайтиПоИдентификатору( ИДИсточник) ;
НоваяСтрока = СкопироватьСтрокуДерева( РеквизитДерево, Приемник, Источник) ;
Если Приемник = Неопределено и НоваяСтрока< > Неопределено Тогда
Элементы["Дерево" ]. Развернуть( НоваяСтрока. ПолучитьИдентификатор( ) ,
Истина ) ;
КонецЕсли ;
КонецЦикла ;
Если НЕ Приемник = Неопределено Тогда
Элементы["Дерево" ]. Развернуть( ИДПриемник, Истина ) ;
КонецЕсли ;
КонецПроцедуры
Реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме
который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.
Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. (
Скачивать файлы может только зарегистрированный пользователь! )
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
ДеревоОбъект. Колонки. Добавить( "Пометка" , Новый ОписаниеТипов( "Число" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( Колонка. Имя,
Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
Если НЕ Колонка. Имя = "Пометка" Тогда
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
Иначе
НовыйЭлемент. Вид = ВидПоляФормы. ПолеФлажка;
НовыйЭлемент. ТриСостояния = Истина ;
НовыйЭлемент. УстановитьДействие( "ПриИзменении" ,
"ФлажокПриИзменении" ) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
ИДТекущейСтроки = Элементы["Дерево" ]. ТекущаяСтрока;
Если ИДТекущейСтроки < > Неопределено Тогда
ЭлементКоллекции = ЭтаФорма["Дерево" ]. НайтиПоИдентификатору(
ИДТекущейСтроки) ;
Если ЭлементКоллекции. Пометка = 2 Тогда
ЭлементКоллекции. Пометка = 0 ;
КонецЕсли ;
УстановкаФлажков( ЭлементКоллекции, ЭлементКоллекции. Пометка) ;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
Пока Родитель < > Неопределено Цикл
Родитель. Пометка = ? ( УстановленноДляВсех( ЭлементКоллекции) ,
ЭлементКоллекции. Пометка, 2 ) ;
ЭлементКоллекции = Родитель;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
ПодчинЭлементы = ЭлементКоллекции. ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
ТекЭлемент. Пометка = ЗначениеПометки;
УстановкаФлажков( ТекЭлемент, ТекЭлемент. Пометка) ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
СоседниеЭлементы =
ЭлементКоллекции. ПолучитьРодителя( ) . ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
Если ТекЭлемент. Пометка < > ЭлементКоллекции. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Источник Категория:
Работа с Деревом Значений Создание XML файла выгрузки Работников организации с Группировкой по Подразделению Нужен XML файл выгрузки данных вида(выделю как код 8-рки, т.к. выделение xlm кода нет):
Код 1C v 8.х <?xml version="1.0" encoding="UTF-8"?>
<orgstructure>
<department dep_id="7ebb913c-e9c6-11dc-a4f2-0017311416a1" dep_name="генеральный директор" dep_code="П100">
<orgposition user_id="ba68bb79-c377-11dc-a4ca-0017311416a1" user_position_id="ba68bb78-c377-11dc-a4ca-0017311416a1" user_position="генеральный директор" user_is_active="1"/>
</department>
<department dep_id="8132fe4a-0789-11dd-887b-001d60f0496c" dep_name="Бухгалтерия" dep_code="П200">
<orgposition user_id="21448456-15b0-11dd-80a1-00145e3710ab" user_position_id="3c948267-df80-11dc-a4e8-0017311416a1" user_position="специалист" user_is_active="0"/>
<orgposition user_id="d299614a-df9d-11dc-a4e8-0017311416a1" user_position_id="53082fda-edf 4-11dd-af3e-00145e3710ab" user_position="заместитель главного бухгалтера" user_is_active="1"/>
<orgposition user_id="8132fe6c-0789-11dd-887b-001d60f0496c" user_position_id="d299614d-df9d-11dc-a4e8-0017311416a1" user_position="секретарь" user_is_active="1"/>
<orgposition user_id="2e81c20e-f190-11dc-a4fb-0017311416a1" user_position_id="2e81c20d-f190-11dc-a4fb-0017311416a1" user_position="бухгалтер" user_is_active="0"/>
<orgposition user_id="ba68bb7e-c377-11dc-a4ca-0017311416a1" user_position_id="53082fd9-edf 4-11dd-af3e-00145e3710ab" user_position="главный бухгалтер" user_is_active="1"/>
<orgposition user_id="9893f85a-0403-11df-a872-00215aa545b4" user_position_id="53073825-e5e6-11dc-a4ef-0017311416a1" user_position="делопроизводитель" user_is_active="1"/>
</department>
<department dep_id="6bb91f72-e077-11dd-bf56-00145e3710ab" dep_name="Отдел Продаж" dep_code="П300">
<department dep_id="6bb91f73-e077-11dd-bf56-00145e3710ab" dep_name="Клиентский сервис" dep_code="П310">
<orgposition user_id="02ad5122-e231-11dd-bf56-00145e3710ab" user_position_id="6bb91f6c-e077-11dd-bf56-00145e3710ab" user_position="Специалист" user_is_active="1"/>
</department>
<department dep_id="6bb91f74-e077-11dd-bf56-00145e3710ab" dep_name="Менеджеры" dep_code="П320">
<orgposition user_id="02584921-с235-11dd-bf56-00145e3710ab" user_position_id="7bb98f6c-e577-11dd-bf56-00145e3710ab" user_position="Менеджер" user_is_active="1"/>
</department>
</department>
</orgstructure>
Вот код:
Код 1C v 8.х Процедура ОбойтиУровеньДерева(Строки, Запись)
Для каждого Строка из Строки Цикл
Если ПустаяСтрока( Строка( Строка. Сотрудник) ) Тогда
Запись. ЗаписатьНачалоЭлемента( "department" ) ;
Запись. ЗаписатьАтрибут( "dep_id" , Строка( Строка. ПодразделениеОрганизации. УникальныйИдентификатор( ) ) ) ;
Запись. ЗаписатьАтрибут( "dep_name" , Строка( Строка. ПодразделениеОрганизации) ) ;
Запись. ЗаписатьАтрибут( "dep_code" , СокрЛП( Строка( Строка. ПодразделениеОрганизации. Код) ) ) ;
ОбойтиУровеньДерева( Строка. Строки, Запись) ;
Запись. ЗаписатьКонецЭлемента( ) ;
Иначе
Запись. ЗаписатьНачалоЭлемента( "orgposition" ) ;
Запись. ЗаписатьАтрибут( "user_id" , Строка( Строка. Сотрудник. УникальныйИдентификатор( ) ) ) ;
Запись. ЗаписатьАтрибут( "user_position_id" , Строка( Строка. Должность. УникальныйИдентификатор( ) ) ) ;
Запись. ЗаписатьАтрибут( "user_position" , Строка( Строка. Должность) ) ;
Запись. ЗаписатьАтрибут( "user_is_active" , ? ( Строка. ПричинаИзмененияСостояния = Перечисления. ПричиныИзмененияСостояния. Увольнение, "0" , "1" ) ) ;
ОбойтиУровеньДерева( Строка. Строки, Запись) ;
Запись. ЗаписатьКонецЭлемента( ) ;
КонецЕсли
КонецЦикла ;
КонецПроцедуры
Процедура КнопкаВыгрузитьНажатие(Кнопка)
ПутьКФайлу = "D:\Vigruzka_" + Формат( ТекущаяДата( ) , "ДФ=YYYYMMdd" ) + ".xml" ;
Запись = Новый ЗаписьXML;
Запись. ОткрытьФайл( ПутьКФайлу, "UTF-8" ) ;
Запись. ЗаписатьОбъявлениеXML( ) ;
Запись. ЗаписатьНачалоЭлемента( "orgstructure" ) ;
Запрос = Новый Запрос;
Запрос. Текст= "
|ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Сотрудник,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
| РаботникиОрганизацийСрезПоследних.Должность,
| РаботникиОрганизацийСрезПоследних.Период,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Порядок КАК ПодразделениеОрганизацииПорядок,
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&dateper, ) КАК РаботникиОрганизацийСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| ПодразделениеОрганизацииПорядок
|ИТОГИ ПО
| ПодразделениеОрганизации ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ
|" ;
Запрос. УстановитьПараметр( "dateper" , ТекущаяДата( ) ) ;
Результат = Запрос. Выполнить( ) ;
Дерево = Результат. Выгрузить( ОбходРезультатаЗапроса. ПоГруппировкамСИерархией) ;
ОбойтиУровеньДерева( Дерево. Строки, Запись) ;
Запись. ЗаписатьКонецЭлемента( ) ;
Запись. Закрыть( ) ;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Как получить путь к внешней обработке (отчету) из этой же обработки (отчета)? В 8-ых версиях используйте:
ИспользуемоеИмяФайла (UsedF ileName)
Использование:
Только чтение.
Описание:
Тип: Строка. Содержит полное имя файла внешней обработки.
Недоступно на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.
Код 1C v 8.х
Сообщить( ЭтотОбъект. ИспользуемоеИмяФайла) ;
Для 7-рки
РасположениеФайла(<?>,);
FilePath(<?>,);
Синтаксис:
Код 1C v 7.x РасположениеФайла( < Путь> , < Имя> )
Назначение:
Определить, где располагается данный внешний отчет.
Параметры:
<Путь> - идентификатор переменной, куда метод возвращает путь к файлу, где располагается данный внешний отчет.
<Имя> - идентификатор переменной, куда метод возвращает имя файла, где располагается данный внешний отчет.
Замечание:
Данный метод следует использовать только в модуле формы внешнего отчета.
Категория:
Отчеты Получения курса валют из Интернет Код 1C v 8.х Соединение = Новый HTTPСоединение( "export.rbc.ru" ) ;
ИмяФайла = ПолучитьИмяВременногоФайла( ".txt" ) ;
СтрокаСоединения= "/free/" + Источник+ "/free.fcgi?period=DAILY&tickers=" + Валюта1 + "&d1=" + День1 + "&m1=" + Месяц1 + "&y1=" + Год1 + "&d2=" + День2 + "&m2=" + Месяц2 + "&y2=" + Год2 + "&separator=%7C&data_format=BROWSER" ;
СтрокаСоединения= СтрЗаменить( СтрокаСоединения, " " , "" ) ;
Попытка
Соединение. Получить( СтрокаСоединения, ИмяФайла) ;
Исключение
Сообщить( "Невозможно получить курс по адресу http://export.rbc.ru" + СтрокаСоединения) ;
КонецПопытки ;
КурсыТекст= Новый ТекстовыйДокумент;
КурсыТекст. Прочитать( ИмяФайла) ;
Код 1C v 8.х
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект( "MSXML2.XMLHTTP" ) ;
соминет. open ( "GET" , Адресс, Ложь ) ;
соминет. send( ) ;
Возврат соминет. responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
Возврат Формат( Дат, "ДФ="" гггг/ММ/дд"" " ) ;
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
Для А = 1 по Список. Количество( ) цикл
Если Список[а- 1 ]. Пометка тогда
Сообщить( "Загружаем курсы для " + Строка( Список[а- 1 ]. Значение) ) ;
Код = Строка( Список[а- 1 ]. Значение. Код) ;
Дат = ПериодС;
Пока Дат < = ПериодПо цикл
Стр = ПолучитьКакСтроку( "http://cbrates.rbc.ru/tsv/" + Код+ "/" + ПреобразоватьДату( Дат) + ".tsv" ) ;
Поз = Найти( Стр, Символы. Таб) ;
Если Поз = 0 Тогда
Дат = Дат + 86400 ;
Продолжить;
КонецЕсли ;
Кратность = Число( СокрЛП( Лев( стр, Поз- 1 ) ) ) ;
курс = Число( СокрЛП( Сред( Стр, Поз+ 1 , СтрДлина( Стр) - Поз) ) ) ;
Сообщить( "Дата=" + Строка( Дат) + " Курс=" + Строка( курс) + " Кратность=" + Строка( Кратность) ) ;
Запись = РегистрыСведений. КурсыВалют. СоздатьМенеджерЗаписи( ) ;
Запись. Период = Дат;
Запись. Валюта = Список[а- 1 ]. Значение. Ссылка;
Запись. Курс = Курс;
Запись. Кратность = Кратность;
Запись. Записать( Истина ) ;
Дат = Дат + 86400 ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Код 1C v 7.x // Взято с http://www.1c-club.kz IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;
//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры
//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB.Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbscript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.SaveToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры
//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF 82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);
Категория:
COM-объекты, WMI, WSH