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


1С:Предприятие ::

Метки: 

Спецы, посоветуйте Мане, как программировать на 1С

Я
   Maniac
 
22.11.17 - 18:29
Как один огромный запрос, в котором запрос в которм штук 10 запросов с разных регистров.

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

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

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

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

КонецЦикла

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

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

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

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

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

КонецПроцедуры
   Maniac
 
7 - 22.11.17 - 18:55
(3) все вместе взятое.
   nordbox
 
8 - 22.11.17 - 19:03
Вот так наверное будет правильнее
Функция ТекстЗапроса1()// и куча таких маленьких запросов

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

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

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

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

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

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

Итог

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ПостроительОтчета1= Новый ПостроительОтчета(ТекстЗапроса);
    ПостроительОтчета1.УстановитьНастройки(ПостроительОтчета.ПолучитьНастройки());
    
    //Получаем запрос со всеми настройками из построителя

    ЗапросПостроителя     = ПостроительОтчета1.ПолучитьЗапрос();
    //Устанавливаем параметры из построителя в текст запроса

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

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

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

Процедура ПриОткрытии()
    ПостроительОтчета.Текст="ВЫБРАТЬ
    |    0 КАК Шняга
    |{ГДЕ
    |   0 как Процент,
//  |    (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяССылка)).* КАК Склад,

    |    (ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяССылка)).* КАК Номенклатура,
//  |    (ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПустаяССылка)).* КАК Бренд,

    |    (ЗНАЧЕНИЕ(Справочник.Организации.ПустаяССылка)).* КАК Организация,
//  |    (ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяССылка)).* КАК ТипЦен,

//    |    (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент,
    |    (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент,
//    |    (ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяССылка)).* КАК ТорговыйПредставитель

    |    (ЗНАЧЕНИЕ(Документ.реализацияТоваровУслуг.ПустаяССылка)).* КАК Регистратор
    |    }";
    ДоступныеПоляОтбора = ПостроительОтчета.Отбор.ПолучитьДоступныеПоля();
    Для каждого Поле ИЗ ДоступныеПоляОтбора Цикл
        Поле.Отбор = Истина;
    КонецЦикла;
    Отбор = ПостроительОтчета.Отбор;
    Если Отбор.Найти("Регистратор") = Неопределено Тогда
        Отбор.Добавить("Регистратор");
    КонецЕсли;
    Если Отбор.Найти("Номенклатура") = Неопределено Тогда
        Отбор.Добавить("Номенклатура");
    КонецЕсли;
КонецПроцедуры


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

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

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

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


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



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