Имя: Пароль:
1C
 
Спецы, посоветуйте Мане, как программировать на 1С
0 Maniac
 
22.11.17
18:29
Как один огромный запрос, в котором запрос в которм штук 10 запросов с разных регистров.

Разбить на отдельные тексты запросов, с одними и теми же отборами (построитель на 1С УТ10)

И взатем чтобы все в кучу собрать нормально.
Выгрузки в таблицы и прочее не предлагать.
1 Maniac
 
22.11.17
18:30
уже даже не 10 даже запросов а штук 15. текст запроса сейчас на километр.
Плюс там куча всяких параметров, разрывов текста и прочее.
Что его даже в конструкторе уже не отрыть.
И все больше и больше хотят.
Вот тока что еще два запроса в этот же запрос закинул с новыми данными.
2 1c-bs
 
22.11.17
18:41
Временные таблицы уже предлагали?
3 Diman000
 
22.11.17
18:43
Цель какая?
Повышение производительности или читабельности?
4 nordbox
 
22.11.17
18:45
ИМХО может как то так?

Функция СформироватьЗапрос(<твои параметры>)
ТЗ= Новый ТаблицаЗначений;

Запрос    = Новый Запрос;
    Запрос.Текст    = "ВЫБРАТЬ
..........
...........
ТЗ= Запрос.Выполнить().Выгрузить();
Возврат ТЗ;
КонецФукции

И так кучу маленьких запросов
потом собрать в кучу всё
5 Denis_CFO
 
22.11.17
18:51
(0) Если чисто текст разбить - раздели как хочешь, а потом собери ТекстЗапроса = ТекстЗапроса + ТекущийТекст.
Запрос.Текст = ТекстЗапроса;
Потом спПараметры = Запрос.НайтиПараметры;
Для каждого мПар Из спПараметры Цикл
  //значение параметра
КонецЦикла

А вообще вот штука полезная есть: http://catalog.mista.ru/public/617990/

Неужели Maniac такого не знает???

Или я вопроса не понял?
6 nordbox
 
22.11.17
18:53
Можно поиграться по другому
Функция ТекстЗапроса()

Запрос    = Новый Запрос;
    Запрос.Текст    = "ВЫБРАТЬ
..........
...........

Возврат Запрос;
КонецФукции

Процедура ВыполнитьЗапрос(параметры)
ТЗ=ТекстЗапроса()
.....
<параметры>
ТЗ.Выполнить()

КонецПроцедуры
7 Maniac
 
22.11.17
18:55
(3) все вместе взятое.
8 nordbox
 
22.11.17
19:03
Вот так наверное будет правильнее
Функция ТекстЗапроса1() // и куча таких маленьких запросов
    Текст    = "ВЫБРАТЬ
..........
...........
    Возврат Текст;
КонецФункции
Процедура ВыполнитьЗапрос(параметры)
ТЗ=Новый Запрос;
ТЗ=ТекстЗапроса1()+ТекстЗапроса2();
.....
<параметры>
ТЗ.Выполнить()
КонецПроцедуры
9 1c-bs
 
22.11.17
19:04
(8) А параметры? А данные результатов выполнения других подзапросов?
10 mistеr
 
22.11.17
19:05
(0) Освоить наконец СКД. Там использовать объединение наборов данных. Отборы будут применяться к каждому запросу.
11 nordbox
 
22.11.17
19:06
(9) Я же сказал поиграться )) это как идея ))
а дальше чисто полет фантазии
12 nordbox
 
22.11.17
19:07
+11 можно каждый запрос в отдельности выполнять а потом выгружать уже в общую таблицу
в общем как нДравится )
13 Maniac
 
22.11.17
19:09
(10) вариант.
14 Maniac
 
22.11.17
19:11
(12) плохой вариант.

Ибо фишка в условиях. Например база у человека со 100 000 товаров.
Если мы ставим условие остаток больше 0 (один запрос)
и продажи больше 0 (второй запрос)
то в случае одного запроса мы получим таблицу где условие удовлетворяет обоим условиям.
15 Maniac
 
22.11.17
19:13
(10) а если в одном наборе остатки а в другом наборе продажи.

Эти наборы выберут только товары у которых были продажи и есть остатки. А не все остатки или не все продажи.

а) нам не нужны товары у которых нет остатка, но есть продажи (те исключить даже те у которых он есть но нет продажи)
б) нам не нужны проданные товары у которых нет остатка (те даже если продажа была, вывести только те у которых есть остаток)
16 nordbox
 
22.11.17
19:23
Погоди, что то не понятно
например:
Остаток=0 Продажи=5
Продажи=5 Остаток=0
эти товары исключить
Но эти условия одинаковы
Так что ли ?
или я что то не так понял?
17 mistеr
 
22.11.17
19:26
(15) Без отбора выберут все остатки и все продажи.

Называешь поля Остаток и СуммаПродаж одинаково и ставишь один отбор на два запроса.

Называешь поля Остаток и СуммаПродаж по-разному и ставишь отборы как хочешь.
18 Maniac
 
22.11.17
20:18
(16) тогда в итоге 0

Остаток=0 Продажи=5
Остаток=1 Продажи=5
Остаток=5 Продажи=0

Итог

Остаток=1 Продажи=5
19 4St
 
23.11.17
09:11
(1) Если надо протащить одни и те же параметры в несколько запросов/подзапросов одной большой простыни, и состав этих параметров постоянно меняется, то можно сделать как-то так.

1. В текстах запросов нужные параметры задаем в виде
выбрать ....
из ...
Где ...
И &НашНаборПараметров

(и так в каждом запросе)

2. Запрос.Текст = СтрЗаменить(Запрос.Текст, "&НашНаборПараметров", "Номенклатура = &Номенклатура И Контрагент = &Контрагент");
20 RomaH
 
naïve
23.11.17
09:20
схему запроса не смотрел?
21 VladZ
 
23.11.17
09:22
(0) Где можно запрос посмотреть?
22 VladZ
 
23.11.17
09:25
Ха-ха... Кто ветку переименовал? "Спецы, посоветуйте Мане, как программировать на 1С" - прикольное название ветки. :)
23 ildary
 
23.11.17
09:25
(21) бойтесь своих желаний - иногда они сбываются
24 Serg_1960
 
23.11.17
09:40
Типовая УПП:

   ТекстЗапроса = ТекстЗапроса_Материалы;
   ТаблицаЗатрат = ПолучитьТаблицуЗатратДляПечатиИЗаполненияДокументов(СсылкаНаОбъект, ТекстЗапроса, СтруктраПараметров);
...

Функция ПолучитьТаблицуЗатратДляПечатиИЗаполненияДокументов(ДокументСсылка, ТекстЗапроса, СтруктраПараметров)

   Запрос = Новый Запрос();
   Запрос.Текст = ТекстЗапроса;
...    
   Если глЗначениеПеременной("ИспользоватьРасширеннуюАналитикуУчетаНоменклатурыИЗатрат")
      И (глЗначениеПеременной("ДатаНачалаИспользованияРасширеннойАналитикиУчетаНоменклатурыИЗатрат") <= ДокументСсылка.Дата) Тогда
      ДополнитьЗапросЗатратамиРасширеннаяАналитика(ДокументСсылка, Запрос, ВидУчета, КоэффициентПересчетаВВалюту);
   Иначе
      ДополнитьЗапросЗатратамиПартионныйУчет(ДокументСсылка, Запрос, ВидУчета, КоэффициентПересчетаВВалюту);
   КонецЕсли;    
...

PS: надеюсь я ответил на вопрос автора :)
25 ptiz
 
23.11.17
09:41
(0) Пригласить программиста.
26 Волшебник
 
модератор
23.11.17
09:42
(25) Или таксиста-программиста
27 xxTANATORxx
 
23.11.17
09:45
(0)смотрите как в ЗУПе 3.1 сделано
28 Balabass
 
23.11.17
09:50
(0) Следи за кармой - делай читабельно и понятно.
29 ildary
 
23.11.17
09:51
(26) бетонщика помню, геодизист был в этом году, на днях появился программист-обнюхивальщик. А когда был таксист? Или это история как Маньяк знакомого учил?
30 GANR
 
23.11.17
09:53
(0) Я считаю, что первопричиной громоздких запросов являются не очень хорошо подходящие под прикладную задачу структуры данных. Пока от них не избавишься - хороших запросов не видать как своих ушей, имхо.
31 DrShad
 
23.11.17
09:54
текст запроса в студию - думаю там много лишнего
32 arsik
 
гуру
23.11.17
09:58
(0) Разработка через выгрузку во временные таблицы. В продакшен все собирается в один запрос.
Ну и по крайней мере привести к виду что бы конструктор открывал.
33 nordbox
 
23.11.17
09:58
34 pavig
 
23.11.17
10:00
(0)
Если цель тоьлко в отборах то используй СКД - это лучший вариант.
Если цель повысить читабельность - то используй ВТ типа как в ЗУПе - куча запросов с одним менеджером временных таблиц.
35 DrShad
 
23.11.17
10:03
(34) если Маня ни разу не юзал СКД, прикинь как он намучается с отборами на разных уровнях СКД?   ))))
36 Denis_CFO
 
23.11.17
10:04
(26) "Или таксиста-программиста"
Сначала прочитал как "Таксидермиста" :))
37 ildary
 
23.11.17
10:06
(34) не знаю как в ЗУП-е, но в УТ11 куча куча запросов с одним менеджером временных таблиц - ни разу не читабельно, а в отладке вообще ужас.
38 DrShad
 
23.11.17
10:06
(37) все нормально отлаживается при наличии прямых рук
39 ptiz
 
23.11.17
10:07
(27) +
И так не делайте
40 mehfk
 
23.11.17
10:07
(37) ирПортативные в помощь.
41 DrShad
 
23.11.17
10:09
(40) в УТ 11!? ха-ха три раза
42 Timon1405
 
23.11.17
10:09
(37)  ОбщегоНазначенияУТ.ПоказатьВременнуюТаблицу(...)
43 DrShad
 
23.11.17
10:10
(42) +1
если даже таковой нет, можно свою написать - там всего 4 строчки
44 тарам пам пам
 
23.11.17
10:12
(43) Последние версии платформы умеют показывать ВТ даже без снятия режима совместимости. МенеджерВременныхТаблиц.Таблицы.Найти("втНоменклатура").ПолучитьДанные() можно прямо в отладчике писать теперь.
45 ildary
 
23.11.17
10:14
(37) Они же не поддерживали УФ.

(38) Подскажите направление для учебы пожалуйста. Батарею для рук постараюсь сам найти. Или речь идёт о (42) и (43)?
46 patria0muerte
 
23.11.17
10:37
Там же кстати впилили в одном из релизов платформы - объектную модель запроса. Можно кодом текст собирать и вот это вот все.
47 DrShad
 
23.11.17
10:38
(45) именно, да и с менеджером теперь намного проще работать
48 Starhan
 
23.11.17
10:38
(37) сейчас (=в последних платформах) можно временные таблицы в отладке смотреть без всяких приблуд.
49 Starhan
 
23.11.17
10:40
блин опередили
50 ildary
 
23.11.17
10:42
(47) век живи, век учись, спасибо за науку!
51 ildary
 
23.11.17
10:46
(47) А можно подробности простоты работы с менеджером? Я кроме  возможности получить его таблицы в отладчике не нашел в справке?
52 patria0muerte
 
23.11.17
10:49
(51) У этой таблицы есть метод ПолучитьДанные(), который тебе возвращает РезультатЗапроса
53 ildary
 
23.11.17
10:55
(52) Функцию ПолучитьДанные() уже упоминали. Мне интересно, что скрывается под "да и с менеджером теперь намного проще работать"
54 DrShad
 
23.11.17
10:57
(53) ну к примеру вот

МенеджерВременныхТаблиц (TempTablesManager)
Таблицы (Tables)
Использование:

Только чтение.
Описание:

Тип: ВременныеТаблицыЗапроса.
Содержит временные таблицы, находящиеся в менеджере.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
55 ildary
 
23.11.17
11:02
(54) понял, спасибо!
56 DexterMorgan
 
23.11.17
11:22
(0) Кстати, в одной конторе, году так в 11ом купили твое рм по закупкам, помнится там был ДС в котором куча ОБЪЕДИНИТЬ, когда всех пользователей запустили в базу тормозило нереально. В итоге аналитические показатели (типа средние продажи за период и т.д.) вынесли в отдельный РС, который заполнялся рег заданием раз в сутки, по-другому никак имхо.
57 DexterMorgan
 
23.11.17
11:24
(56) + оперативные (типа остатков) соединяли с этим РС, на 500+ пользователей норм работало
58 DexterMorgan
 
23.11.17
11:27
А по сабжу, чем СхемаЗапроса не подходит?
59 Fish
 
23.11.17
11:28
(0) А что, разве твой мегапрайс не умеет этого делать? :)
60 d4rkmesa
 
23.11.17
11:52
(0) (1) Заюзай схему запроса. Разрывы текста и нечитаемый запрос для конструктора - обычно, плохой стиль, ну да мне ли Маниака учить. Лучше схему запроса изначально запилить, раз уж хочешь отдельно кучу маленьких запросов править. Также, если есть текст запроса, с помощью схемы можно добавить отбор и все-все-все, муторно немного, правда.
61 d4rkmesa
 
23.11.17
11:58
Примитивный пример добавления отбора в один из запросов из пакета(с объединением из нескольких таблиц документов):
Процедура ДобавитьОтборВТекстЗапросаПоДокументам(ТекстЗапроса, ПолеОтбора, ИмяПараметраЗапроса = "")
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
    Для Каждого СтрОператоры Из СхемаЗапроса.ПакетЗапросов[0].Операторы Цикл
        Для Каждого СтрИсточники Из СтрОператоры.Источники Цикл
            Если Найти(СтрИсточники.Источник.ИмяТаблицы, ""Документ."") > 0 Тогда
                СтрОператоры.Отбор.Добавить(СтрИсточники.Источник.Псевдоним + ""."" + ПолеОтбора + "" = &"" + ИмяПараметраЗапроса);
            КонецЕсли;
        КонецЦикла;            
    КонецЦикла;
    ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
КонецПроцедуры
62 Efir12
 
23.11.17
12:01
(0) через объединение цеплял и привел к виду:
-значение;
-наименование колонки;
-ид поля для сортировки;
-имя таблицы данных;
-группировки.

Выводил в скд кросс таблицу - в строках группировки в колонках  поле "Наименование колонки",  "значение" в ресурсы.

Благодаря этому изврату получился отчет на 60 колонок малой кровью) ибо даже в скд перспектива тыкать столько полей мне не улыбалась.
63 Maniac
 
23.11.17
12:05
Вы не учитываете одного, что сейчас отборы на форме это таблица от построителя. Обычные формы.
Они все автоматически помещаются в таблицу исходя из запроса - просто вытаскиваем на форму таблицу обьекта построитель. и получаем все отборы что в нем были установлены.

Короче я понял что все усложнится еще больше чем просто простынь одного запроса в котором. все.
Хотя бы так читать его можно, а не лазить по куче процедур и разрывов.
64 Maniac
 
23.11.17
12:06
ладно фиг с ним пусть остается как есть. я не готов еще месяц потратить на то чтобы переписывать написанное.
Трудозатраты не очевидны.
65 Admin_Net_1C
 
23.11.17
12:11
(0) аналогичная ситуация: нужно в запрос, который формируется программно, передать отборы построителя из формы настроек. Всю голову сломал, пока не придумал варианта...(
66 Ёпрст
 
23.11.17
12:16
(65)

    ПостроительОтчета1= Новый ПостроительОтчета(ТекстЗапроса);
    ПостроительОтчета1.УстановитьНастройки(ПостроительОтчета.ПолучитьНастройки());
    
    //Получаем запрос со всеми настройками из построителя
    ЗапросПостроителя     = ПостроительОтчета1.ПолучитьЗапрос();
    //Устанавливаем параметры из построителя в текст запроса
    Для каждого Парам Из ЗапросПостроителя.Параметры Цикл
        Запрос.УстановитьПараметр(Парам.Ключ,Парам.Значение);  
    Конеццикла;     
    ТекстЗапросаПостроителя = ЗапросПостроителя.Текст;
    
    Запрос.Текст  = ТекстЗапросаПостроителя;
67 Ёпрст
 
23.11.17
12:18
+66
ПостроительОтчета - реквизит с типом ПостроительОтчета, на форме валяется табличноеПоле с источником - ПостроительОтчета.Отбор

Запрос = Новый Запрос;

При желании, можно лепить временные таблички через "обманки".
68 mistеr
 
23.11.17
14:51
(63) Переходи на СКД, там все почти так же. Вместо отборов построителя будут отборы СКД на форме.
69 Maniac
 
23.11.17
15:10
(68) только в СКД нельзя делать выборку программную. с группировками и прочее
70 Злопчинский
 
23.11.17
16:18
Клиент хочет универсальный инструмент, который быстр эффективен и удобен? Три раза хаха. Это очень редкий зверек.
71 Вафель
 
23.11.17
16:24
(69) можно. но 1 раз придется попотеть
72 Вафель
 
23.11.17
16:25
как вариант по отбору формировать некую табличку договорв/товаров/итд и по ней уже делать остальные запросы
73 Ц_У
 
23.11.17
16:30
(0) Пиши в запросе 1=1, 2=2 и т.д.
В конце меня СтрЗаменить(Запрос.Текст,"1=1","Контрагент=&Контрагент")
И в конструкторе откроется и условия в одном месте будут
74 Вафель
 
23.11.17
16:35
(73) тогда уж лучше
&Контрагент=&Контрагент
75 mehfk
 
23.11.17
17:35
(41) А что "Ха"?
76 DrShad
 
23.11.17
17:37
(69) а я не знал и делал, пойду выпью яду
77 wt
 
23.11.17
18:15
А чего не взять пример с 1с. Рассчитать промежуточные итого и хранить их где либо. Как бухитоги например.
78 sdf
 
23.11.17
18:46
(34) (27)  +1 за ВТ и МВТ.
программисты ЗУП3 дают хороший пример программирования запросов
79 Admin_Net_1C
 
24.11.17
06:28
(66)(67) спасибо, то что нужно! Ёпрс - реал профи )
80 Адинэснег
 
24.11.17
08:10
81 Ёпрст
 
24.11.17
10:22
(79) в ПриОткрытии, так можешь еще влепить

Процедура ПриОткрытии()
    ПостроительОтчета.Текст="ВЫБРАТЬ
    |    0 КАК Шняга
    |{ГДЕ
    |   0 как Процент,
//  |    (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяССылка)).* КАК Склад,
    |    (ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяССылка)).* КАК Номенклатура,
//  |    (ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПустаяССылка)).* КАК Бренд,
    |    (ЗНАЧЕНИЕ(Справочник.Организации.ПустаяССылка)).* КАК Организация,
//  |    (ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяССылка)).* КАК ТипЦен,
//    |    (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент,
    |    (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент,
//    |    (ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяССылка)).* КАК ТорговыйПредставитель
    |    (ЗНАЧЕНИЕ(Документ.реализацияТоваровУслуг.ПустаяССылка)).* КАК Регистратор
    |    }";
    ДоступныеПоляОтбора = ПостроительОтчета.Отбор.ПолучитьДоступныеПоля();
    Для каждого Поле ИЗ ДоступныеПоляОтбора Цикл
        Поле.Отбор = Истина;
    КонецЦикла;
    Отбор = ПостроительОтчета.Отбор;
    Если Отбор.Найти("Регистратор") = Неопределено Тогда
        Отбор.Добавить("Регистратор");
    КонецЕсли;
    Если Отбор.Найти("Номенклатура") = Неопределено Тогда
        Отбор.Добавить("Номенклатура");
    КонецЕсли;
КонецПроцедуры


Если используешь сохранение/восстановление настроек, то сохраняй как

СтруктураСНастройками.Вставить("Построитель",ПостроительОтчета.ПолучитьНастройки());

и восстанавливай потом как

ПостроительОтчета.УстановитьНастройки(СтруктураСНастройками.Построитель);


если нужны временные таблицы в запросе, например, из ТЗ, то
лепи запрос обманку для построителя и заменяй его нормальным текстом для запроса