Имя: Пароль:
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 и т.д. от количества статей.
не могу придумать как дальше прикрутить к этому всему остальные показатели (Период, СтатьяПланирования, Количество, ПериодОригинальноеНазвание).
СтатьяОригинальноеНазвание и ПериодОригинальноеНазвание - это колонки табличной части, которые содержат название колонки, динамически созданной на форме. планировал что так будет проще заполнять таблицу значений на форме при восстановлении данных.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший