Вход | Регистрация



Помогите освоить запросы. Обещали однако.

Помогите освоить запросы. Обещали однако.
Я
   bizon2008
 
02.11.16 - 10:17
Хай пипл. У меня тут отпуск нарисовался однако. Вот помогите освоить запросы. И чтобы совместить приятное(мозги разгрузить) и сделать полезное(племяшу помочь).
Значить так, задачу для начала простую возьмем, сделать внешние печатные формы РН И ТТН для дока  Реализации товаров и услуг. А вы как раз тут недавно натыкали меня носом.
Пойдем из классики. Обычная БД. Шапка дока хранится в отдельной таблице, мастер, табличная часть в другой отдельной таблице, деталь. Естественно обе таблица имеют уникальные ключевые поля, по которым и устанавливается связь мастер-деталь – один ко многим. Ну и в запросе через левое соединение все это вытаскивается.
В 1С типа такого.

ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка,
    РеализацияТоваровУслуг.Номер,
    РеализацияТоваровУслуг.Дата,
    РеализацияТоваровУслугТовары.Ссылка КАК СсылкаТовары,
    РеализацияТоваровУслугТовары.Номенклатура,
    РеализацияТоваровУслугТовары.Количество
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
ГДЕ
    РеализацияТоваровУслуг.Ссылка = &Док

Тута РеализацияТоваровУслуг.Ссылка и РеализацияТоваровУслугТовары.Ссылка это как ключевые поля, и они типа GUID, типа токого {6F9619FF-8B86-D011-B42D-00CF4FC964FF}и шоб мне значить красиво их показать 1с явно за кадром еще какой запрос гоняет. Так как мне на экран обе ссылки название дока притаскивают.  А РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка это типа и есть связь мастер  - деталь.
Вроде все красиво, вроде все понятно. Единенный минус, обрабатывать выгрузку не очень удобно, бо куча строк в которой повторяется данные шапки.
В принципе можно запросить отдельно шапку и отдельно табличную часть. Но народ сказал фу, типа не кошерно однако.
Разные конструкторы 1С предлагают такой запрос сварганить.

ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка,
    РеализацияТоваровУслуг.Номер,
    РеализацияТоваровУслуг.Дата,
    РеализацияТоваровУслуг.Товары.(
        Номенклатура,
        Количество
    )
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
    РеализацияТоваровУслуг.Ссылка = &Док

Этот красивше, и обрабатывать выборку тоже удобно. Но блин где-то я туплю, в скобках типа вложенный же запрос получается. А это однако не есть хорошо как тут народ рассказывает.
Ну и вариант от особо одарённых. То бишь от меня, это меня тут на форуме плохому научили уже.

ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка,
    РеализацияТоваровУслугТовары.Ссылка.Номер,
    РеализацияТоваровУслугТовары.Ссылка.Дата,
    РеализацияТоваровУслугТовары.Количество,
    РеализацияТоваровУслугТовары.Номенклатура
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка = &Док

Как бы на выходе все тоже что и в первом варианте. Но вот тут типа запрос через точку, РеализацияТоваровУслугТовары.Ссылка.Номер, РеализацияТоваровУслугТовары.Ссылка.Дата, который по идее тоже самое левое соединении и сделает. Вопрос одно на все или отдельный запрос на каждую строку я так и не понял. Одно понял бъют за такое по рукам.
В общем как оно  должно быть правильно однако? Это простой пример, щас расскажите и я покруче зайду.
 
 
   PLUT
 
1 - 02.11.16 - 10:20
(0) "ну у вас и запросы" - сказала база данных и повесилась
   PLUT
 
2 - 02.11.16 - 10:21
кури вот такие запросы

http://catalog.mista.ru/profile/28527/
   Масянька
 
3 - 02.11.16 - 10:22
(1) Чего? Это - запросы?!
Вот Сворачивание строк в ТОРГ12. УТ 11.2 (разверни нулевой пост) - это запросы...
   Web00001
 
4 - 02.11.16 - 10:22
(1)хз, третий запрос  как запрос, чо тут не так то?
   Масянька
 
5 - 02.11.16 - 10:23
(4) Маловато будет...
   Web00001
 
6 - 02.11.16 - 10:23
(3)Автозаполнение дока начислениеЗП или табеля в ЗуП посмотри, там еще веселее.
   bizon2008
 
7 - 02.11.16 - 10:24
(4) Ну так типа тама через точку. А это вроде как фигня.
   bizon2008
 
8 - 02.11.16 - 10:24
(2) Я вот решил от печки. Но покурим, спасибо.
   Масянька
 
9 - 02.11.16 - 10:24
(6) Да видела я... Ты еще предложи поколупать расчет ЗП...
Наезд (однозначно) не по делу.
   Web00001
 
10 - 02.11.16 - 10:26
(9)В каком месте, тут наезд?
 
 Рекламное место пустует
   bizon2008
 
11 - 02.11.16 - 10:27
Так народ, давай без изменения у кого длиннее. Запрос, а не то что вы подумали.
Какой вариант кошерней? Я щас полей добавлю.
   Масянька
 
12 - 02.11.16 - 10:28
(10) В (1)
   Масянька
 
13 - 02.11.16 - 10:29
(11) А чё "народ"-то?
   bizon2008
 
14 - 02.11.16 - 10:30
(13) Ну люди, человеки тама.
   Дарлок
 
15 - 02.11.16 - 10:30
(11) если в первом варианте левое заменить на внутреннее, то он будет равнозначен 3тьму. Просто в 3м за тебя платформа произведет преобразование "РеализацияТоваровУслугТовары.Ссылка.Номер" в соединение
   ptiz
 
16 - 02.11.16 - 10:33
(0) "В принципе можно запросить отдельно шапку и отдельно табличную часть." - как раз самый кошерный вариант
   bizon2008
 
17 - 02.11.16 - 10:36
(16) Народ на груди тельняшку рвал, что запрос должен быть только один.
   piter3
 
18 - 02.11.16 - 10:37
выбрать док,к нему левым соединением ТЧ.Все.А кто рвал пусть и поясняет
   bizon2008
 
19 - 02.11.16 - 10:38
Я вот еще такой нарисовал, но блин как к первому запросу обратится шоб выборку получить никак не нагуглю однако.


ВЫБРАТЬ
    РеализацияТоваровУслуг.Ссылка,
    РеализацияТоваровУслуг.Номер,
    РеализацияТоваровУслуг.Дата
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
    РеализацияТоваровУслуг.Ссылка = &Док
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка,
    РеализацияТоваровУслугТовары.Номенклатура,
    РеализацияТоваровУслугТовары.Количество
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка = &Док
   bizon2008
 
20 - 02.11.16 - 10:39
(15) Это пока мало, а когда их больше будет?
   bizon2008
 
21 - 02.11.16 - 10:39
(18) Не понял? Это как?
   Lexey_
 
22 - 02.11.16 - 10:40
(19) ВыполнитьПакет()
   piter3
 
23 - 02.11.16 - 10:42
ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Количество
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО (РеализацияТоваровУслуг.Ссылка = РеализацияТоваровУслугТовары.Ссылка)
ГДЕ
    РеализацияТоваровУслуг.Ссылка = &Ссылка
   bizon2008
 
24 - 02.11.16 - 10:43
Ладно усложняем задачу. Товарищ, племяш который, тут писал.
Функция ПолучитьДанныеОрганизации() 
    
    ДанныеОрганизации = Новый Структура;
    
    Док = СсылкаНаОбъект.ПолучитьОбъект();
        
    ДанныеОрганизации.Вставить("НаименованиеПолное", Док.Организация.НаименованиеПолное);
    ДанныеОрганизации.Вставить("Адрес", ПолучитьАдресОбъекта(Док.Организация));
    ДанныеОрганизации.Вставить("АдресРазгрузки", ПолучитьАдресОбъекта(Док.алкПунктРазгрузкиОрганизации));

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

КонецФункции

Зафукали же однако.
   bizon2008
 
25 - 02.11.16 - 10:44
(22) Не тупой, это я нашел. А вот как сказать это из первого пакета тянуть, а это из второго.
   bizon2008
 
26 - 02.11.16 - 10:44
(23) Дык у меня тож самое, первый вариант однако.
   piter3
 
27 - 02.11.16 - 10:46
(25) Результаты[ВсегоРезультатов - 2].Выгрузить().
где Результаты=Запрос.ВыполнитьПакет()
ВсегоРезультатов =Результаты.Количество()
   Lexey_
 
28 - 02.11.16 - 10:47
(25) Описание:

Последовательно выполняет все запросы и возвращает массив результатов для каждого запроса из пакета. Результаты помещаются в массив в последовательности расположения запросов в тексте пакета.
   piter3
 
29 - 02.11.16 - 10:47
(26)просмотрел,я лично предпочитаю выбрать док в ВТ,а уж потом левым соединением ТЧ.
   bizon2008
 
30 - 02.11.16 - 10:50
(29) Логично, туда можно усю шапку запихать.
Но получается опять все кучей на выходе идет.
   piter3
 
31 - 02.11.16 - 10:52
(30)а почему нельзя один запрос по шапке,обошел вывел..потом отдельный запрос по тч,обошел и вывел.
   bizon2008
 
32 - 02.11.16 - 10:55
(27) (28) Чето я торможу на поворотах.
Это типа такого можно писать?

МассивРезультатов = Запрос.ВыполнитьПакет();

Выборка1 = МассивРезультатов[0].Выбрать()//Первый пакет


Если Выборка1.Следующий() Тогда
//Тут крутим выборку 1

КонецЕсли;

Выборка2 = МассивРезультатов[1].Выбрать()//Второй пакет


Если Выборка2.Следующий() Тогда
//Тут крутим выборку 2

КонецЕсли;
   bizon2008
 
33 - 02.11.16 - 10:58
(31) Тут меня народ в код тыкал носом, и приговаривал что запрос должен быть один, пусть даже и пакетный.
Вот два куска аналогичного по фукционалу кода. Чей лучший?
 
 
   piter3
 
34 - 02.11.16 - 10:58
(32) Да
   Dmitrii
 
35 - 02.11.16 - 10:58
(16) >> запросить отдельно шапку и отдельно табличную часть." - как раз самый кошерный вариант

Кошерный он для печати одного документа.
При пакетной печати - это будет самый ущербный вариант.

В современных типовых 1С исповедует в БСП в подсистеме Печать универсальный подход, позволяющий печатать массивы объектов. При печати одного объекта массив состоит из единственного элемента.
   Dmitrii
 
36 - 02.11.16 - 11:00
(31) Почему нельзя? Можно.  При пакетной печати имеем лишние запросы в цикле (их там и так дофига - для получения всяких реквизитов и ответственных лиц).
   bizon2008
 
37 - 02.11.16 - 11:00
(34) Блин, тогда тогда у меня уже четыре варианта как запросы писать.
   bizon2008
 
38 - 02.11.16 - 11:02
(36) А гляньте на кусочек кода в (24), коли не в тягость, это как в один запрос запихать то.
   Dmitrii
 
39 - 02.11.16 - 11:08
(38) И в чем там проблема?
Ну будет два раза регистр контанктной информации в запросе - один раз для получения адреса организации, а второй - для адреса алкПунктРазгрузкиОрганизации.
   Dmitrii
 
40 - 02.11.16 - 11:16
+ к (39) типа такого что-то (контактная информация в ТЧ, а не в РС):

 ВЫБРАТЬ
   РеализацияТоваровУслуг.Ссылка КАК Ссылка,
   РеализацияТоваровУслуг.Контрагент КАК Контрагент,
   КонтрагентыКонтактнаяИнформацияМестоПогрузки.Представление КАК Адрес,
   КонтрагентыКонтактнаяИнформация.Представление КАК АдресДоставки
 ИЗ
   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
     ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
       ПО (РеализацияТоваровУслуг.Контрагент = КонтрагентыКонтактнаяИнформация.Ссылка
          И КонтрагентыКонтактнаяИнформация.Тип = &ТипАдресКонтрагента)
      ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформацияМестоПогрузки
       ПО (РеализацияТоваровУслуг.Контрагент = КонтрагентыКонтактнаяИнформацияМестоПогрузки.Ссылка
         И КонтрагентыКонтактнаяИнформацияМестоПогрузки.Тип = &ТипАдресДоставки)
   bizon2008
 
41 - 02.11.16 - 11:34
(39)Там четыре раз адрес нужно вытаскивать.
   bizon2008
 
42 - 02.11.16 - 11:36
КонтактнаяИнформация это регистр сведений.
   piter3
 
43 - 02.11.16 - 11:36
(36)А где написано за пакетную?
   HardBall
 
44 - 02.11.16 - 11:38
(0) За
ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка,
    РеализацияТоваровУслугТовары.Ссылка.Номер,
    РеализацияТоваровУслугТовары.Ссылка.Дата,
    РеализацияТоваровУслугТовары.Количество,
    РеализацияТоваровУслугТовары.Номенклатура
ИЗ 
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары 
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка = &Док

никто по рукам не бьет. Платформа сама сгенерирует внутреннее соединение.
   Я не курил
 
45 - 02.11.16 - 11:42
+ за 3 вариант
   odines
 
46 - 02.11.16 - 11:46
(0) вот так у человека и форматируются мозги под 1С, вспоминаю как слово "контрагент" недоумение вызывало)
в (44) ответ
   Dmitrii
 
47 - 02.11.16 - 11:46
(43) >> А где написано за пакетную?

А где написано, что печатная форма только для одноразовой поштучной печати?
БСП (встроенная во все современные типовые) подразумевает универсальный подход с возможностью печатать пакетно.
   piter3
 
48 - 02.11.16 - 11:49
(47) Ты про 3,я о 2.0.Угу пробовали мы с бсп попечатать...
   Dmitrii
 
49 - 02.11.16 - 11:49
(41) >> Там четыре раз адрес нужно вытаскивать

Да хоть сорок четыре. Какая разница?
Лучше получить всё одним запросом, чем четыре раза вызывать процедуру, которая сделает четыре раза (при каждом вызове) отдельный запрос.
 
 Рекламное место пустует
   Dmitrii
 
50 - 02.11.16 - 11:52
(48) Где в условиях версии?
А чего бы не поговорить о печати в какой-нибудь клюшечной конфе?
Нравиться - не нравиться. Но все типовые идут на УФ со встроенной БСП.
   Dmitrii
 
51 - 02.11.16 - 11:55
(42) >> КонтактнаяИнформация это регистр сведений.

Пример приведен для того, чтобы суть показать.
У меня нет под рукой конфы, где КИ в РС. Замени в моем примере "Справочник.Контрагенты" на "РегистрСведений" и в условиях соединений "Контрагент=Ссылка" на "Контрагент=Объект" (ну или какое там измерение хранит объект).
   bizon2008
 
52 - 02.11.16 - 11:58
(51) Это я понял, соединений у меня многовато получается.
   piter3
 
53 - 02.11.16 - 11:59
(50)пока писем нет еще могу согласиться,ну да ладно топик не об этом
   Dmitrii
 
54 - 02.11.16 - 12:05
(52) В общем случае 4 соединения лучше 4-х отдельных запросов. К тому же можно предварительно вытащить всю КИ по нужному контрагенту во временную таблицу, а уже потом строить соединение к ней.
   FIXXXL
 
55 - 02.11.16 - 12:05
(52) лучше один раз много соединений, чем запрос в цикле или 4 раза дергать базу
   DrZombi
 
56 - 02.11.16 - 12:07
(0) >>>> ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

Убери, через ссылку уже оно доступно.
   DrZombi
 
57 - 02.11.16 - 12:09
(11) Лучше последний
Но 1С любит всегда писать два различных запроса.
1. По шапке документов
2. По табличным частям.
   DrZombi
 
58 - 02.11.16 - 12:11
+ ВЫБРАТЬ
    РеализацияТоваровУслуг.Товары.(
        Номенклатура,
        Количество 
    )
ИЗ 
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг 


В результате вам выплюнет выборка одну строку с ТЗ "Товары" :)
   DrZombi
 
59 - 02.11.16 - 12:12
+ Где-то читал, что данный способ памяти кушает много, не рекомендую на больших объемах информации
   bizon2008
 
60 - 02.11.16 - 14:45
В идеале получается делать пакетный, и шапка отдельно, и табличная час сама по себе. И отлаживать легко. А перебор выборки тоже простой получается.
Шапку можно в цикле загонять в соответствие, а табличную часть в тз и в соответствие.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует