Имя: Пароль:
1C
1С v8
Запрос по таблице значений
0 Oz11
 
17.01.12
17:09
Вопрос таков. Есть табличная часть с реквизитами (Сотрудник, Период, Статья, Кол-во), которая заполняется в момент записи формы данными из таблицы значений на форме, причем количество и название колонок этой таблицы значений динамически создается в момент указания параметров на форме (аналог того как динамически формируется таб часть в документе "УстановкаЦенНоменклатуры" в УТП). у меня все зависит от двух параметров (количество месяцев, получающиеся из указанных пользователем дат и списка статей на той-же форме) выходит что если количество месяцев равно, например, 2 и количество статей 2 то состав колонок таблицы значений на форме будет таков: Сотрудник, Месяц1, Статья1, Статья2, Месяц2, Статья1, Статья2. Когда пользователь вводит, например, одну строку и заполняет ее данными, то при при записи этого всего в табличную часть выходит 4 строки: 1) Сотрудник = Сотрудник, Период = Месяц1, Статья = Статья1, Количество = Статья1.Количество 2) Сотрудник = Сотрудник, Период = Месяц1, Статья = Статья2, Количество = Статья2.Количество 3) Сотрудник = Сотрудник, Период = Месяц2, Статья = Статья1, Количество = Статья1.Количество 4) Сотрудник = Сотрудник, Период = Месяц2, Статья = Статья2, Количество = Статья2.Количество. как видите пишется все отлично, а вот при считывании получается 4 строки. вопрос в том как свернуть это все так как оно было в первоначальном виде в таблице значений на форме?
1 1с-кин
 
17.01.12
17:13
(0) что у вас первично - ТЗ или ТЧ НА ФОРМЕ? потому как ТЧ - это отображение ТЗ в данном случае, а не наоборот.
Если нужно что-то свернуть с ТЧ - выгрузите в ТЗ, сверните по полям, загрузите обратно.
2 Oz11
 
17.01.12
17:15
на форме лежит таблица значений (табличное поле) колонки которой формируются динамически (как описано выше), а табличная часть - обычная табличная часть документа (на форме ее нет, она заполняется при записи формы из таблицы значений на форме)
3 GenV
 
17.01.12
17:19
(0) Можно через ОБЪЕДИНИТЬ ВСЕ подтаблицы (условие на ячейки) для ТЗ в запросе.
4 Oz11
 
17.01.12
17:23
(3) можно подробней. нифига не понял
5 1с-кин
 
17.01.12
17:27
(4) он предлагает обработать ТЗ запросом.
Так вам колонки надо убрать лишние? а данные - по другим колонкам распределить что ли?
6 GenV
 
17.01.12
17:28
5+ ТЗ в запрос во временную таблицу. Потом по количеству колонок добавить выборки с условие суммы колонки <> 0. Все выборки объединить, потом сгруппировать.
7 Oz11
 
17.01.12
17:33
я сейчас работаю с запросом и временными таблицами. выходит что нужно как-бы развернуть состав таблицы из вертикального положения в горизонтальное, что-то типа того. сейчас пытаюсь сделать это левыми соединениями. убирать ничего не нужно. нужно правильно расставить все в таблице значений на форме.
8 GenV
 
17.01.12
17:36
(7) Если разворачивать, то можно и аналогично, по условиям. Можно и левыми соединениями.
9 Oz11
 
17.01.12
17:38
может Ваш метод проще, просто не могу понять как он работает. сутра сижу над этой задачей - мало что уже соображаю. если можно - опишите детальней.
10 AAlexandra
 
17.01.12
17:39
(6) Из "вертикальной" в "горизонтальную" ты в запросе таблицу никак не развернешь, если заранее не известно максимальное число колонок..
Можно динамически текст запроса составить.
Поля будут определяться примерно так:

ВТ.Сотрудник Как Сотрудник,
Сумма(Выбор когда ВТ.Период = &Период1 и ВТ.Статья = &Статья1 Тогда ВТ.Количество Иначе 0 Конец) КАК МояКолонкаПериод1Статья1,
Сумма(Выбор когда ВТ.Период = &Период1 и ВТ.Статья = &Статья2 Тогда ВТ.Количество Иначе 0 Конец) КАК МояКолонкаПериод1Статья2
...

Группировка по сотруднику, по всем колонкам сумма()
11 1с-кин
 
17.01.12
17:42
(7) так откуда тогда взялся термин "свернуть"? :)
чтобы проще было - сделайте выгрузку в промежуточную ТЗ (и обработайте, как надо), а потом снова заполните ТП на форме.
12 GenV
 
17.01.12
17:43
(10) А где написано, что это не так ?!
13 Oz11
 
17.01.12
17:44
(11) термин "свернуть" от того что в таблице значений на форме 1 строка, а в табличной части - 4.
14 AAlexandra
 
17.01.12
17:46
(12) малость промахнулась, пост (10) для автора топика.. ;)
15 GenV
 
17.01.12
17:46
Ты определись: тебе из Формы в ТЧ "развернуть" или из ТЧ в форму "свернуть".
16 GenV
 
17.01.12
17:46
(15) -> (13)
17 1с-кин
 
17.01.12
17:47
(13) вы че-то всех запутали...
свернуть строки в ТЗ - это выгрузить в ТЗ и ТЗ.Свернуть(<"указать несворачиваемые поля через запятую","указать по каким полям сворачивать">)
18 Oz11
 
17.01.12
17:50
"Свернуть" в этом контексте абстрактное понятие, а не метод ТаблицыЗначений. Задача состоит в том чтобы вытягивать данные из ТабличногоПоля (где их по примеру 4 строки), обрабатывать ("сворачивать", "группировать" как вам захочется) и помещать на форму в ТаблицуЗначений (где по примеру должна быть 1 строка)
19 GenV
 
17.01.12
17:56
(18) Первый вариант левыми соединениями, второй:
В вложенный запрос и сгруппировать суммы по сотруднику и периоду:

ВЫБРАТЬ ТЧ.Сотрудник, ТЧ.Период,
ТЧ.Сумма КАК СуммаСтатья1,
0 КАК СуммаСтатья2
ИЗ ТЧ ГДЕ ТЧ.Статья = &Статья1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ТЧ.Сотрудник, ТЧ.Период,
0
ТЧ.Сумма
ИЗ ТЧ ГДЕ ТЧ.Статья = &Статья2
20 Oz11
 
17.01.12
18:02
делаю такую штуку, но что-то ни к чему хорошему меня это не привело:

   Запрос = Новый Запрос;
   МВТ = Новый МенеджерВременныхТаблиц;
   Запрос.МенеджерВременныхТаблиц = МВТ;
   Запрос.Текст = "ВЫБРАТЬ
                  |    ТЗ.Сотрудник,
                  |    ТЗ.Период,
                  |    ТЗ.СтатьяПланирования,
                  |    ТЗ.Количество,
                  |    ТЗ.ПериодОригинальноеНазвание,
                  |    ТЗ.СтатьяОригинальноеНазвание
                  |ПОМЕСТИТЬ ТаблицаПланирование
                  |ИЗ
                  |    &ТЗ КАК ТЗ
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    Основа.Сотрудник ";
   Для каждого Стр Из Статьи Цикл
       Запрос.Текст = Запрос.Текст + ",
           |    "+Стр.СтатьяОригинальноеНазвание+".Период,
           |    "+Стр.СтатьяОригинальноеНазвание+".ПериодОригинальноеНазвание,
           |    "+Стр.СтатьяОригинальноеНазвание+".СтатьяПланирования,
           |    "+Стр.СтатьяОригинальноеНазвание+".СтатьяОригинальноеНазвание,
           |    "+Стр.СтатьяОригинальноеНазвание+".Количество ";    
   КонецЦикла;
   Запрос.Текст = Запрос.Текст + "
                  |ИЗ
                  |    ТаблицаПланирование КАК Основа ";
   Для каждого Стр Из Статьи Цикл
       Запрос.Текст = Запрос.Текст + "
           |    ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПланирование КАК "+Стр.СтатьяОригинальноеНазвание+"
           |        ПО Основа.Сотрудник = "+Стр.СтатьяОригинальноеНазвание+".Сотрудник
           |        И Основа.Период = "+Стр.СтатьяОригинальноеНазвание+".Период
           |        и Основа.СтатьяПланирования = "+Стр.СтатьяОригинальноеНазвание+".СтатьяПланирования ";    
   КонецЦикла;
   Запрос.УстановитьПараметр("ТЗ", ТЗ);
   Запрос.УстановитьПараметр("Статьи", Статьи);
   ТЗ = Запрос.Выполнить().Выгрузить();
21 Oz11
 
17.01.12
18:44
(19) объясните пожалуйста что за суммы. не могу понять идею. а если идти моим вариантом - левыми соединениями, тогда как написать запрос?
22 GenV
 
17.01.12
22:16
(21) Для соединений будет примерно так (колонки Сотрудник, Период_№Период, Статья_№Периода_№Статьи), остальное сам допилишь:

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТЧ", ТЧ);

ТекстЗапроса =
"ВЫБРАТЬ
|    ТЧ.Сотрудник,
|    ТЧ.Период,
|    ТЧ.СтатьяПланирования,
|    ТЧ.Количество
|ПОМЕСТИТЬ ТаблицаПланирование
|ИЗ
|    &ТЧ КАК ТЧ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ТаблицаПланирование.Сотрудник
|ПОМЕСТИТЬ ТаблицаОснова
|ИЗ
|    ТаблицаПланирование КАК ТаблицаПланирование
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ТаблицаОснова.Сотрудник";

НомСтатьи = 1;
Для Каждого ТекСтатья Из Статьи Цикл
   Запрос.УстановитьПараметр("Статья_" +НомСтатьи, ТекСтатья.Значение);
   НомСтатьи = НомСтатьи + 1;
КонецЦикла;

НомПериода = 1;
Для Каждого ТекПериод Из Периоды Цикл
   Запрос.УстановитьПараметр("Период_" +НомПериода, ТекПериод.Значение);
   ТекстЗапроса = ТекстЗапроса + СтрЗаменить(",
   |    &Период_#П КАК Период_#П", "#П", Строка(НомПериода));
   НомСтатьи = 1;
   Для Каждого ТекСтатья Из Статьи Цикл
       ТекстПоля = ",
       |    ЕСТЬNULL(ТаблицаПланирование_#П_#С.Количество, 0) КАК Количество_#П_#С";
       ТекстПоля = СтрЗаменить(ТекстПоля, "#С", Строка(НомСтатьи));
       ТекстПоля = СтрЗаменить(ТекстПоля, "#П", Строка(НомПериода));
       ТекстЗапроса = ТекстЗапроса + ТекстПоля;
       НомСтатьи = НомСтатьи+1;
   КонецЦикла;
   НомПериода = НомПериода+1;
КонецЦикла;

ТекстЗапроса = ТекстЗапроса + "
|ИЗ
|    ТаблицаОснова КАК ТаблицаОснова";

НомПериода = 1;
Для Каждого ТекПериод Из Периоды Цикл
   НомСтатьи = 1;
   Для Каждого ТекСтатья Из Статьи Цикл
       ТекстСоединения = "
       |ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПланирование КАК ТаблицаПланирование_#П_#С
       |    ПО ТаблицаОснова.Сотрудник = ТаблицаПланирование_#П_#С.Сотрудник
       |        И (ТаблицаПланирование_#П_#С.Период = &Период_#П)
       |        И (ТаблицаПланирование_#П_#С.СтатьяПланирования = &Статья_#С)";
       ТекстСоединения = СтрЗаменить(ТекстСоединения, "#С", НомСтатьи);
       ТекстСоединения = СтрЗаменить(ТекстСоединения, "#П", НомПериода);
       ТекстЗапроса = ТекстЗапроса + ТекстСоединения;
       НомСтатьи = НомСтатьи+1;
   КонецЦикла;
   НомПериода = НомПериода+1;
КонецЦикла;

Запрос.Текст = ТекстЗапроса;

ТЗ = Запрос.Выполнить().Выгрузить();
23 Oz11
 
18.01.12
13:30
ТЗ = Планирование.Выгрузить();
   Сотрудники = Планирование.Выгрузить();
   Сотрудники.Свернуть("Сотрудник");
   Статьи = Планирование.Выгрузить();
   Статьи.Свернуть("СтатьяОригинальноеНазвание");
   Запрос = Новый Запрос;
   МВТ = Новый МенеджерВременныхТаблиц;
   Запрос.МенеджерВременныхТаблиц = МВТ;
   Запрос.Текст = "ВЫБРАТЬ
                  |    ТЗ.Сотрудник,
                  |    ТЗ.Период,
                  |    ТЗ.СтатьяПланирования,
                  |    ТЗ.Количество,
                  |    ТЗ.ПериодОригинальноеНазвание,
                  |    ТЗ.СтатьяОригинальноеНазвание
                  |ПОМЕСТИТЬ ТаблицаПланирование
                  |ИЗ
                  |    &ТЗ КАК ТЗ
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    Сотрудники.Сотрудник
                  |ПОМЕСТИТЬ ТаблицаСотрудников
                  |ИЗ
                  |    &Сотрудники КАК Сотрудники
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    Статьи.СтатьяОригинальноеНазвание
                  |ПОМЕСТИТЬ СтатьяТаблица
                  |ИЗ
                  |    &Статьи КАК Статьи
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    ТаблицаСотрудников.Сотрудник КАК Сотрудник ";
                  Нумератор = 0;
                  Для каждого Стр Из Статьи Цикл
                      Нумератор = Нумератор + 1;
                       НазваниеПодзапроса = "" + Стр.СтатьяОригинальноеНазвание + "__";
                         Запрос.Текст = Запрос.Текст    + ",
                      |    "+НазваниеПодзапроса+".СтатьяОригинальноеНазвание КАК "+Стр.СтатьяОригинальноеНазвание+" ";
                  КонецЦикла;
                  Запрос.Текст = Запрос.Текст + "
                  |ПОМЕСТИТЬ ОригинальныеНазванияСтатейПоСотрудникам
                  |ИЗ
                  |    ТаблицаСотрудников КАК ТаблицаСотрудников ";
                  Для каждого Стр Из Статьи Цикл
                       НазваниеПараметра = "" + Стр.СтатьяОригинальноеНазвание + "_";
                       НазваниеПодзапроса = "" + Стр.СтатьяОригинальноеНазвание + "__";
                         Запрос.Текст = Запрос.Текст + "
                      |ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                      |    ТаблицаСтатей.СтатьяОригинальноеНазвание
                      |ИЗ    
                      |    СтатьяТаблица КАК ТаблицаСтатей
                      |ГДЕ
                      |    ТаблицаСтатей.СтатьяОригинальноеНазвание = &"+НазваниеПараметра+") КАК "+НазваниеПодзапроса+"
                      |    ПО Истина ";
                  КонецЦикла;
                  Запрос.Текст = Запрос.Текст + "
                  |;
                  |
                  |//////////////////////////////////////////////////////////////////////////////
делаю так. это дает мне в итоге Таблицу с колонками Сотрудник, СтатьяОригинальноеНазвание1, СтатьяОригинальноеНазвание2 и т.д. от количества статей.
не могу придумать как дальше прикрутить к этому всему остальные показатели (Период, СтатьяПланирования, Количество, ПериодОригинальноеНазвание).
СтатьяОригинальноеНазвание и ПериодОригинальноеНазвание - это колонки табличной части, которые содержат название колонки, динамически созданной на форме. планировал что так будет проще заполнять таблицу значений на форме при восстановлении данных.