Имя: Пароль:
1C
1C 7.7
v7: Как запросом получить плоскую таблицу?
,
0 Amiralnar
 
29.08.11
15:43
Есть справочник "Цены". Реквизиты: Владелец, ТипЦен, Цена (периодический).

Мне нужно получить таблицу и обойти выборку.

Получлось только через вот такой изврат...

//*******************************************
// Процедура генерации запроса Сформировать.
//
Процедура Сформировать()
   Перем Запрос, ТекстЗапроса, Таб;
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Владелец = Справочник.Цены.Владелец;
   |ТипЦен = Справочник.Цены.ТипЦен;
   |Цена = Справочник.Цены.Цена;
   |Группировка Владелец без групп;
   |Группировка ТипЦен без групп;
   |Группировка Цена без групп;
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");
   Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
   Пока Запрос.Группировка(1) = 1 Цикл
       // Заполнение полей Владелец
//        Таб.ВывестиСекцию("Владелец");
       Пока Запрос.Группировка(2) = 1 Цикл
           // Заполнение полей ТипЦен
//            Таб.ВывестиСекцию("ТипЦен");
           Пока Запрос.Группировка(3) = 1 Цикл
               // Заполнение полей Цена
               Таб.ВывестиСекцию("Цена");
           КонецЦикла;
       КонецЦикла;
   КонецЦикла;
   // Вывод заполненной формы
   Таб.ТолькоПросмотр(1);
   Таб.Показать("Сформировать", "");
КонецПроцедуры
1 andrewks
 
29.08.11
15:45
а неплоская таблица - это как?
2 Amiralnar
 
29.08.11
15:47
Это как дерево. Итоги, по нашему.
3 andrewks
 
29.08.11
15:47
а зачем группировка по цене?
4 Amiralnar
 
29.08.11
15:48
Я не знаю, зачем здесь вообще что либо надо. Конструктор помог.
5 andrewks
 
29.08.11
15:49
ничонепонял

озвучь задачу
6 Amiralnar
 
29.08.11
15:49
Просто не понятно, как перебирать записи в выборке запроса, как обращаться к полям.
7 Amiralnar
 
29.08.11
15:51
Есть справочник. В (0) написано. Надо запросить данные.

Кефир 0,5 л c 12.11        Базовая        6
Ряженка 0,5л 12.11        Базовая        6.5
Бифидок 1% 0,5            Базовая        7.7
Варенец 2,5% 0,5        Базовая        7.9
Варенец 2,5% стакан 300г.    Базовая        5.4
8 Amiralnar
 
29.08.11
15:52
Я запросил конструктором. Но при этом строятся группировки по владельцу и типу цены. они не нужны. Но если не настраивать группировки, конструктор вообще не формирует вывод.
9 __Se24
 
29.08.11
15:53
выгрузи в ТЗ потом печатай его
10 ParaWiz
 
29.08.11
15:54
Самое простое для тебя будет ТЗ=СоздатьОбъект("ТаблицаЗначений"); Запрос.Выгрузить(ТЗ); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл
сообщить(ТЗ.Владелец+"  "+ТЗ.ТипЦен +"       " ТЗ.Цена);
11 Amiralnar
 
29.08.11
15:58
Спасибо. Это не по пацански. Как это сделать, обращаясь к полям вида Запрос.Владелец, Запрос.ТипЦен, Запрос.Цена?
12 ParaWiz
 
29.08.11
16:02
Интересный термин "по пацански" касательно кодинга, по-пацански сделать вставку на ассемблере ;) только вот зачем ?
13 Amiralnar
 
29.08.11
16:02
(10) Не вышло. Полей у ТЗ нет.. Есть только номер строки.
14 Amiralnar
 
29.08.11
16:04
Таблица.Цена = Ошибка в выражении!

Вот код:


   Перем Запрос, ТекстЗапроса, Таб;
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Владелец = Справочник.Цены.Владелец;
   |ТипЦен = Справочник.Цены.ТипЦен;
   |Цена = Справочник.Цены.Цена;
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

   // Подготовка к заполнению выходных форм данными запроса
   Таб = СоздатьОбъект("Таблица");
   Таб.ИсходнаяТаблица("Сформировать");
   // Заполнение полей "Заголовок"
   Таб.ВывестиСекцию("Заголовок");
   Состояние("Заполнение выходной таблицы...");

   Таблица = СоздатьОбъект("ТаблицаЗначений");
   
   Запрос.Выгрузить(Таблица);
   
   Таблица.ВыбратьСтроки();
   
   Пока Таблица.ПолучитьСтроку() = 1 Цикл
       Таб.ВывестиСекцию("Строка");
   КонецЦикла;
15 ParaWiz
 
29.08.11
16:05
а группировки кто делать будет ?
16 ParaWiz
 
29.08.11
16:05
(15) для простоты можешь считать что группировка = колонка тз
17 Amiralnar
 
29.08.11
16:07
Тоесть строить три группировки? Или только по владельцу?
Нет простого:

ВЫБРАТЬ * ИЗ Цены

Разве это так сложно??
18 ParaWiz
 
29.08.11
16:08
кури матчасть - подчиненные справочники и периодические реквизиты
19 Фрид
 
29.08.11
16:10
Запрос.Выгрузить(Таблица,1,0);
это вывод значений групп и функций, дополнительных переменных и итоги по группировкам не выводить.
20 andrewks
 
29.08.11
16:11
пля, так и вынудит готовый код дать. опытный лентяй

   ТекДата=ТекущаяДата();
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС
   |Период с ТекДата по ТекДата;
   |Номенклатура = Справочник.Цены.Владелец;
   |ТипЦен = Справочник.Цены.ТипЦен;
   |Цена = Справочник.Цены.Цена;
   |Группировка Номенклатура без групп;
   |Группировка ТипЦен;
   //опционально |Условие(Номенклатура в ВыбНоменклатура);
   |"//}}ЗАПРОС

   ;
   // Если ошибка в запросе, то выход из процедуры

   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   
   ТЗ=СоздатьОбъект("ТаблицаЗначений");
   Запрос.Выгрузить(ТЗ,1,0);
   ТЗ.ВыбратьСтроку(,"Выбор строки");
21 ParaWiz
 
29.08.11
16:15
но лучше кури матчасть чем пользоваться тем что за тебя пишут код, и имхо рано ты в запросы полез, начни с простой выборки
22 МастерВопросов
 
29.08.11
16:15
(17) ты с восьмерки что ли пришел?
23 __Se24
 
29.08.11
16:21
Когда у тебя количество полей в одной группировке отличается в зависимости от более верхней группировки , то без ТЗ никак ..
она придаст твоему безформенному отчету вид негого прямоугольника , с фиксированным количеством строк и колонок.
иначе , выгружая на печатную форму напрямую из запроса ты рискуешь получить херь
24 viktor_vv
 
29.08.11
16:28
(17)
ТекстЗапроса =
   "//{{ЗАПРОС

   |Период с ТекДата по ТекДата;
   |ТекЭлемент = Справочник.Цены.ТекущийЭлемент ;
   |Номенклатура = Справочник.Цены.Владелец;
   |ТипЦен = Справочник.Цены.ТипЦен;
   |Цена = Справочник.Цены.Цена;
   |Группировка ТекЭлемент без групп;
   //опционально |Условие(Номенклатура в ВыбНоменклатура);

   |"//}}ЗАПРОС

Если плоская таблицан нужна, то делаешь одну группировку самой нижней ступени иерархии.
25 Amiralnar
 
29.08.11
16:28
(20) Отлично. Просто великолепно. Благодарю. То, что нужно.

(21) Матчасть курю постоянно. Также иногда прошу помощи коллег, и помогаю коллегам. Что касается запросов, то клюшкины запросы меня вводят в уныние. Как и её бухитоги. Мне, к стати, с ними работать в следующую очередь. Если бы жизнь заставила постоянно страдать на 7.7, перешел бы на другую работу, где SQL это не пустой звук, а хотя бы и прозрачный намек (привет, снеговик).
Что касается выборки - то меня очень печалит код семерочников на восьмерке, извлекающих данные выборкой, и еще одной выборкой по владельцу, и строчащих километровые условные операторы, вместо описания структуры метаданных как положено, и одного запроса.

(22) С восьмерки, так и есть.

(24) Спасибо, запомню.
26 andrewks
 
29.08.11
16:36
(25) сразу на снеговике кодить стал? тогда да, сложновато сразу изменить мышление для 7-ки
27 Amiralnar
 
29.08.11
16:40
(26) Симметрично. Редко видел адекватного клюшковеда на восьмерке. Очень редко. Лично с такими не знаком. По форуму встречаются, изредка.
28 Leksus
 
07.09.11
13:17
подниму ветку, т.к. самому понадобилось...
вывести простую таблицу как в (24) без промежуточной выгрузки в таблицу значений возможно?
если данный запрос подсунуть конструктору, то он нормально ее не отрисовывает :(
29 1Сергей
 
07.09.11
13:20
(28) вывести куда?
30 Leksus
 
07.09.11
13:36
(29) в табличный документ
31 viktor_vv
 
07.09.11
13:42
(28) Запрос как в (24) с одной группировкой.

Пока Запрос.Группировка("ТекЭлемент") = 1 Цикл
  // Заполняем переменные для таблицы
  // .....
  Таб.ВывестиСекцию("ИмяСекцииДляСтрокиЗапроса") ;
КонецЦикла;
Независимо от того, куда вы едете — это в гору и против ветра!