Как удалить строку или очистить дерево значений Помните, что при при удалении/очистке строки, все подчиненные строки удаляются.
Очистить дерево значений: Дерево.Строки.Очистить();
Код 1C v 8.2 УП &НаСервере
Процедура ОчиститьНаСервере()
тДерево = РеквизитФормыВЗначение( "Дерево" ) ;
тДерево. Строки. Очистить( ) ;
ЗначениеВРеквизитФормы( тДерево, "Дерево" ) ;
КонецПроцедуры
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее & нужно только знать ее индекс:
Код 1C v 8.2 УП &НаКлиенте
Процедура Удалить(Команда)
УдалитьНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура УдалитьНаСервере()
тДерево = РеквизитФормыВЗначение( "Дерево" ) ;
тДерево. Строки. Удалить( 0 ) ;
ЗначениеВРеквизитФормы( тДерево, "Дерево" ) ;
КонецПроцедуры
Категория:
Работа с Деревом Значений Преобразование ТаблицыЗначений во временную таблицу Код 1C v 8.х Процедура ПреобразоватьТЗвТЗсОписаниемТипов(ТЗ)
ТипизированнаяТЗ = Новый ТаблицаЗначений;
Для й= 1 По Тз. Количество( ) Цикл ТипизированнаяТЗ. Добавить( ) ;
КонецЦикла ;
ДЗТипов = Новый ДеревоЗначений;
ДЗТипов. Колонки. Добавить( "ИмяКолонки" ) ;
ДЗТипов. Колонки. Добавить( "ТипЗначений" ) ;
Для Каждого Колонка из Тз. Колонки Цикл
СтрокаКолонки = ДЗТипов. Строки. Добавить( ) ;
СтрокаКолонки. ИмяКолонки = Колонка. Имя;
ТекСТрокаТипа = СтрокаКолонки. Строки. Добавить( ) ;
ТекСТрокаТипа. ИмяКолонки = Колонка. Имя;
ТекСТрокаТипа. ТипЗначений = ТипЗнч( тз[0 ][Колонка. Имя]) ;
Для Каждого СтокаТЗ из Тз Цикл
ТекТип = ТипЗнч( СтокаТЗ[Колонка. Имя]) ;
Если НЕ ТекТип = ТекСТрокаТипа. ТипЗначений Тогда
Если СтрокаКолонки. Строки. Найти( ТекТип, "ТипЗначений" ) = Неопределено Тогда
ТекСТрокаТипа = СтрокаКолонки. Строки. Добавить( ) ;
ТекСТрокаТипа. ИмяКолонки = Колонка. Имя;
ТекСТрокаТипа. ТипЗначений = ТекТип;
КонецЕслИ ;
КонецЕслИ ;
КонецЦикла ;
МассивТипов = СтрокаКолонки. Строки. ВыгрузитьКолонку( "ТипЗначений" ) ;
ТипизированнаяТЗ. Колонки. Добавить( Колонка. Имя, Новый ОписаниеТипов( МассивТипов) , Колонка. Заголовок) ;
ТипизированнаяТЗ. ЗагрузитьКолонку( Тз. ВыгрузитьКолонку( Колонка) , Колонка. Имя) ;
КонецЦикла ;
КонецПроцедуры
Источник
Категория:
Запросы ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст= Неопределено Тогда
Если ТипЗнч( рВетка) < > Тип( "ДеревоЗначений" ) Тогда Возврат КонецЕсли ;
Если ТипЗнч( рПараметры) < > Тип( "Структура" ) Тогда рПараметры= Новый Структура КонецЕсли ;
стрКолонок= ? ( рПараметры. Свойство( "Колонки" ) , рПараметры. Колонки, Неопределено ) ;
Если ТипЗнч( стрКолонок) < > Тип( "Структура" ) Тогда стрКолонок= Новый Структура КонецЕсли ;
рПоказыватьУровни= ? ( рПараметры. Свойство( "ПоказыватьУровни" ) , рПараметры. ПоказыватьУровни, Ложь ) ;
рШагОтступа= ? ( рПараметры. Свойство( "ШагОтступа" ) , рПараметры. ШагОтступа, 2 ) ;
рДеревоДляТеста= рВетка;
рЗапись= Новый ЗаписьXML;
рЗапись. УстановитьСтроку( ) ;
СериализаторXDTO. ЗаписатьXML( рЗапись, рДеревоДляТеста) ;
стро= рЗапись. Закрыть( ) ;
стро= СтрЗаменить( стро, "xmlns=" , "xmlns:myns1C=" ) ;
рЧтение= Новый ЧтениеXML;
рЧтение. УстановитьСтроку( стро) ;
постр= Новый ПостроительDOM;
рДокументДОМ= постр. Прочитать( рЧтение) ;
рВыражение= "/ValueTree/row" ; максКолвоУровней= 1 ;
рРазыменователь= Новый РазыменовательПространствИменDOM( рДокументДОМ) ;
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
рРезультат= рДокументДОМ. ВычислитьВыражениеXPath( рВыражение, рДокументДОМ, рРазыменователь, ТипРезультатаDOMXPath. Любой) ;
Если рРезультат. ПолучитьСледующий( ) = Неопределено Тогда Прервать КонецЕсли ;
рВыражение= рВыражение+ "/row" ;
максКолвоУровней= максКолвоУровней+ 1 ;
КонецЦикла ;
максКолвоУровней= максКолвоУровней- 1 ;
строПробелы= " " ;
строРазделители= "===============================================================================================" ;
строОтступы= "___________________________________________________________________________________________" ;
секШапка1 = "|[_HCS" + Лев( строПробелы, максКолвоУровней* рШагОтступа) + "]|" ;
секГорРазделитель1 = "|" + Лев( строОтступы, максКолвоУровней* рШагОтступа+ 6 ) + "|" ;
рШиринаКолонкиИерархии= СтрДлина( секШапка1 ) - 2 ;
строПолейШапки= "#Поле _HCS
| #Выравнивание Центр" ;
строПолейЗаписи= "" ;
Если рПоказыватьУровни Тогда
секШапка1 = секШапка1 + "[_Level]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, 8 ) + "|" ;
строПолейШапки= строПолейШапки+ "
|#Поле _Level
| #Выравнивание Центр" ;
строПолейЗаписи= "#Поле _Level
| #Выравнивание Центр
| #Забивать Истина" ;
КонецЕсли ;
мИменКолонок= Новый Массив;
Для каждого кол Из рВетка. Колонки Цикл
Если стрКолонок. Количество( ) < > 0 и не стрКолонок. Свойство( кол. Имя) Тогда Продолжить КонецЕсли ;
рДлинаИмениКолонки= СтрДлина( кол. Имя) ;
рНужнаяШирина= Макс( ? ( кол. Ширина< 3 , 10 , кол. Ширина) , рДлинаИмениКолонки) ;
секШапка1 = секШапка1 + "[" + кол. Имя+ Лев( строПробелы, рНужнаяШирина- рДлинаИмениКолонки) + "]|" ;
секГорРазделитель1 = секГорРазделитель1 + Лев( строРазделители, рНужнаяШирина+ 1 ) + "=|" ;
строПолейШапки= строПолейШапки+ "
|#Поле " + кол. Имя+ "
| #Выравнивание Центр" ;
рОписТипов= кол. ТипЗначения;
Если рОписТипов. Типы( ) . Количество( ) = 1 и рОписТипов. СодержитТип( Тип( "Булево" ) ) Тогда
рВыравнивание= "Центр" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Число" ) ) Тогда
рВыравнивание= "Право" ;
ИначеЕсли рОписТипов. СодержитТип( Тип( "Строка" ) ) и рОписТипов. КвалификаторыСтроки. Длина= 0 Тогда
рВыравнивание= "ПоШирине" ;
Иначе
рВыравнивание= "Лево" ;
КонецЕсли ;
строПолейЗаписи= строПолейЗаписи+ ? ( ПустаяСтрока( строПолейЗаписи) , "" , Символы. ПС) + "#Поле " + кол. Имя+ "
| #Выравнивание " + рВыравнивание;
Попытка
Если ЗначениеЗаполнено( стрКолонок[кол. Имя]) Тогда
строПолейЗаписи= строПолейЗаписи+ "
| #Формат "" " + СокрЛП( стрКолонок[кол. Имя]) + """ " ;
КонецЕсли ;
Исключение
КонецПопытки ;
мИменКолонок. Добавить( кол. Имя) ;
КонецЦикла ;
секШапка2 = СтрЗаменить( СтрЗаменить( секШапка1 , "[" , "<" ) , "]" , ">" ) ;
секЗапись1 = секШапка1 ; секЗапись2 = секШапка2 ;
секГорРазделитель2 = СтрЗаменить( СтрЗаменить( секГорРазделитель1 , "=" , "-" ) , "|" , "+" ) ;
секГорРазделитель1 = СтрЗаменить( секГорРазделитель1 , "_" , "=" ) ;
секГорРазделитель2 = СтрЗаменить( секГорРазделитель2 , "_" , " " ) ;
тМакет= Новый ТекстовыйДокумент;
тМакет. ДобавитьСтроку( "#Область Шапка" ) ;
тМакет. ДобавитьСтроку( строПолейШапки) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( секШапка1 ) ;
тМакет. ДобавитьСтроку( секШапка2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель1 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
тМакет. ДобавитьСтроку( "" ) ;
тМакет. ДобавитьСтроку( "#Область Запись" ) ;
тМакет. ДобавитьСтроку( строПолейЗаписи) ;
тМакет. ДобавитьСтроку( секЗапись1 ) ;
тМакет. ДобавитьСтроку( секЗапись2 ) ;
тМакет. ДобавитьСтроку( секГорРазделитель2 ) ;
тМакет. ДобавитьСтроку( "#КонецОбласти" ) ;
рПараметры. Вставить( "ИсходныйМакет" , тМакет) ;
рТекст= Новый ТекстовыйДокумент;
сек= тМакет. ПолучитьОбласть( "Шапка" ) ;
сек. Параметры. _HCS= "Иерархия" ;
Для каждого имякол Из мИменКолонок Цикл
кол= рВетка. Колонки[имякол];
сек. Параметры[кол. Имя]= ? ( ПустаяСтрока( кол. Заголовок) , кол. Имя, кол. Заголовок) ;
КонецЦикла ;
рТекст. Вывести( сек) ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , тМакет. ПолучитьОбласть( "Запись" ) ) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "Отступ" , 0 ) ;
пар. Вставить( "ШагОтступа" , рШагОтступа) ;
ВывестиДеревоЗначенийВТекст( рВетка, рТекст, пар) ;
Иначе
мИменКолонок= рПараметры. МассивИмёнКолонок;
рСекция= рПараметры. ТекущаяСекция;
рОтступ= рПараметры. Отступ;
рШиринаКолонкиИерархии= рПараметры. ШиринаКолонкиИерархии;
рПоказыватьУровни= рПараметры. ПоказыватьУровни;
строОтступы= "_________________________________________________________________________________________________________" ;
строПробелы= " " ;
пар= Новый Структура;
пар. Вставить( "МассивИмёнКолонок" , мИменКолонок) ;
пар. Вставить( "ТекущаяСекция" , рПараметры. ТекущаяСекция) ;
пар. Вставить( "ШиринаКолонкиИерархии" , рШиринаКолонкиИерархии) ;
пар. Вставить( "ПоказыватьУровни" , рПоказыватьУровни) ;
пар. Вставить( "ШагОтступа" , рПараметры. ШагОтступа) ;
пар. Вставить( "Отступ" , рОтступ+ рПараметры. ШагОтступа) ;
Для каждого рПодветка Из рВетка. Строки Цикл
рСекция. Параметры. _HCS= Лев( строПробелы, рОтступ) + "\" + Лев( строОтступы, рШиринаКолонкиИерархии- рОтступ- 1 ) ;
Если рПоказыватьУровни Тогда
рСекция. Параметры. _Level= рПодветка. Уровень( ) ;
КонецЕсли ;
Для каждого имякол Из мИменКолонок Цикл
рСекция. Параметры[имякол]= рПодветка[имякол];
КонецЦикла ;
рТекст. Вывести( рСекция) ;
ВывестиДеревоЗначенийВТекст( рПодветка, рТекст, пар)
КонецЦикла ;
КонецЕсли ;
Исключение
Сообщить( "ВывестиДеревоЗначенийВТекст, ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
КонецПопытки ;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Как отобразить дерево значений на управляемой форме Создадим новую внешнюю обработку.
Добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
Код 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 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить(
Новый РеквизитФормы( Колонка. Имя, Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
КонецЦикла ;
КонецПроцедуры
Категория:
Работа с Деревом Значений Чтение данных с сайта в формате 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 Дерево значений в таблицу значений или в табличную часть и обратно Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранения данных дерева. И при открытии формы получать данные из ТЧ и выводить их в дерево. Далее все манипуляции производить с деревом и при сохранении документа помещать данные в обратно в ТЧ.
Поиск по интернету не дал нужного варианта, пришлось реализовавыть свой механизм, используя информацию которая была на просторах интернета.
Для реализации такого механизма в ТЧ был добавлен реквизит “КлючСвязи” (обязательный реквизит) с типом число, куда помещался “НомерСтроки” (стандартный реквизит ТЧ) родителя (верхний уровень). А самый верхний элемент дерева имеет “КлючСвязи” равный 0.
На картинке ниже видно структуру дерева и структуру ТЧ
Нагрузка на сервер осуществляется при окрытии и при сохранении документа. А с деревом работают уже на клиенте.
На рабочей базе обрабатывается около 200 строк в одном документе.
Открытие и сохранение документа происходит моментально. С большем количеством строк не тестировалось.
Чтобы алгорит правильно работал, у рекизита фомы с типом дерево значений должны быть все реквизиты табличной части, кроме “КлючСвязи” и “НомерСтроки”. Иначе платформа выдаст ошибку. В дерево можо добавлять свои реквизиты отличные от ТЧ, они будут использоваться только в дереве.
Ниже приведен код преобразования дерева в таблицу и обратно .
Код 1C v 8.2 УП &НаКлиенте
Процедура КомандаТаблицуВДерево(Команда)
КомандаТаблицуВДеревоНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура КомандаТаблицуВДеревоНаСервере()
Дерево = ТаблицаВДерево( РеквизитФормыВЗначение( "Объект" ) , "Товары" ) ;
ЗначениеВРеквизитФормы( Дерево, "ДеревоЗначений" ) ;
Элементы. ДеревоЗначений. Обновить( ) ;
КонецПроцедуры
&НаКлиенте
Процедура КомандаДеревоВТаблицу(Команда)
КомандаДеревоВТаблицуНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура КомандаДеревоВТаблицуНаСервере()
Объект. Товары. Очистить( ) ;
ДОбъект = РеквизитФормыВЗначение( "Объект" ) ;
ДеревоВТаблицу( ДОбъект, РеквизитФормыВЗначение( "ДеревоЗначений" ) , "Товары" ) ;
ЗначениеВРеквизитФормы( ДОбъект, "Объект" ) ;
КонецПроцедуры
Формирование дерева из таблицы значений
Код 1C v 8.2 УП
&НаСервере
Функция ТаблицаВДерево(ДокОбъект, НаименованиеТабличнойЧастиДокумента, КлючСвязи = NULL, ЭлементРодитель = NULL) Экспорт
КолонкиТаблицы = ДокОбъект. Метаданные( ) . ТабличныеЧасти[НаименованиеТабличнойЧастиДокумента]. Реквизиты;
ДеревоЗначений2 = Новый ДеревоЗначений;
Для каждого Кол из КолонкиТаблицы Цикл
Если Кол. Имя = "НомерСтроки" ИЛИ Кол. Имя = "КлючСвязи" Тогда
Продолжить;
Иначе
ДеревоЗначений2 . Колонки. Добавить( Кол. Имя, Новый ОписаниеТипов( Кол. Тип) ) ;
КонецЕсли ;
КонецЦикла ;
Если КлючСвязи = NULL И ЭлементРодитель = NULL Тогда
ИсточникВыборки = ДеревоЗначений2 . Строки;
КлючСвязи = 0 ;
Иначе
ИсточникВыборки = ЭлементРодитель. Строки;
КонецЕсли ;
Фильтр = Новый Структура( "КлючСвязи" , КлючСвязи) ;
М = ДокОбъект[НаименованиеТабличнойЧастиДокумента]. НайтиСтроки( Фильтр) ;
Если М. Количество( ) = 0 Тогда
Возврат ДеревоЗначений2 ;
КонецЕсли ;
Для каждого Стр из М Цикл
Элемент = ИсточникВыборки. Добавить( ) ;
Для каждого Кол из КолонкиТаблицы Цикл
Если Кол. Имя = "НомерСтроки" ИЛИ Кол. Имя = "КлючСвязи" Тогда
Продолжить;
Иначе
Элемент[Кол. Имя] = Стр[Кол. Имя];
КонецЕсли ;
КонецЦикла ;
ТаблицаВДерево( ДокОбъект, НаименованиеТабличнойЧастиДокумента, Стр. НомерСтроки, Элемент) ;
КонецЦикла ;
Возврат ДеревоЗначений2 ;
КонецФункции
Формирование таблицы из дерева
Код 1C v 8.2 УП
&НаСервере
Процедура ДеревоВТаблицу(ДокОбъект, ДеревоЗначений, НаименованиеТабличнойЧастиДокумента, СтрокаДерева = NULL, КлючСвязи = NULL) Экспорт
Если СтрокаДерева = NULL И КлючСвязи = NULL Тогда
ПервыйВызов = Истина ;
ДокОбъект[НаименованиеТабличнойЧастиДокумента]. Очистить( ) ;
ИсточникВыборки = ДеревоЗначений. Строки;
КлючСвязи = 0 ;
Иначе
ПервыйВызов = Ложь ;
ИсточникВыборки = СтрокаДерева. Строки;
КонецЕсли ;
Для каждого Стр из ИсточникВыборки Цикл
НС = ДокОбъект[НаименованиеТабличнойЧастиДокумента]. Добавить( ) ;
Для каждого Кол из ДокОбъект. Метаданные( ) . ТабличныеЧасти[НаименованиеТабличнойЧастиДокумента]. Реквизиты Цикл
Если Кол. Имя = "КлючСвязи" Тогда
НС. КлючСвязи = КлючСвязи
ИначеЕсли Кол. Имя = "НомерСтроки" Тогда
Продолжить;
Иначе
НС[Кол. Имя] = Стр[Кол. Имя];
КонецЕсли ;
КонецЦикла ;
Если НЕ Стр. Строки. Количество( ) = 0 Тогда
ДеревоВТаблицу( ДокОбъект, , НаименованиеТабличнойЧастиДокумента, Стр, НС. НомерСтроки) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Категория:
Работа с Деревом Значений Как результат СКД в виде Табличного Документа разобрать и вывести в Дерево Значений Процедура получает из СКД результат в виде Табличного документа, парсит его, создает в Дереве на форме колонки и заполняет дерево данными результата СКД
Смысл в том, что СКД не может вывести результат в объект на форму, если он Таблица - выдает ошибку "Не поддерживается вывод таблиц, диаграмм и вложенных отчетов в универсальную коллекцию значений".
Поэтому я выгружаю СКД в ТабличныйДокумент и вытаскиваю данные уже из него, далее строю и заполняю Дерево на форме
Код 1C v 8.х Процедура ЗаполнитьДерево()
ДеревоЗначений. Строки. Очистить( ) ;
КолРазмеров = 0 ;
СхемаКомпоновкиДанных = ПолучитьМакет( "Схема" ) ;
Настройки = СхемаКомпоновкиДанных. НастройкиПоУмолчанию;
Для Каждого ЭлементОтбора Из ПостроительОтчета. Отбор Цикл
Если Не ЭлементОтбора. Использование Тогда
Продолжить;
КонецЕсли ;
ВидСравненияВОтборе = мСоответствиеВидовСравнения. Получить( ЭлементОтбора. ВидСравнения) ;
Если ВидСравненияВОтборе = Неопределено Тогда
Продолжить;
КонецЕсли ;
Если Лев( ЭлементОтбора. ПутьКДанным, 8 ) = "Свойство" Тогда
ИмяПоля = "Номенклатура.[" + мСоответствиеНазначений[ЭлементОтбора. Представление]+ " (свойство)]" ;
ИначеЕсли Лев( ЭлементОтбора. ПутьКДанным, 9 ) = "Категория" Тогда
ИмяПоля = "Номенклатура.[" + мСоответствиеНазначений[ЭлементОтбора. Представление]+ " (категория)]" ;
Иначе
ИмяПоля = ЭлементОтбора. ПутьКДанным;
КонецЕсли ;
ПолеОтбора = Новый ПолеКомпоновкиДанных( ИмяПоля) ;
Отбор = Настройки. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
Отбор. ЛевоеЗначение = ПолеОтбора;
Отбор. Использование = Истина ;
Отбор. ВидСравнения = ВидСравненияВОтборе;
Отбор. ПравоеЗначение = ЭлементОтбора. Значение;
КонецЦикла ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета. Выполнить( СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки, , Тип( "ГенераторМакетаКомпоновкиДанных" ) ) ;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновки, , ДанныеРасшифровки) ;
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ТабличныйДокумент) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновкиДанных, Истина ) ;
КолДанных = 5 ;
СоздатьДерево( ТабличныйДокумент, КолДанных) ;
СтКол = Новый Структура;
СтКол. Вставить( "Ном" , 1 ) ;
СтКол. Вставить( "Дат1" , 2 ) ;
СтКол. Вставить( "Дат2" , 3 ) ;
СтКол. Вставить( "Прих" , 4 ) ;
СтКол. Вставить( "Реал" , 5 ) ;
СтКол. Вставить( "Возв" , 6 ) ;
СтКол. Вставить( "Остат" , 7 ) ;
СтКол. Вставить( "ВПути" , 8 ) ;
СтрНом = Неопределено ;
СтрДерева = Неопределено ;
Для i= 3 По ТабличныйДокумент. ВысотаТаблицы Цикл
ПерваяКолонка = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Ном) ;
Если ТипЗнч( ПерваяКолонка) = Тип( "СправочникСсылка.Номенклатура" ) Тогда
Если СтрНом Неопределено Тогда
СтрНом. Строки. Сортировать( "Продажи УБЫВ" ) ;
СтрНом. ОстатокМагазин = СтрНом. Строки. Итог( "ОстатокМагазин" ) ;
СтрНом. ОстатокСклад = СтрНом. Строки. Итог( "ОстатокСклад" ) ;
КонецЕсли ;
СтрНом = ДеревоЗначений. Строки. Добавить( ) ;
СтрДерева = СтрНом;
ИначеЕсли ТипЗнч( ПерваяКолонка) = Тип( "СправочникСсылка.Склады" ) Тогда
СтрДерева = СтрНом. Строки. Добавить( ) ;
Дат1 = Формат( ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Дат1 ) , "ДФ=dd.MM.yy" ) ;
Дат2 = Формат( ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Дат2 ) , "ДФ=dd.MM.yy" ) ;
СтрДерева. Период = "" + Дат1 + " - " + Дат2 ;
Иначе
Продолжить;
КонецЕсли ;
СтрДерева. Номенклатура = ПерваяКолонка;
СтрДерева. Остаток = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Остат, Истина ) ;
СтрДерева. Приход = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Прих, Истина ) ;
СтрДерева. Продажи = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Реал, Истина ) ;
СтрДерева. Возврат = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, СтКол. Возв, Истина ) ;
Если ЗначениеЗаполнено( СтрДерева. Родитель) Тогда
Если ПерваяКолонка. ТипСклада = Перечисления. ТипыСкладов. ТорговыйЗал Тогда СтрДерева. ОстатокМагазин = СтрДерева. Остаток;
Иначе СтрДерева. ОстатокСклад = СтрДерева. Остаток;
КонецЕсли ;
Попытка СтрДерева. ПроцентПродаж = СтрДерева. Продажи * 100 / СтрДерева. Родитель. Продажи;
Исключение СтрДерева. ПроцентПродаж = "-" ;
КонецПопытки ;
Иначе
СтрДерева. ПроцентПродаж = "100%" ;
КонецЕсли ;
Для j= 1 По КолРазмеров Цикл
СтрДерева["Ост" + j] = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, 3 + КолДанных * j + 4 , Истина ) ;
СтрДерева["Пут" + j] = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, i, 3 + КолДанных * j + 5 , Истина ) ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура СоздатьДерево(ТабличныйДокумент, КолДанных)
КЧ = Новый КвалификаторыЧисла( 10 , 0 ) ;
Массив = Новый Массив;
Массив. Добавить( Тип( "Число" ) ) ;
ОписаниеТиповЧ = Новый ОписаниеТипов( Массив, , , КЧ) ;
Ном = 3 + КолДанных + 1 ;
КолРазмеров = ( ТабличныйДокумент. ШиринаТаблицы - Ном- 1 ) / КолДанных + 1 ;
Для i= 1 По КолРазмеров Цикл
Размер = ПолучитьЗначениеРасшифровки( ТабличныйДокумент, 1 , Ном, Истина , Ложь ) ;
Ном = Ном + КолДанных;
Попытка
ДеревоЗначений. Колонки. Добавить( "Ост" + i, ОписаниеТиповЧ, Размер, 5 ) ;
ДеревоЗначений. Колонки. Добавить( "Пут" + i, ОписаниеТиповЧ, "Путь" , 5 ) ;
ДеревоЗначений. Колонки. Добавить( "Пер" + i, ОписаниеТиповЧ, "Пер" , 5 ) ;
Исключение
КонецПопытки ;
КонецЦикла ;
ЭтаФорма. ЭлементыФормы. ДеревоЗначений. Значение = ДеревоЗначений;
ЭтаФорма. ЭлементыФормы. ДеревоЗначений. СоздатьКолонки( ) ;
i= 1 ; НомерРазмера= 1 ;
Для Каждого Кол Из ЭтаФорма. ЭлементыФормы. ДеревоЗначений. Колонки Цикл
Кол. ТолькоПросмотр = Истина ;
Если i = ( НомерРазмера + 8 + 1 ) Тогда
Кол. Положение = ПоложениеКолонки. НоваяКолонка;
ИначеЕсли i = ( НомерРазмера + 8 + 2 ) Тогда
Кол. Положение = ПоложениеКолонки. НаСледующейСтроке;
ИначеЕсли i = ( НомерРазмера + 8 + 3 ) Тогда
Кол. Положение = ПоложениеКолонки. ВТойЖеКолонке;
Кол. ТолькоПросмотр = Ложь ;
НомерРазмера = НомерРазмера + 3 ;
КонецЕсли ;
Если i= 1 Тогда
Кол. Ширина = 20 ;
Иначе
Если i= 2 Тогда Кол. Ширина = 11 ;
ИначеЕсли i9 Тогда Кол. Ширина = 7 ;
Иначе Кол. Ширина = 5 ;
КонецЕсли ;
Кол. ИзменениеРазмера = ИзменениеРазмераКолонки. НеИзменять;
КонецЕсли ;
i= i+ 1 ;
КонецЦикла ;
КонецПроцедуры
Автор:
Абазин Антон Категория:
Схема Компоновки Данных Парсер XML в дерево значений Код 1C v 8.2 УП
&НаСервере
Функция ЧтениеXMLВДерево(Путь)
Дерево = Новый ДеревоЗначений;
Дерево. Колонки. Добавить( "Имя" ) ;
Дерево. Колонки. Добавить( "Значение" ) ;
XMLФайл = Новый ЧтениеXML;
XMLФайл. ОткрытьФайл( Путь) ;
ПрочитатьXMLПоТегам( XMLФайл, Дерево. Строки) ;
XMLФайл. Закрыть( ) ;
Возврат Дерево;
КонецФункции
&НаСервереБезКонтекста
Процедура ПрочитатьXMLПоТегам(XMLФайл, ТекущийНаборСтрок)
Пока XMLФайл. Прочитать( ) Цикл
Если XMLФайл. ТипУзла = ТипУзлаXML. НачалоЭлемента Тогда
НоваяСтрока = ТекущийНаборСтрок. Добавить( ) ;
НоваяСтрока. Имя = XMLФайл. Имя;
НоваяСтрока. Значение = "" ;
Пока XMLФайл. ПрочитатьАтрибут( ) Цикл
НоваяСтрокаАтрибут = НоваяСтрока. Строки. Добавить( ) ;
НоваяСтрокаАтрибут. Имя = XMLФайл. Имя;
НоваяСтрокаАтрибут. Значение = СокрЛП( XMLФайл. Значение) ;
КонецЦикла ;
ПрочитатьXMLПоТегам( XMLФайл, НоваяСтрока. Строки) ;
ИначеЕсли XMLФайл. ТипУзла = ТипУзлаXML. КонецЭлемента Тогда
Возврат ;
ИначеЕсли XMLФайл. ТипУзла = ТипУзлаXML. Текст Тогда
ТекущийНаборСтрок. Родитель. Значение = СокрЛП( XMLФайл. Значение) ;
Иначе
Сообщить( "Тип узла: " + XMLФайл. ТипУзла + " НЕ ОБРАБОТАН" , СтатусСообщения. Важное) ;
Конецесли ;
КонецЦикла ;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Работа с форматом JSON в 1С При обмене данными с веб-сайтами зачастую используется формат JSON. К сожалению, в 1С нет стандартных процедур для работы с данным форматом. В процессе реализации одного из проектов мной был разработан ряд процедур и функций облегчающих жизнь программисту 1С при работе с данными в формате JSON.
По сути, при работе с JSON требуется две операции: сформировать строку JSON (например, для передачи параметров на веб-сервер в формате JSON из 1С) и прочитать данные из строки JSON (например, когда мы получаем ответ от веб-сервера в формат JSON). Так как формат JSON в упрощенном виде представляет собой набор параметров в виде <ИмяПараметра>:<ЗначениеПараметра> то для работы с JSON в 1С мной был использован тип "Структура". Т.е. процедура чтения данных из формата JSON преобразует строку JSON в тип 1С "Структура". Так же и строка JSON в 1С формируется из структуры. Т.о. чтобы сформировать строку JSON сначала необходимо заполнить структуру необходимыми значениями, а потом вызвать функцию, преобразующую структуру в JSON. Позднее функционал функции формирования строки JSON был расширен - теперь в JSON может быть преобразован массив и таблица значений. При желании можно доработать функцию так, чтобы она "понимала" и другие типы. Такие как "Cоответствие", "ДеревоЗначений" и др. На практике это редко может пригодиться, поэтому сам я этого делать не стал.
А теперь подробней о том, как работать с функциями преобразования JSON.
Преобразование строки JSON в структуру 1С.
Для преобразования строки JSON в структуру 1С служит функция ЗаполнитьСтруктуруИзJSON().
Код 1C v 8.х Функция ЗаполнитьСтруктуруИзJSON(<ТекстJON>)
<ТекстJSON> (обязательный) - строка в формате JSON,
которую необходимо преобразовать в структуру.
Возвращаемое значение.
Тип Структура.
Имя значения задается в структуре как Ключ, а само значение, соответственно, как значение. Поддерживаются также вложенные значение ("{}" в "{}") и массивы. В таких случаях тип значения будет Структура и Массив соответственно. Если у в JSON задан только массив, то сформируется структура с одним элементом с ключом "Значение" и типом "Массив". Ниже приведены поясняющие примеры:
Код 1C v 8.х СтрокаJSON = "{"" server"" :"" 10234"" ,"" user"" :"" 3745"" ,"" hash"" :"" 8263ad83ce"" }" ;
Результат = ЗаполнитьСтруктуруИзJSON( СтрокаJSON) ;
Сообщить( "server:" + Результат. server + "
|user:" + Результат. user + "
|hash:" + Результат. hash) ;
СтрокаJSON = "{"" server"" :"" 10234"" ,"" users"" :["" 3745"" ,"" 7462"" ,"" 2374"" ],"" hash"" :"" 8263ad83ce"" }" ;
Результат = ЗаполнитьСтруктуруИзJSON( СтрокаJSON) ;
Сообщить( "server:" + Результат. server + "
|hash:" + Результат. hash) ;
для каждого user ИЗ Результат. users Цикл
Сообщить( "user: " + user) ;
КонецЦикла ;
СтрокаJSON = "{"" server"" :"" 10234"" ,"" users"" :[{"" id"" :"" 3745"" ,"" name"" :"" Jack"" },{"" id"" :"" 7462"" ,"" name"" :"" Nick"" }>" ;
Результат = ЗаполнитьСтруктуруИзJSON( СтрокаJSON) ;
Сообщить( "server:" + Результат. server) ;
для каждого user Из Результат. users Цикл
Сообщить( "user id: " + user. id +
", user name: " + user. name) ;
КонецЦикла ;
СтрокаJSON = "["" Nissan"" ,"" Ford"" ,"" Audi"" ]" ;
Результат = ЗаполнитьСтруктуруИзJSON( СтрокаJSON) ;
для каждого Авто Из Результат. Значение Цикл
Сообщить( Авто) ;
КонецЦикла ;
Следует заметить, что все значения заполняются как строковые (тип "Строка"). Последующее преобразование (например, к числу) лежит на самом разработчике.
Формирование строки JSON в 1С.
Для формирования строки в формате JSON в 1С предназначена функция СформироватьСтрокуJSON().
Код 1C v 8.х Функция СформироватьСтрокуJSON(<Объект>)
<Объект> (обязательный) - объект, который необходимо
преобразовать в формат JSON. Может иметь тип "Структура",
"Массив" или "ТаблицаЗначений".
Если Объект имеет тип "ТаблицаЗначений", то она рассматривается как массив из структур, соответствующих колонкам ТЗ. Все значения приводятся к строковому типу, дата приводится в формат unixtime, значение типа булево "Истина" преобразуется в строку "true", а "Ложь" - в "false, прочие объекты просто преобразуются как "Строка(Объект)".
Ниже приведены поясняющие примеры.
Код 1C v 8.х
Данные = Новый Структура( "server,user,hash" ,
10234 , 3745 , "8263ad83ce" ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Массив;
Данные. Добавить( "Nissan" ) ;
Данные. Добавить( "Ford" ) ;
Данные. Добавить( "Audi" ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Структура;
Данные. Добавить( "server" , 10234 ) ;
Данные. Добавить( "users" , Новый Массив) ;
Данные. Добавить( "hash" , "8263ad83ce" ) ;
Данные. users. Добавить( 3745 ) ;
Данные. users. Добавить( 7462 ) ;
Данные. users. Добавить( 2374 ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Данные = Новый Структура;
Данные. Вставить( "server" , 10234 ) ;
Данные. Вставить( "users" , Новый Массив) ;
Данные. users. Добавить( Новый Структура( "id,name" , 3745 , "Jack" ) ) ;
Данные. users. Добавить( Новый Структура( "id,name" , 7246 , "Nick" ) ) ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
ТаблПользователей = Новый ТаблицаЗначений;
ТаблПользователей. Колонки. Добавить( "id" ) ;
ТаблПользователей. Колонки. Добавить( "name" ) ;
НоваяСтрока = ТаблПользователей. Добавить( ) ;
НоваяСтрока. id = 3276 ;
НоваяСтрока. name = "Jack" ;
НоваяСтрока = ТаблПользователей. Добавить( ) ;
НоваяСтрока. id = 3276 ;
НоваяСтрока. name = "Nick" ;
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры( Данные) ;
Автор:
Павел Толкачев Категория:
Работа с Интернет, Почтой (Mail), FTP Программное использование универсальной обработки Выгрузка Загрузка Данных XML Для работы, необходимо взять
обработку "ВыгрузкаЗагрузкаДанныхXML" , которая находится в шаблоне "Конвертация данных".
Пример обработки(автор Misha Macklaud):
Скачивать файлы может только зарегистрированный пользователь!
а это ее код:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ОбработкаОбмен = Обработки. ВыгрузкаЗагрузкаДанныхXML. Создать( ) ;
ОбработкаОбмен. Инициализация( ) ;
ОбработкаОбмен. ОбработанныхКонстант = 0 ;
ОбработкаОбмен. ОбработанныхНаборовЗаписей = 0 ;
СписокОбъектовВыгрузки = Новый СписокЗначений;
СписокОбъектовВыгрузки. Добавить( Метаданные. Документы. РеализацияТоваровУслуг) ;
СписокОбъектовВыгрузки. Добавить( Метаданные. Документы. ПоступлениеТоваровУслуг) ;
СписокОбъектовВыгрузки. Добавить( Метаданные. Документы. ТребованиеНакладная) ;
Для й= 0 По СписокОбъектовВыгрузки. Количество( ) - 1 Цикл
СтрокаВыгрузки = ОбработкаОбмен. ДеревоМетаданных. Строки. Найти( СписокОбъектовВыгрузки[й]. Значение, "ОбъектМД" , Истина ) ;
СтрокаВыгрузки. Выгружать= 1 ;
ОбработкаОбмен. ОбработкаИзмененияСостоянияВыгружать( СтрокаВыгрузки) ;
Построитель = ОбработкаОбмен. ПодготовитьПостроительДляВыгрузки( СтрокаВыгрузки) ;
СписокСсылокВыгрузки = Новый СписокЗначений;
Для Каждого СтрокаТабДокументы Из ТабДокументы Цикл
Если ( СтрокаТабДокументы. Документ. Метаданные( ) = СписокОбъектовВыгрузки[й]. Значение) И ( СтрокаТабДокументы. ФлагВыгружать) Тогда
СписокСсылокВыгрузки. Добавить( СтрокаТабДокументы. Документ. Ссылка) ;
КонецЕсли ;
КонецЦикла ;
Отбор = Построитель. Отбор;
Отбор. Добавить( "Ссылка" , "Ссылка" ) ;
Отбор[0 ]. Использование = Истина ;
Отбор[0 ]. ВидСравнения = ВидСравнения. ВСписке;
Отбор[0 ]. Значение = СписокСсылокВыгрузки;
СтрокаВыгрузки. НастройкиПостроителя = Построитель. ПолучитьНастройки( ) ;
СтрокаВыгрузки. ИспользоватьОтбор = Истина ;
КонецЦикла ;
СписокОбъектовВыгрузки. Очистить( ) ;
Для й= 0 По СписокОбъектовВыгрузки. Количество( ) - 1 Цикл
СтрокаВыгрузки = ОбработкаОбмен. ДеревоМетаданных. Строки. Найти( СписокОбъектовВыгрузки[й]. Значение, "ОбъектМД" , Истина ) ;
СтрокаВыгрузки. ВыгружатьПриНеобходимости = 0 ;
ОбработкаОбмен. ОбработкаИзмененияСостоянияВыгружать( СтрокаВыгрузки) ;
КонецЦикла ;
СписокОбъектовВыгрузки. Очистить( ) ;
СписокОбъектовВыгрузки. Добавить( Метаданные. Справочники. Номенклатура) ;
Для й= 0 По СписокОбъектовВыгрузки. Количество( ) - 1 Цикл
СтрокаВыгрузки = ОбработкаОбмен. ДеревоМетаданных. Строки. Найти( СписокОбъектовВыгрузки[й]. Значение, "ОбъектМД" , Истина ) ;
СтрокаВыгрузки. Выгружать= 1 ;
ОбработкаОбмен. ОбработкаИзмененияСостоянияВыгружать( СтрокаВыгрузки) ;
КонецЦикла ;
ИмяФайлаЗагрузки = "D:\А-Б.xml" ;
ОбработкаОбмен. ВыполнитьЗагрузку( ИмяФайлаЗагрузки) ;
ИмяФайлаВыгрузки = "D:\Б-А.xml" ;
ОбработкаОбмен. ВыполнитьВыгрузку( ИмяФайлаВыгрузки) ;
КонецПроцедуры
Процедура ВыбПериодНажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода. РедактироватьКакИнтервал = Истина ;
НастройкаПериода. РедактироватьКакПериод = Истина ;
НастройкаПериода. ВариантНастройки = ВариантНастройкиПериода. Период;
НастройкаПериода. УстановитьПериод( НачПериода, ? ( КонПериода= '0001 - 01 - 01 ', КонПериода, КонецДня( КонПериода) ) ) ;
Если НастройкаПериода. Редактировать( ) Тогда
НачПериода = НастройкаПериода. ПолучитьДатуНачала( ) ;
КонПериода = НастройкаПериода. ПолучитьДатуОкончания( ) ;
КонецЕсли ;
КонецПроцедуры
Процедура ПриОткрытии()
НачПериода = ТекущаяДата( ) ;
КонПериода = ТекущаяДата( ) ;
КонецПроцедуры
Процедура ЗаполнитьТабЧастьОбъектом(Запрос,ОбъектЗапроса,ТЗ)
Запрос. Текст = "ВЫБРАТЬ
| ОбъектЗапроса.Ссылка
|ИЗ
| Документ." + ОбъектЗапроса+ " КАК ОбъектЗапроса
|ГДЕ
| ОбъектЗапроса.ПометкаУдаления = ЛОЖЬ И
| ОбъектЗапроса.Дата МЕЖДУ &ДатаНач И &ДатаКон" ;
Запрос. УстановитьПараметр( "ДатаНач" , НачалоДня( НачПериода) ) ;
Запрос. УстановитьПараметр( "ДатаКон" , КонецДня( КонПериода) ) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Пока Выборка. Следующий( ) Цикл
НоваяСтрока = ТЗ. Добавить( ) ;
НоваяСтрока. Дата = Выборка. Ссылка. Дата;
НоваяСтрока. Документ = Выборка. Ссылка;
КонецЦикла ;
КонецПроцедуры
Процедура ЗаполнитьНажатие(Элемент)
ТабДокументы. Очистить( ) ;
ТЗ = Новый ТаблицаЗначений;
ТЗ. Колонки. Добавить( "Дата" ) ;
ТЗ. Колонки. Добавить( "Документ" ) ;
Запрос = Новый Запрос;
Если флРеализация Тогда
ОбъектЗапроса = "РеализацияТоваровУслуг" ;
ЗаполнитьТабЧастьОбъектом( Запрос, ОбъектЗапроса, ТЗ) ;
КонецЕсли ;
Если флПоступление Тогда
ОбъектЗапроса = "ПоступлениеТоваровУслуг" ;
ЗаполнитьТабЧастьОбъектом( Запрос, ОбъектЗапроса, ТЗ) ;
КонецЕсли ;
Если флТребованиеНакладная Тогда
ОбъектЗапроса = "ТребованиеНакладная" ;
ЗаполнитьТабЧастьОбъектом( Запрос, ОбъектЗапроса, ТЗ) ;
КонецЕсли ;
ТЗ. Сортировать( "Дата" ) ;
Для Каждого Стр Из ТЗ Цикл
НоваяСтрока = ТабДокументы. Добавить( ) ;
НоваяСтрока. Документ = Стр. Документ;
НоваяСтрока. ФлагВыгружать = Истина ;
КонецЦикла ;
КонецПроцедуры
Категория:
Конвертация данных, Обмен, Перенос Примеры работы с Деревом значений в УП Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в
платформе 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 ) ;
ЭлементКоллекции = Родитель;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
ПодчинЭлементы = ЭлементКоллекции. ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
ТекЭлемент. Пометка = ЗначениеПометки;
УстановкаФлажков( ТекЭлемент, ТекЭлемент. Пометка) ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
СоседниеЭлементы =
ЭлементКоллекции. ПолучитьРодителя( ) . ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
Если ТекЭлемент. Пометка < > ЭлементКоллекции. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Источник Категория:
Работа с Деревом Значений Выгрузка табличного документа в Google таблицу Надумал когда-то задачу себе: выгрузить содержимое табличного документа в
Google Document . Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.
Последовательность выгрузки документа такова: сначала получаем список таблиц, которые есть у пользователя в системе Google Document. Затем после определения таблицы выгрузки пользователю предлагаем выбрать лист, в который будет выгружаться содержимое. Во время выбора всех этих параметров так же предоставляется возможность создания новых элементов (таблиц, листов). Уже после определения листа выгрузки обходим все ячейки документа и их содержимое переносим в таблицу на соответствующее место. Вопрос сохранения форматирования табличного документа в данной задаче не рассматривался.
Для написания функционала использовалась информация про
google document API . Для того чтобы получить доступ к данным необходимо чтобы 1с сначала прошла аутентификацию. Про аутентификацию приложений можно почитать в соответствующем документе. Для того чтобы пройти аутентификацию мы должны сначала получить маркер, затем этот маркер прописывать каждый раз при обращении к серверу.
Функция получения маркера следующая:
Код 1C v 8.х Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли ;
АдресКлиентЛогин = "https://www.google.com/accounts/ClientLogin" ;
Если ВидСервиса = "Таблица" Тогда
Сервис = "wise" ;
ИначеЕсли ВидСервиса = "Документ" Тогда
Сервис = "writely" ;
КонецЕсли ;
Попытка
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "POST" , АдресКлиентЛогин, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" ) ;
ХМЛХТТП. Send( "Email=" + ПараметрыПользователя. Логин + "&Passwd=" + ПараметрыПользователя. Пароль + "&service=" + Сервис + "&source=Gulp-CalGulp-1.05" ) ;
Исключение
Сообщить( "Ошибка:" + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
Если ХМЛХТТП. Status = 200 Тогда
Маркер = ХМЛХТТП. ResponseText;
Маркер = Прав( Маркер, СтрДлина( Маркер) - СтрДлина( "Auth=" ) - Найти( Маркер, "Auth=" ) + 1 ) ;
Возврат Маркер;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Функция получения маркера в качестве входного параметра получает вид службы, для которой будет проходить аутентификация. Это очень важный момент. Например, полученный маркер для Календаря не даст возможности работать с документами.
Для получения списка таблиц отправляется GET запрос по адресу «https://spreadsheets.google.com/feeds/spreadsheets/private/full». В запросе параметр «Authorization» определяется значением полученного маркера аутентификации. В результате выполнения запроса в ResponseText мы получаем xml, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ПолучитьСписокТаблиц(Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя( ) ;
Если ПараметрыПользователя = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Маркер = ПолучитьМаркер( "Таблица" ) ;
Если Маркер = Неопределено Тогда
Возврат Ложь ;
КонецЕсли ;
Адрес = "https://spreadsheets.google.com/feeds/spreadsheets/private/full" ;
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "GET" , Адрес, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/atom+xml" ) ;
ХМЛХТТП. SetRequestHeader( "Authorization" , "GoogleLogin auth=" + Маркер) ;
ХМЛХТТП. Send( Null ) ;
Если ХМЛХТТП. Status = 200 Тогда
ОтветСервера = ХМЛХТТП. ResponseText;
ДеревоXML = ПрочитатьResponseTextXML( ОтветСервера) ;
СписокТаблиц = Новый СписокЗначений;
ТаблицаСсылка = "" ;
НазваниеТаблицы = "" ;
Для Каждого Строка Из ДеревоXML. Строки[0 ]. Строки Цикл
Если Строка. ИмяXMLЭлементаДанных = "entry" Тогда
Для Каждого ТекАтрибут Из Строка. Строки Цикл
Если ТекАтрибут. ИмяXMLЭлементаДанных = "link" Тогда
ТекРел = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "rel" ) ;
Если ТекРел. представление = "http://schemas.google.com/spreadsheets/2006#worksheetsfeed" Тогда
ТекСсылка = ТекАтрибут. СписокАтрибутов. НайтиПоЗначению( "href" ) ;
ТаблицаСсылка = ТекСсылка. Представление;
ТаблицаСсылка = СтрЗаменить( ТаблицаСсылка, "https://" , "http://" ) ;
КонецЕсли ;
КонецЕсли ;
Если ТекАтрибут. ИмяXMLЭлементаДанных = "title" Тогда
НазваниеТаблицы = ТекАтрибут. ЗначениеXMLЭлементаДанных;
КонецЕсли ;
КонецЦикла ;
Если ЗначениеЗаполнено( ТаблицаСсылка) И ЗначениеЗаполнено( НазваниеТаблицы) Тогда
СписокТаблиц. Добавить( ТаблицаСсылка, НазваниеТаблицы) ;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
Возврат СписокТаблиц;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Неопределено ;
КонецЕсли ;
КонецФункции
Теперь остановимся на самой выгрузке значения в ячейку google таблицы. Для определения значения в ячейке выполняется POST запрос по адресу листа таблицы, который пользователь определил до этого. Успешность выполнения обновления контролируется по значению Status, в случае удачного обновления он должен быть равен 201. Функция обновления значения ячейки на листе Google таблицы имеет следующий вид:
Код 1C v 8.х &НаСервере
Функция ОбновитьЯчейкуЛистаГугл(Маркер,ИДЛиста,Строка,Колонка,Значение)
ТекстСоздания = "
| " + ИДЛиста + "/R" + Строка( Строка) + "C" + Строка( Колонка) + "
| + ИДЛиста + " / R"+ Строка(Строка) + " C" + Строка(Колонка)+"" " / >
| + Строка(Строка) + "" " col="" " + Строка(Колонка)+ "" " inputValue="" " + Значение+"" "/>
| ";
ХМЛХТТП = ПолучитьCOMОбъект( "" , "Microsoft.XMLHTTP" ) ;
ХМЛХТТП. Open( "POST" , ИДЛиста, Ложь ) ;
ХМЛХТТП. SetRequestHeader( "Content-Type" , "application/atom+xml;type=feed" ) ;
ХМЛХТТП. SetRequestHeader( "X-If-No-Redirect" , "true" ) ;
ХМЛХТТП. SetRequestHeader( "Authorization" , "GoogleLogin auth=" + Маркер) ;
ХМЛХТТП. Send( ТекстСоздания) ;
Если ХМЛХТТП. Status = 201 Тогда
Возврат Истина ;
Иначе
Сообщить( "Ошибка:" + ХМЛХТТП. Status + "-" + ХМЛХТТП. ResponseText) ;
Возврат Ложь ;
КонецЕсли ;
КонецФункции
Источник Категория:
Табличный документ Табличное поле ~ Почему не отображается ДеревоЗначений? На форме имеется ТабличноеПоле с типом ДеревоЗначений и установленным свойством Дерево. Почему не отображается ДеревоЗначений?
Необходимо кроме этого, для одной из колонок установить свойство ОтображатьИерархию.
Как вывести в справочник в виде дерева значений Категория:
Работа с Формой (Диалог) и её элементами Табличное поле ~ Как реализовать в дереве значений флажок с тремя состояниями? 8.2 УП
Необходимо реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме 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 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( Колонка. Имя,
Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
Если НЕ Колонка. Имя = "Пометка" Тогда
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
Иначе
НовыйЭлемент. Вид = ВидПоляФормы. ПолеФлажка;
НовыйЭлемент. ТриСостояния = Истина ;
НовыйЭлемент. УстановитьДействие( "ПриИзменении" ,
"ФлажокПриИзменении" ) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
ИДТекущейСтроки = Элементы["Дерево" ]. ТекущаяСтрока;
Если ИДТекущейСтроки < > Неопределено Тогда
ЭлементКоллекции = ЭтаФорма["Дерево" ]. НайтиПоИдентификатору(
ИДТекущейСтроки) ;
Если ЭлементКоллекции. Пометка = 2 Тогда
ЭлементКоллекции. Пометка = 0 ;
КонецЕсли ;
УстановкаФлажков( ЭлементКоллекции, ЭлементКоллекции. Пометка) ;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
Пока Родитель < > Неопределено Цикл
Родитель. Пометка = ? ( УстановленноДляВсех( ЭлементКоллекции) ,
ЭлементКоллекции. Пометка, 2 ) ;
ЭлементКоллекции = Родитель;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
ПодчинЭлементы = ЭлементКоллекции. ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
ТекЭлемент. Пометка = ЗначениеПометки;
УстановкаФлажков( ТекЭлемент, ТекЭлемент. Пометка) ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
СоседниеЭлементы =
ЭлементКоллекции. ПолучитьРодителя( ) . ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
Если ТекЭлемент. Пометка < > ЭлементКоллекции. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
8.х
На форме имеется табличное поле, источником данных для которого является дерево значений. В одной из колонок расположен элемент управления «Флажок». Необходимо что бы он мог принимать три состояния «Включен», «Выключен» и «Неопределено». При этом состояние «Неопределено» или так называемый «серый флажок», т.е. выбранный частично, устанавливается в том случае, если не у всех подчиненных строк состояние флажка одинаковое. Так же если строка имеет подчиненные строки, то при изменении её флажка, соответствующим образом должны изменяться флажки и всех подчиненных строк.
Во-первых, добавим нашу колонку с флажком в дерево значений:
Код 1C v 8.х Дерево. Колонки. Добавить( "Пометка" , Новый ОписаниеТипов( "Число" ) ) ;
ЭлементыФормы. Дерево. СоздатьКолонки( ) ;
КолонкиДерева= ЭлементыФормы. Дерево. Колонки;
КолонкиДерева. Пометка. ДанныеФлажка= "Пометка" ;
КолонкиДерева. Пометка. УстановитьЭлементУправления( Тип( "Флажок" ) ) ;
КолонкиДерева. Пометка. РежимРедактирования= РежимРедактированияКолонки. Непосредственно;
КолонкиДерева. Пометка. ТриСостоянияФлажка= Истина ;
Во-вторых, при изменении флажка нужно устанавливать соответствующие значения в подчиненных строках и контролировать значение флажка в «строке-родителе»:
Код 1C v 8.х Процедура ДеревоПриИзмененииФлажка(Элемент, Колонка)
ТекущаяСтрока= Элемент. ТекущаяСтрока;
Если ТекущаяСтрока. Пометка= 2 Тогда
ТекущаяСтрока. Пометка= 0 ;
КонецЕсли ;
УстановкаФлажков( ТекущаяСтрока, ТекущаяСтрока. Пометка) ;
Пока ТекущаяСтрока. Родитель< > Неопределено Цикл
ТекущаяСтрока. Родитель. Пометка= ? ( УстановленноДляВсех( ТекущаяСтрока) , ТекущаяСтрока. Пометка, 2 ) ;
ТекущаяСтрока= ТекущаяСтрока. Родитель;
КонецЦикла ;
КонецПроцедуры
Здесь процедура УстановкаФлажков() рекурсивно устанавливает флажки в подчиненных строках:
Код 1C v 8.х Процедура УстановкаФлажков(ТекущаяСтрока,Значение)
Для Каждого Стр Из ТекущаяСтрока. Строки Цикл
Стр. Пометка= Значение;
УстановкаФлажков( Стр, Стр. Пометка) ;
КонецЦикла ;
КонецПроцедуры
А функция УстановленноДляВсех() проверяет установлено ли одинаковое значение для всех строк на текущем уровне:
Код 1C v 8.х Функция УстановленноДляВсех(Строка)
Для Каждого Стр Из Строка. Родитель. Строки Цикл
Если Стр. Пометка< > Строка. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Преобразование дерева значений в таблицу значений и обратно Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно.
Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее в табличных частях документа, а также в интерактивной обработке данных в виде дерева.
Отсюда появился небольшой модуль для расширения возможности работы с деревом значений, хотя и с некоторыми оговорками.
Основной идеей является использование двух ключевых реквизитов/колонок КлючСтроки и КлючСвязи.
Однако они не всегда необходимы. Код, на мой взгляд достаточно "высушен".
Код 1C v 8.х
Функция ПолучитьНовыйКлючСтрокиДерева(Дерево, СписокКлючей = Неопределено) Экспорт
Если СписокКлючей = Неопределено Тогда
СписокКлючей = Новый СписокЗначений;
СписокКлючей. Добавить( 0 ) ;
КонецЕсли ;
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
СписокКлючей. Добавить( СтрокаДерева. КлючСтроки) ;
ПолучитьНовыйКлючСтрокиДерева( СтрокаДерева, СписокКлючей) ;
СписокКлючей. СортироватьПоЗначению( НаправлениеСортировки. Убыв) ;
МаксКлюч = СписокКлючей[0 ]. Значение + 1 ;
КонецЦикла ;
Возврат МаксКлюч;
КонецФункции
Процедура ОбновитьКлючиСвязиВДеревеЗначений(Дерево) Экспорт
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
Попытка
СтрокаДерева. КлючСвязи = СтрокаДерева. Родитель. КлючСтроки;
Исключение
СтрокаДерева. КлючСвязи = 0 ;
КонецПопытки ;
ОбновитьКлючиСвязиВДеревеЗначений( СтрокаДерева) ;
КонецЦикла ;
КонецПроцедуры
Процедура ОбновитьКлючиСтрокВДеревеЗначений(Дерево, КлючСтроки = 1) Экспорт
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
СтрокаДерева. КлючСтроки = КлючСтроки;
КлючСтроки = КлючСтроки + 1 ;
ОбновитьКлючиСтрокВДеревеЗначений( СтрокаДерева, КлючСтроки) ;
КонецЦикла ;
КонецПроцедуры
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(Дерево, Таблица = Неопределено) Экспорт
Если Таблица = Неопределено Тогда
Таблица = Новый ТаблицаЗначений;
Для Каждого Колонка Из Дерево. Колонки Цикл
Таблица. Колонки. Добавить( Колонка. Имя, Колонка. ТипЗначения) ;
КонецЦикла ;
КонецЕсли ;
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
ЗаполнитьЗначенияСвойств( Таблица. Добавить( ) , СтрокаДерева) ;
ВыгрузитьДеревоЗначенийВТаблицуЗначений( СтрокаДерева, Таблица) ;
КонецЦикла ;
Возврат Таблица;
КонецФункции
Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки" , КлючСвязи = "КлючСвязи" ) Экспорт
Дерево = Новый ДеревоЗначений;
Для Каждого Колонка Из Таблица. Колонки Цикл
Дерево. Колонки. Добавить( Колонка. Имя, Колонка. ТипЗначения) ;
КонецЦикла ;
Для Каждого СтрокаТаблицы Из Таблица Цикл
СтрокаГруппировки = Дерево. Строки. Найти( СтрокаТаблицы[КлючСвязи], КлючСтроки, Истина ) ;
Если СтрокаГруппировки = Неопределено Тогда
ЗаполнитьЗначенияСвойств( Дерево. Строки. Добавить( ) , СтрокаТаблицы) ;
Иначе
ЗаполнитьЗначенияСвойств( СтрокаГруппировки. Строки. Добавить( ) , СтрокаТаблицы) ;
КонецЕсли ;
КонецЦикла ;
Возврат Дерево;
КонецФункции
Процедура УстановитьЗначениеКолонкиДерева(Дерево, Колонка, Значение) Экспорт
Для каждого СтрокаДерева Из Дерево. Строки Цикл
СтрокаДерева[Колонка] = Значение;
УстановитьЗначениеКолонкиДерева( СтрокаДерева, Колонка, Значение) ;
КонецЦикла ;
КонецПроцедуры
Процедура СкопироватьПодчиненныеСтроки(СтрокаПриемник, СтрокаИсточник)
Для каждого Строка Из СтрокаИсточник. Строки Цикл
НоваяСтрока = СтрокаПриемник. Строки. Добавить( ) ;
НоваяСтрока. КлючСвязи = СтрокаПриемник. КлючСтроки;
ЗаполнитьЗначенияСвойств( НоваяСтрока, Строка) ;
СкопироватьПодчиненныеСтроки( НоваяСтрока, Строка) ;
КонецЦикла ;
КонецПроцедуры
Процедура ПеренестиСтрокиДереваЗначений(СтрокаПриемник, ВыделенныеСтроки) Экспорт
Если НЕ СтрокаПриемник = Неопределено Тогда
МассивСтрок = Новый Массив;
Для Каждого СтрокаПереноса Из ВыделенныеСтроки Цикл
МассивСтрок. Добавить( СтрокаПереноса) ;
НоваяСтрока = СтрокаПриемник. Строки. Добавить( ) ;
СкопироватьПодчиненныеСтроки( НоваяСтрока, СтрокаПереноса) ;
ЗаполнитьЗначенияСвойств( НоваяСтрока, СтрокаПереноса) ;
НоваяСтрока. КлючСвязи = СтрокаПриемник. КлючСтроки;
КонецЦикла ;
Для Каждого СтрокаДерева Из МассивСтрок Цикл
Если СтрокаДерева. Родитель = Неопределено Тогда
СтрокаДерева. Строки. Удалить( СтрокаДерева) ;
Иначе
СтрокаДерева. Родитель. Строки. Удалить( СтрокаДерева) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Александр Синцов (Sintson) Категория:
Работа с Деревом Значений