|
Спецы, посоветуйте Мане, как программировать на 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 как Процент, // | (ЗНАЧЕНИЕ(Справочник.Склады.ПустаяССылка)).* КАК Склад, | (ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяССылка)).* КАК Номенклатура, // | (ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПустаяССылка)).* КАК Бренд, | (ЗНАЧЕНИЕ(Справочник.Организации.ПустаяССылка)).* КАК Организация, // | (ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.ПустаяССылка)).* КАК ТипЦен, // | (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент, | (ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяССылка)).* КАК Контрагент, // | (ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяССылка)).* КАК ТорговыйПредставитель | (ЗНАЧЕНИЕ(Документ.реализацияТоваровУслуг.ПустаяССылка)).* КАК Регистратор | }"; ДоступныеПоляОтбора = ПостроительОтчета.Отбор.ПолучитьДоступныеПоля(); Для каждого Поле ИЗ ДоступныеПоляОтбора Цикл Поле.Отбор = Истина; КонецЦикла; Отбор = ПостроительОтчета.Отбор; Если Отбор.Найти("Регистратор") = Неопределено Тогда Отбор.Добавить("Регистратор"); КонецЕсли; Если Отбор.Найти("Номенклатура") = Неопределено Тогда Отбор.Добавить("Номенклатура"); КонецЕсли; КонецПроцедуры Если используешь сохранение/восстановление настроек, то сохраняй как СтруктураСНастройками.Вставить("Построитель",ПостроительОтчета.ПолучитьНастройки()); и восстанавливай потом как ПостроительОтчета.УстановитьНастройки(СтруктураСНастройками.Построитель); если нужны временные таблицы в запросе, например, из ТЗ, то лепи запрос обманку для построителя и заменяй его нормальным текстом для запроса |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |