|
Помогите освоить запросы. Обещали однако. | ☑ | ||
---|---|---|---|---|
0
bizon2008
02.11.16
✎
10:17
|
Хай пипл. У меня тут отпуск нарисовался однако. Вот помогите освоить запросы. И чтобы совместить приятное(мозги разгрузить) и сделать полезное(племяшу помочь).
Значить так, задачу для начала простую возьмем, сделать внешние печатные формы РН И ТТН для дока Реализации товаров и услуг. А вы как раз тут недавно натыкали меня носом. Пойдем из классики. Обычная БД. Шапка дока хранится в отдельной таблице, мастер, табличная часть в другой отдельной таблице, деталь. Естественно обе таблица имеют уникальные ключевые поля, по которым и устанавливается связь мастер-деталь – один ко многим. Ну и в запросе через левое соединение все это вытаскивается. В 1С типа такого. ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата, РеализацияТоваровУслугТовары.Ссылка КАК СсылкаТовары, РеализацияТоваровУслугТовары.Номенклатура, РеализацияТоваровУслугТовары.Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка ГДЕ РеализацияТоваровУслуг.Ссылка = &Док Тута РеализацияТоваровУслуг.Ссылка и РеализацияТоваровУслугТовары.Ссылка это как ключевые поля, и они типа GUID, типа токого {6F9619FF-8B86-D011-B42D-00CF4FC964FF}и шоб мне значить красиво их показать 1с явно за кадром еще какой запрос гоняет. Так как мне на экран обе ссылки название дока притаскивают. А РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка это типа и есть связь мастер - деталь. Вроде все красиво, вроде все понятно. Единенный минус, обрабатывать выгрузку не очень удобно, бо куча строк в которой повторяется данные шапки. В принципе можно запросить отдельно шапку и отдельно табличную часть. Но народ сказал фу, типа не кошерно однако. Разные конструкторы 1С предлагают такой запрос сварганить. ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата, РеализацияТоваровУслуг.Товары.( Номенклатура, Количество ) ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Ссылка = &Док Этот красивше, и обрабатывать выборку тоже удобно. Но блин где-то я туплю, в скобках типа вложенный же запрос получается. А это однако не есть хорошо как тут народ рассказывает. Ну и вариант от особо одарённых. То бишь от меня, это меня тут на форуме плохому научили уже. ВЫБРАТЬ РеализацияТоваровУслугТовары.Ссылка, РеализацияТоваровУслугТовары.Ссылка.Номер, РеализацияТоваровУслугТовары.Ссылка.Дата, РеализацияТоваровУслугТовары.Количество, РеализацияТоваровУслугТовары.Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ГДЕ РеализацияТоваровУслугТовары.Ссылка = &Док Как бы на выходе все тоже что и в первом варианте. Но вот тут типа запрос через точку, РеализацияТоваровУслугТовары.Ссылка.Номер, РеализацияТоваровУслугТовары.Ссылка.Дата, который по идее тоже самое левое соединении и сделает. Вопрос одно на все или отдельный запрос на каждую строку я так и не понял. Одно понял бъют за такое по рукам. В общем как оно должно быть правильно однако? Это простой пример, щас расскажите и я покруче зайду. |
|||
1
PLUT
02.11.16
✎
10:20
|
(0) "ну у вас и запросы" - сказала база данных и повесилась
|
|||
2
PLUT
02.11.16
✎
10:21
|
||||
3
Масянька
02.11.16
✎
10:22
|
(1) Чего? Это - запросы?!
Вот Сворачивание строк в ТОРГ12. УТ 11.2 (разверни нулевой пост) - это запросы... |
|||
4
Web00001
02.11.16
✎
10:22
|
(1)хз, третий запрос как запрос, чо тут не так то?
|
|||
5
Масянька
02.11.16
✎
10:23
|
(4) Маловато будет...
|
|||
6
Web00001
02.11.16
✎
10:23
|
(3)Автозаполнение дока начислениеЗП или табеля в ЗуП посмотри, там еще веселее.
|
|||
7
bizon2008
02.11.16
✎
10:24
|
(4) Ну так типа тама через точку. А это вроде как фигня.
|
|||
8
bizon2008
02.11.16
✎
10:24
|
(2) Я вот решил от печки. Но покурим, спасибо.
|
|||
9
Масянька
02.11.16
✎
10:24
|
(6) Да видела я... Ты еще предложи поколупать расчет ЗП...
Наезд (однозначно) не по делу. |
|||
10
Web00001
02.11.16
✎
10:26
|
(9)В каком месте, тут наезд?
|
|||
11
bizon2008
02.11.16
✎
10:27
|
Так народ, давай без изменения у кого длиннее. Запрос, а не то что вы подумали.
Какой вариант кошерней? Я щас полей добавлю. |
|||
12
Масянька
02.11.16
✎
10:28
|
(10) В (1)
|
|||
13
Масянька
02.11.16
✎
10:29
|
(11) А чё "народ"-то?
|
|||
14
bizon2008
02.11.16
✎
10:30
|
(13) Ну люди, человеки тама.
|
|||
15
Дарлок
02.11.16
✎
10:30
|
(11) если в первом варианте левое заменить на внутреннее, то он будет равнозначен 3тьму. Просто в 3м за тебя платформа произведет преобразование "РеализацияТоваровУслугТовары.Ссылка.Номер" в соединение
|
|||
16
ptiz
02.11.16
✎
10:33
|
(0) "В принципе можно запросить отдельно шапку и отдельно табличную часть." - как раз самый кошерный вариант
|
|||
17
bizon2008
02.11.16
✎
10:36
|
(16) Народ на груди тельняшку рвал, что запрос должен быть только один.
|
|||
18
piter3
02.11.16
✎
10:37
|
выбрать док,к нему левым соединением ТЧ.Все.А кто рвал пусть и поясняет
|
|||
19
bizon2008
02.11.16
✎
10:38
|
Я вот еще такой нарисовал, но блин как к первому запросу обратится шоб выборку получить никак не нагуглю однако.
ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка, РеализацияТоваровУслуг.Номер, РеализацияТоваровУслуг.Дата ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ГДЕ РеализацияТоваровУслуг.Ссылка = &Док ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РеализацияТоваровУслугТовары.Ссылка, РеализацияТоваровУслугТовары.Номенклатура, РеализацияТоваровУслугТовары.Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ГДЕ РеализацияТоваровУслугТовары.Ссылка = &Док |
|||
20
bizon2008
02.11.16
✎
10:39
|
(15) Это пока мало, а когда их больше будет?
|
|||
21
bizon2008
02.11.16
✎
10:39
|
(18) Не понял? Это как?
|
|||
22
Lexey_
02.11.16
✎
10:40
|
(19) ВыполнитьПакет()
|
|||
23
piter3
02.11.16
✎
10:42
|
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ПО (РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка) ГДЕ РеализацияТоваровУслуг.Ссылка = &Ссылка |
|||
24
bizon2008
02.11.16
✎
10:43
|
Ладно усложняем задачу. Товарищ, племяш который, тут писал.
Функция ПолучитьДанныеОрганизации() ДанныеОрганизации = Новый Структура; Док = СсылкаНаОбъект.ПолучитьОбъект(); ДанныеОрганизации.Вставить("НаименованиеПолное", Док.Организация.НаименованиеПолное); ДанныеОрганизации.Вставить("Адрес", ПолучитьАдресОбъекта(Док.Организация)); ДанныеОрганизации.Вставить("АдресРазгрузки", ПолучитьАдресОбъекта(Док.алкПунктРазгрузкиОрганизации)); Типа неправильно однако. Типа куча запросов генерируется. Причем типа еще позапрос типа такого в функции. Функция ПолучитьАдресОбъекта(ОбъектСсылка) ТипСсылка = Перечисления.ТипыКонтактнойИнформации.Другое; Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | КонтактнаяИнформация.Представление КАК Представление |ИЗ | РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Тип.Ссылка = &Ссылка | И КонтактнаяИнформация.Объект = &Объект | И КонтактнаяИнформация.Вид.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование", "ПечатьСправокАиБ"); Запрос.УстановитьПараметр("Объект", ОбъектСсылка); Запрос.УстановитьПараметр("Ссылка", ТипСсылка); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Количество() = 1 Тогда Выборка.Следующий(); Возврат СокрЛП(Выборка.Представление); Иначе Сообщить("ВНИМАНИЕ. Адрес заполнен некоректно. Проверьте"); Возврат "ВНИМАНИЕ. Адрес заполнен некоректно. Проверьте"; КонецЕсли КонецФункции Зафукали же однако. |
|||
25
bizon2008
02.11.16
✎
10:44
|
(22) Не тупой, это я нашел. А вот как сказать это из первого пакета тянуть, а это из второго.
|
|||
26
bizon2008
02.11.16
✎
10:44
|
(23) Дык у меня тож самое, первый вариант однако.
|
|||
27
piter3
02.11.16
✎
10:46
|
(25) Результаты[ВсегоРезультатов - 2].Выгрузить().
где Результаты=Запрос.ВыполнитьПакет() ВсегоРезультатов =Результаты.Количество() |
|||
28
Lexey_
02.11.16
✎
10:47
|
(25) Описание:
Последовательно выполняет все запросы и возвращает массив результатов для каждого запроса из пакета. Результаты помещаются в массив в последовательности расположения запросов в тексте пакета. |
|||
29
piter3
02.11.16
✎
10:47
|
(26)просмотрел,я лично предпочитаю выбрать док в ВТ,а уж потом левым соединением ТЧ.
|
|||
30
bizon2008
02.11.16
✎
10:50
|
(29) Логично, туда можно усю шапку запихать.
Но получается опять все кучей на выходе идет. |
|||
31
piter3
02.11.16
✎
10:52
|
(30)а почему нельзя один запрос по шапке,обошел вывел..потом отдельный запрос по тч,обошел и вывел.
|
|||
32
bizon2008
02.11.16
✎
10:55
|
(27) (28) Чето я торможу на поворотах.
Это типа такого можно писать? МассивРезультатов = Запрос.ВыполнитьПакет(); Выборка1 = МассивРезультатов[0].Выбрать();//Первый пакет Если Выборка1.Следующий() Тогда //Тут крутим выборку 1 КонецЕсли; Выборка2 = МассивРезультатов[1].Выбрать();//Второй пакет Если Выборка2.Следующий() Тогда //Тут крутим выборку 2 КонецЕсли; |
|||
33
bizon2008
02.11.16
✎
10:58
|
(31) Тут меня народ в код тыкал носом, и приговаривал что запрос должен быть один, пусть даже и пакетный.
Вот два куска аналогичного по фукционалу кода. Чей лучший? |
|||
34
piter3
02.11.16
✎
10:58
|
(32) Да
|
|||
35
Dmitrii
гуру
02.11.16
✎
10:58
|
(16) >> запросить отдельно шапку и отдельно табличную часть." - как раз самый кошерный вариант
Кошерный он для печати одного документа. При пакетной печати - это будет самый ущербный вариант. В современных типовых 1С исповедует в БСП в подсистеме Печать универсальный подход, позволяющий печатать массивы объектов. При печати одного объекта массив состоит из единственного элемента. |
|||
36
Dmitrii
гуру
02.11.16
✎
11:00
|
(31) Почему нельзя? Можно. При пакетной печати имеем лишние запросы в цикле (их там и так дофига - для получения всяких реквизитов и ответственных лиц).
|
|||
37
bizon2008
02.11.16
✎
11:00
|
(34) Блин, тогда тогда у меня уже четыре варианта как запросы писать.
|
|||
38
bizon2008
02.11.16
✎
11:02
|
(36) А гляньте на кусочек кода в (24), коли не в тягость, это как в один запрос запихать то.
|
|||
39
Dmitrii
гуру
02.11.16
✎
11:08
|
(38) И в чем там проблема?
Ну будет два раза регистр контанктной информации в запросе - один раз для получения адреса организации, а второй - для адреса алкПунктРазгрузкиОрганизации. |
|||
40
Dmitrii
гуру
02.11.16
✎
11:16
|
+ к (39) типа такого что-то (контактная информация в ТЧ, а не в РС):
ВЫБРАТЬ РеализацияТоваровУслуг.Ссылка КАК Ссылка, РеализацияТоваровУслуг.Контрагент КАК Контрагент, КонтрагентыКонтактнаяИнформацияМестоПогрузки.Представление КАК Адрес, КонтрагентыКонтактнаяИнформация.Представление КАК АдресДоставки ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация ПО (РеализацияТоваровУслуг.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка И КонтрагентыКонтактнаяИнформация.Тип = &ТипАдресКонтрагента) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформацияМестоПогрузки ПО (РеализацияТоваровУслуг.Контрагент = КонтрагентыКонтактнаяИнформацияМестоПогрузки.Ссылка И КонтрагентыКонтактнаяИнформацияМестоПогрузки.Тип = &ТипАдресДоставки) |
|||
41
bizon2008
02.11.16
✎
11:34
|
(39)Там четыре раз адрес нужно вытаскивать.
|
|||
42
bizon2008
02.11.16
✎
11:36
|
КонтактнаяИнформация это регистр сведений.
|
|||
43
piter3
02.11.16
✎
11:36
|
(36)А где написано за пакетную?
|
|||
44
HardBall
02.11.16
✎
11:38
|
(0) За
ВЫБРАТЬ РеализацияТоваровУслугТовары.Ссылка, РеализацияТоваровУслугТовары.Ссылка.Номер, РеализацияТоваровУслугТовары.Ссылка.Дата, РеализацияТоваровУслугТовары.Количество, РеализацияТоваровУслугТовары.Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ГДЕ РеализацияТоваровУслугТовары.Ссылка = &Док никто по рукам не бьет. Платформа сама сгенерирует внутреннее соединение. |
|||
45
Я не курил
02.11.16
✎
11:42
|
+ за 3 вариант
|
|||
46
odines
02.11.16
✎
11:46
|
(0) вот так у человека и форматируются мозги под 1С, вспоминаю как слово "контрагент" недоумение вызывало)
в (44) ответ |
|||
47
Dmitrii
гуру
02.11.16
✎
11:46
|
(43) >> А где написано за пакетную?
А где написано, что печатная форма только для одноразовой поштучной печати? БСП (встроенная во все современные типовые) подразумевает универсальный подход с возможностью печатать пакетно. |
|||
48
piter3
02.11.16
✎
11:49
|
(47) Ты про 3,я о 2.0.Угу пробовали мы с бсп попечатать...
|
|||
49
Dmitrii
гуру
02.11.16
✎
11:49
|
(41) >> Там четыре раз адрес нужно вытаскивать
Да хоть сорок четыре. Какая разница? Лучше получить всё одним запросом, чем четыре раза вызывать процедуру, которая сделает четыре раза (при каждом вызове) отдельный запрос. |
|||
50
Dmitrii
гуру
02.11.16
✎
11:52
|
(48) Где в условиях версии?
А чего бы не поговорить о печати в какой-нибудь клюшечной конфе? Нравиться - не нравиться. Но все типовые идут на УФ со встроенной БСП. |
|||
51
Dmitrii
гуру
02.11.16
✎
11:55
|
(42) >> КонтактнаяИнформация это регистр сведений.
Пример приведен для того, чтобы суть показать. У меня нет под рукой конфы, где КИ в РС. Замени в моем примере "Справочник.Контрагенты" на "РегистрСведений" и в условиях соединений "Контрагент=Ссылка" на "Контрагент=Объект" (ну или какое там измерение хранит объект). |
|||
52
bizon2008
02.11.16
✎
11:58
|
(51) Это я понял, соединений у меня многовато получается.
|
|||
53
piter3
02.11.16
✎
11:59
|
(50)пока писем нет еще могу согласиться,ну да ладно топик не об этом
|
|||
54
Dmitrii
гуру
02.11.16
✎
12:05
|
(52) В общем случае 4 соединения лучше 4-х отдельных запросов. К тому же можно предварительно вытащить всю КИ по нужному контрагенту во временную таблицу, а уже потом строить соединение к ней.
|
|||
55
FIXXXL
02.11.16
✎
12:05
|
(52) лучше один раз много соединений, чем запрос в цикле или 4 раза дергать базу
|
|||
56
DrZombi
гуру
02.11.16
✎
12:07
|
(0) >>>> ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
Убери, через ссылку уже оно доступно. |
|||
57
DrZombi
гуру
02.11.16
✎
12:09
|
(11) Лучше последний
Но 1С любит всегда писать два различных запроса. 1. По шапке документов 2. По табличным частям. |
|||
58
DrZombi
гуру
02.11.16
✎
12:11
|
+ ВЫБРАТЬ
РеализацияТоваровУслуг.Товары.( Номенклатура, Количество ) ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг В результате вам выплюнет выборка одну строку с ТЗ "Товары" :) |
|||
59
DrZombi
гуру
02.11.16
✎
12:12
|
+ Где-то читал, что данный способ памяти кушает много, не рекомендую на больших объемах информации
|
|||
60
bizon2008
02.11.16
✎
14:45
|
В идеале получается делать пакетный, и шапка отдельно, и табличная час сама по себе. И отлаживать легко. А перебор выборки тоже простой получается.
Шапку можно в цикле загонять в соответствие, а табличную часть в тз и в соответствие. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |