Имя: Пароль:
1C
 
Таблица значений в дерево значений
,
0 picom
 
26.06.17
13:26
Есть таблица на форме во внешней обработке в УТ11.3 вида
документ1 Товар1 Колво1
документ1 Товар2 Колво2
документ2 Товар1 Колво1
Как молнеиносно и супербыстро это превратить в
документ1
----Товар1 Колво1
----Товар2 Колво2
документ2
----Товар1 Колво1
?
1 catena
 
26.06.17
13:32
Засунуть в запрос с итогами, выгрузить.
2 МихаилМ
 
26.06.17
15:59
не в запрос а в построитель запроса

//------------------------------------------------------------------------------------------------------------------------------
//http://www.odincplus.com/stati-programmistam/preobrazovanie-tablitsy-znacheniy-v-derevo-znacheniy.html
// Функция возращает дерево значний из таблицы значений, с нужной группировкой
Функция ТаблицаЗначенийВДеревоЗначений(ТЗ, ГруппировкаКолонка) Экспорт
   ПЗ             = Новый ПостроительЗапроса;
   ПЗ.ИсточникДанных          = Новый ОписаниеИсточникаДанных(ТЗ);//передаем ТЗ
   ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
   ПЗ.ИсточникДанных.Колонки[ГруппировкаКолонка].Измерение = Истина;//по этой колонке идет группировка
   ПЗ.ЗаполнитьНастройки();
   ПЗ.Выполнить();
   Дерево = ПЗ.Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);  
   Возврат Дерево;  
КонецФункции // ТаблицаЗначенийВДеревоЗначений
3 vadim777
 
26.06.17
16:26
4 picom
 
28.06.17
13:49
спасибо конечно, но на упр формах то как?
5 pessok
 
28.06.17
13:50
а какая разница - на каких формах?
6 pessok
 
28.06.17
13:52
хм, а чем (2) лучше (1)
я всегда юзал (1)
7 picom
 
28.06.17
13:53
(5) Создал дерево на форме
как в него загрузить результат из (2)
8 pessok
 
28.06.17
13:55
УправляемаяФорма.ЗначениеВРеквизитФормы (ManagedForm.ValueToFormAttribute)
УправляемаяФорма (ManagedForm)
ЗначениеВРеквизитФормы (ValueToFormAttribute)
Синтаксис:

ЗначениеВРеквизитФормы(<Значение>, <ИмяРеквизита>)
Параметры:

<Значение> (обязательный)

Тип: Произвольный.
Значение прикладного типа, которое необходимо преобразовать в реквизит формы и для которого определено преобразование в данные формы.
<ИмяРеквизита> (обязательный)

Тип: Строка.
Имя реквизита формы, в который необходимо поместить преобразованное значение.
Описание:

Преобразует объект прикладного типа в реквизит управляемой формы (данные формы) с указанным именем.
Если реквизит является основным реквизитом формы объекта или записи регистра сведений, то осуществляется обновление параметра формы Ключ и автоматического заголовка формы. Если ключ старого объекта отличается от ключа нового и старый объект был заблокирован формой, то блокировка на старый объект освобождается. Обновление флага модифицированности при этом не производится.

Доступность:

Сервер, мобильное приложение(сервер).
9 picom
 
28.06.17
13:56
ееее
всем спасибо
    ЗначениеВРеквизитФормы(ТаблицаЗначенийВДеревоЗначений(РеквизитФормыВЗначение("Табло"), "Документ"), "Реквизит1");
10 Tateossian
 
28.06.17
13:56
НаборыДанных = Новый Структура("ТвояТаблица", ТвояТаблица);
СКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

КомпМакета = новый КомпоновщикМакетаКомпоновкиДанных;
макетКомп = КомпМакета.Выполнить(СКД, СКД.НастройкиПоУмолчанию);
ПроцессорКомпДанных = новый ПроцессорКомпоновкиДанных;
ПроцессорКомпДанных.Инициализировать(макетКомп, НаборыДанных);

ДеревоЗначений = Новый деревозначений;

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДеревоЗначений = Новый ДеревоЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
11 Tateossian
 
28.06.17
13:57
(10) Имей ввиду - дерево - мутабельный тип:) Перегнать не получится, как пишут товрищи (8)
12 Tateossian
 
28.06.17
13:57
(11) Используй временное хранилище
13 pessok
 
28.06.17
13:58
(11) с чего бы это вдруг?

Процедура ПреобразоватьТаблицуВДерево(ТаблицаДанных)
    
    ДеревоДанных.ПолучитьЭлементы().Очистить();
    
    Запрос = Новый Запрос();
    
    Запрос.Текст =
    "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ_ТаблицаДанных ИЗ &ТаблицаДанных КАК ТаблицаДанных; ВЫБРАТЬ * ИЗ ВТ_ТаблицаДанных
    | ГДЕ (ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    |    ИЛИ &НеОтбиратьПоДатеЗаказа)
    |И (ЗаказКлиента.ДатаОтгрузки МЕЖДУ &НачалоПериода И &КонецПериода
    |    ИЛИ &НеОтбиратьПоДатеОтгрузки)
    |    ИТОГИ ПО Склад ";
    
    
    
    Запрос.УстановитьПараметр("ТаблицаДанных", ТаблицаДанных);
    Запрос.УстановитьПараметр("НеОтбиратьПоДатеЗаказа", Не ОтбиратьПоДатеЗаказа);
    Запрос.УстановитьПараметр("НеОтбиратьПоДатеОтгрузки", Не ОтбиратьПоДатеДоставки);
    Запрос.УстановитьПараметр("НачалоПериода", Период.ДатаНачала);
    Запрос.УстановитьПараметр("КонецПериода", Период.ДатаОкончания);
    
    ВыборкаСклад = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Дерево = РеквизитФормыВЗначение("ДеревоДанных");
    
    Пока ВыборкаСклад.Следующий() Цикл
        
        НовСтрСклад = Дерево.Строки.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтрСклад, ВыборкаСклад);
        
        Детали = ВыборкаСклад.Выбрать();
        
        Пока Детали.Следующий() Цикл
            
            НовСтрДетали = НовСтрСклад.Строки.Добавить();
            ЗаполнитьЗначенияСвойств(НовСтрДетали, Детали);
            
        КонецЦикла;
        
    КонецЦикла;
    
    ЗначениеВРеквизитФормы(Дерево, "ДеревоДанных");
    
КонецПроцедуры


УМВР
14 picom
 
28.06.17
14:02
А как развернуть все группировки в УФ?
15 pessok
 
28.06.17
14:04
ТаблицаФормы.Развернуть (FormTable.Expand)
ТаблицаФормы (FormTable)
Развернуть (Expand)
Синтаксис:

Развернуть(<ИдентификаторСтроки>, <СПодчиненными>)
Параметры:

<ИдентификаторСтроки> (обязательный)

Тип: Произвольный.
Идентификатор строки таблицы.
<СПодчиненными> (необязательный)

Тип: Булево.
Определяет необходимость раскрытия подчиненных узлов. Истина - раскрывать подчиненные узлы, Ложь - не раскрывать подчиненные узлы.
Значение по умолчанию: Ложь.
Описание:

Разворачивает узел в указанной строке дерева.

Доступность:

Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
--------------------------------------------------------------------------------

     Методическая информация
16 Tateossian
 
28.06.17
14:04
В люом случае, у тебя результаты будут непредсказуемые, ибо что ты ждешь от этой конструкции?
ГДЕ (ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    |    ИЛИ &НеОтбиратьПоДатеЗаказа)

У тебя она всегда работать будет, лол
17 Tateossian
 
28.06.17
14:06
Вообще, не используй никогда конструкции-отрицания ("Справочник программиста (r)"). Юзай утвверждения и оператор И : &ИспользоватьПоДатеХ
18 pessok
 
28.06.17
14:07
(16) все у меня прекрасно и правильно работает уже не первый год.

Если у тебя проблемы с чтением сложных условий запрос, то следует подучиться :)
19 Tateossian
 
28.06.17
14:12
(18) Возможно, но не факт, что корректно;) Так и быть, пойду подучусь.

Ну и напоследок, у тебя в любом случае неоптимальный запрос: или в где всегда стоит избегать. Пруфец тут: http://www.gilev.ru/optimquery/
20 pessok
 
28.06.17
14:13
(19) друг. ну если есть сомнения.
выполни два запроса

ВЫБРАТЬ ПЕРВЫЕ 100 Т.Ссылка ИЗ Документ.ЗаказКлиента КАК Т ГДЕ Т.Дата МЕЖДУ &Дн И &До ИЛИ &НеОтбиратьПоДате

ВЫБРАТЬ ПЕРВЫЕ 100 Т.Ссылка ИЗ Документ.ЗаказКлиента КАК Т ГДЕ Т.Дата МЕЖДУ &Дн И &До И &ОтбиратьПоДате

и убедись наглядно :)
21 pessok
 
28.06.17
14:13
+(20) будешь весьма удивлен, видимо
22 pessok
 
28.06.17
14:14
а ГДЕ тут избежать ну никак нельзя, потому что нет ни соединений, ни виртуальных таблиц :D
23 Tateossian
 
28.06.17
14:21
(20) Да, тут понятнее стало. Извиняюсь за поспешный вывод:) Проверь-ка, вот так быстрее будет (просто интересно):

ГДЕ ВЫБОР КОГДА &ОтбиратьПоДате ТОГДА Т.Дата МЕЖДУ &Дн И &До ИНАЧЕ ИСТИНА КОНЕЦ
24 pessok
 
28.06.17
14:24
(23) на самом деле, я использую и твою конструкцию тоже. Просто, какая первая приходит в голову, такую и использую :)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.