![]() |
![]() |
![]() |
|
Произвольные выражения в запросах | ☑ | ||
---|---|---|---|---|
0
Ayvengo
16.06.11
✎
11:40
|
Можно ли в запросе каким-то образом обработать следующее:
ЗаказПокупателя[Реквизиты.Наименование] Реквизиты - это вложенный запрос т.е. если у меня Реквизиты.Наименование = "Дата", то в результате запроса я получу значение из ЗаказПокупателя.Дата |
|||
1
butterbean
16.06.11
✎
11:42
|
с текстом запроса можно делать все что угодно
|
|||
2
Рэйв
16.06.11
✎
11:45
|
ТекстЗапроса="
Выбрать ЗаказПокупателя."+Реквизиты.Наименование; |
|||
3
Ayvengo
16.06.11
✎
11:47
|
(1) = (2) не то...
запрос выглядит таким образом ВЫБРАТЬ ЗаказПокупателя[Реквизиты.Наименование] ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ НастройкаРезервированияТоваровСрезПоследних.Склад КАК Склад, НастройкаРезервированияТоваровСрезПоследних.ИмяРеквизитаДляПостановкиВРезерв КАК Наименование ИЗ РегистрСведений.НастройкаРезервированияТоваров.СрезПоследних КАК НастройкаРезервированияТоваровСрезПоследних) КАК Реквизиты ПО ЗаказПокупателя.СкладГруппа = Реквизиты.Склад |
|||
4
Ayvengo
16.06.11
✎
11:49
|
А не то, потому что у меня могут быть различные наименования реквизитов.
|
|||
5
Рэйв
16.06.11
✎
11:50
|
(4)Перебирай эти "различные и строй текст.В чем трудность то?
" |
|||
6
Fragster
гуру
16.06.11
✎
11:50
|
автор, изучай построитель и СКД, там это реализовано
|
|||
7
Ayvengo
16.06.11
✎
11:50
|
(6) это уже ближе к истине.
(5) трудность в том, что Вы не поняли что нужно |
|||
8
Рэйв
16.06.11
✎
11:53
|
(7)Скажи что у тебя такое Реквизиты.Наименование?
|
|||
9
Ayvengo
16.06.11
✎
11:53
|
(8) в запросе (3) показано, что это такое.
|
|||
10
Рэйв
16.06.11
✎
11:54
|
(9)Вот тут чтоли?
ЗаказПокупателя[Реквизиты.Наименование] А ты вкурсе что такая конструкция не летает? |
|||
11
Ayvengo
16.06.11
✎
11:55
|
А можно как-нибудь в запросе получить наименование реквизита? Метаданные его?
|
|||
12
Ayvengo
16.06.11
✎
11:55
|
(10) естественно знаю, потому и вопрос здесь задаю :)
|
|||
13
Рэйв
16.06.11
✎
11:55
|
(11)Неа. Нtkmpz
|
|||
14
Рэйв
16.06.11
✎
11:55
|
*Нельзя
|
|||
15
Рэйв
16.06.11
✎
11:56
|
у тебя же все равно фиксированный набор реквизитов в Реквизиты
Тебе чтоли просто лень все прописывать?:) |
|||
16
Ayvengo
16.06.11
✎
11:59
|
(15) ок, но у меня может быть не заказ покупателя, а какой-то другой документ ;) Просто я немного упростил...
Можно конечно так сделать, но это не правильно :( ВЫБРАТЬ ВЫБОР КОГДА (ВЫРАЗИТЬ(Реквизиты.Наименование КАК СТРОКА(100))) = "Дата" ТОГДА ЗаказПокупателя.Дата ИНАЧЕ 0 КОНЕЦ КАК Значение ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ НастройкаРезервированияТоваровСрезПоследних.Склад КАК Склад, НастройкаРезервированияТоваровСрезПоследних.ИмяРеквизитаДляПостановкиВРезерв КАК Наименование ИЗ РегистрСведений.НастройкаРезервированияТоваров.СрезПоследних КАК НастройкаРезервированияТоваровСрезПоследних) КАК Реквизиты ПО ЗаказПокупателя.СкладГруппа = Реквизиты.Склад |
|||
17
Ayvengo
16.06.11
✎
12:02
|
А не правильно, потому что наименование реквизиты может быть абсолютно любым, какой мы захотим получать в регистре НастройкаРезервированияТоваров
|
|||
18
Ayvengo
16.06.11
✎
12:02
|
+(17) и соответственно перебирать все возможные наименования реквизитов как-то не правильно, запрос будет довольно большой, а вдруг мы добавим новые метаданные и т.д. ...
|
|||
19
Fragster
гуру
16.06.11
✎
12:03
|
я так понял, это решается через характеристики в СКД
|
|||
20
Fragster
гуру
16.06.11
✎
12:03
|
но такая организация данных и взаимодействие - ПЦ
|
|||
21
le_
16.06.11
✎
12:04
|
(18) В (2) правильное решение.
|
|||
22
Ayvengo
16.06.11
✎
12:05
|
(20) почему?
|
|||
23
Fragster
гуру
16.06.11
✎
12:06
|
(22) перемес метаданных с данными
|
|||
24
Ayvengo
16.06.11
✎
12:06
|
(21) только в том случае, если я для каждого склада буду выполнять свой запрос.
|
|||
25
Fragster
гуру
16.06.11
✎
12:07
|
(23)+ вырастет гомункулус, который в определенный момент будет проще переписать, чем дополнить новыми функциями не поломав
|
|||
26
Ayvengo
16.06.11
✎
12:07
|
(23) не понимаю в чем "плохо"
|
|||
27
Рэйв
16.06.11
✎
12:09
|
(26)Чем сложнее система тем более подвержена глюкам и поломкам.Сравни молоток и микроскоп:)
Проще надо стараться все делать |
|||
28
Fragster
гуру
16.06.11
✎
12:11
|
(26) связанность того, что логически не должно быть связано. сильносвязанные системы очень сложно модифицировать
|
|||
29
Ayvengo
16.06.11
✎
12:11
|
Я как-раз упрощаю это:
ВЫБРАТЬ ВЫБОР КОГДА (ВЫРАЗИТЬ(Реквизиты.Наименование КАК СТРОКА(100))) = "Дата" ТОГДА ЗаказПокупателя.Дата ИНАЧЕ ВЫБОР КОГДА (ВЫРАЗИТЬ(Реквизиты.Наименование КАК СТРОКА(100))) = "ДатаОтгрузки" ТОГДА ЗаказПокупателя.ДатаОтгрузки ИНАЧЕ ВЫБОР КОГДА (ВЫРАЗИТЬ(Реквизиты.Наименование КАК СТРОКА(100))) = "ДатаОплаты" ТОГДА ЗаказПокупателя.ДатаОплаты ИНАЧЕ 0 КОНЕЦ КОНЕЦ КОНЕЦ КАК Значение ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ НастройкаРезервированияТоваровСрезПоследних.Склад КАК Склад, НастройкаРезервированияТоваровСрезПоследних.ИмяРеквизитаДляПостановкиВРезерв КАК Наименование ИЗ РегистрСведений.НастройкаРезервированияТоваров.СрезПоследних КАК НастройкаРезервированияТоваровСрезПоследних) КАК Реквизиты ПО ЗаказПокупателя.СкладГруппа = Реквизиты.Склад |
|||
30
Ayvengo
16.06.11
✎
12:12
|
Хотя запрос немного неправильный, "Дата" надо тоже выразить как строка 100
|
|||
31
Ayvengo
16.06.11
✎
12:14
|
Смысл в том, что таблицу, которая будет результатом этого запроса, мне будет проще анализировать, не нужно будет ее как-то программно еще перезаполнять и т.д.
|
|||
32
Ayvengo
16.06.11
✎
12:18
|
Можно таким образом сделать, но это понижает производительность...
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗаказПокупателя.Ссылка КАК Документ, | Реквизиты.Наименование КАК Реквизит |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | НастройкаРезервированияТоваровСрезПоследних.Склад КАК Склад, | НастройкаРезервированияТоваровСрезПоследних.ИмяРеквизитаДляПостановкиВРезерв КАК Наименование | ИЗ | РегистрСведений.НастройкаРезервированияТоваров.СрезПоследних КАК НастройкаРезервированияТоваровСрезПоследних) КАК Реквизиты | ПО ЗаказПокупателя.СкладГруппа = Реквизиты.Склад"; Результат = Запрос.Выполнить(); Таблица = Результат.Выгрузить(); Таблица.Колонки.Добавить("Значение"); Для каждого Строчка Из Таблица Цикл Строчка.Значение = Строчка.Документ[Строчка.Реквизит]; КонецЦикла; |
|||
33
Jstunner
16.06.11
✎
12:19
|
во-первых, для целей определения реквизита лучше использовать перечисление. Во вторых, если лень рисовать ВЫБОР КОГДА для всех значений, то можно сконструировать текст в цикле
|
|||
34
Fragster
гуру
16.06.11
✎
12:20
|
минимум:
ВЫБРАТЬ ВЫБОР КОГДА Реквизиты.Наименование = "Дата" ТОГДА ЗаказПокупателя.Дата КОГДА Реквизиты.Наименование = "ДатаОтгрузки" ТОГДА ЗаказПокупателя.ДатаОтгрузки КОГДА Реквизиты.Наименование = "ДатаОплаты" ТОГДА ЗаказПокупателя.ДатаОплаты ИНАЧЕ 0 КОНЕЦ КАК Значение ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ НастройкаРезервированияТоваровСрезПоследних.Склад КАК Склад, НастройкаРезервированияТоваровСрезПоследних.ИмяРеквизитаДляПостановкиВРезерв КАК Наименование ИЗ РегистрСведений.НастройкаРезервированияТоваров.СрезПоследних КАК НастройкаРезервированияТоваровСрезПоследних) КАК Реквизиты ПО ЗаказПокупателя.СкладГруппа = Реквизиты.Склад |
|||
35
Fragster
гуру
16.06.11
✎
12:21
|
ВЫБРАТЬ
ВЫБОР КОГДА Реквизиты.ИмяРеквизитаДляПостановкиВРезерв = "Дата" ТОГДА ЗаказПокупателя.Дата КОГДА Реквизиты.ИмяРеквизитаДляПостановкиВРезерв = "ДатаОтгрузки" ТОГДА ЗаказПокупателя.ДатаОтгрузки КОГДА Реквизиты.ИмяРеквизитаДляПостановкиВРезерв = "ДатаОплаты" ТОГДА ЗаказПокупателя.ДатаОплаты ИНАЧЕ 0 КОНЕЦ КАК Значение ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаРезервированияТоваров.СрезПоследних КАК Реквизиты ПО ЗаказПокупателя.СкладГруппа = Реквизиты.Склад |
|||
36
Fragster
гуру
16.06.11
✎
12:22
|
ибо непонятно, зачем убивать производительность вложенным запросом
|
|||
37
Ayvengo
16.06.11
✎
12:29
|
(33)во-первых, для целей определения реквизита лучше использовать перечисление. - уверены? Мне на каждый новый реквизит нужно держать в голове, что его еще надо добавить в перечисления?
(34) - длина наименования не ограничена, так что не подходит. либо надо менять длину у наименования в регистре :) Поэтому через выразить написал. (36) ну не знаю... у меня запрос в 2000+ строк спокойно выполняется за 5-7 секунд.. и там куча вложенных, думаю этак 5-7 уровней вложенность (не помню точно) .. |
|||
38
Fragster
гуру
16.06.11
✎
12:30
|
(37) если длина наименования не ограничена - это не хорошо.
|
|||
39
Ayvengo
16.06.11
✎
12:31
|
(38) это согласен, просто первоначально так сделал, а что бы запрос написать, пришлось через выразить :)
|
|||
40
Fragster
гуру
16.06.11
✎
12:33
|
(37) время выполнения, равно как и длина запроса слабо характеризуют оптимальность запроса. может этот запрос понтенциально 500 строк (улучшение читаемости => легкость модификации. например вложенные выборы убраны в (34))? или он может выполняться 1 секунду, из-за того, что в старом варианте не попадает в индексы что-то, но станет на 10% больше строк...
|
|||
41
Ayvengo
16.06.11
✎
12:36
|
(40) он не может выполняться 1с, и выполняется он столько же времени сколько выполняется одна его часть по регистру продаж, можете сами потестировать, но прироста производительности из-за использования вложенных запросов я не наблюдал.
Боюсь запрос в 500 строк тоже не особо читабелен :))) |
|||
42
Alexandr Puzakov
16.06.11
✎
12:37
|
Можно. Смотри в библиотеке стандартных подсистем в общем модуле ОбщегоНазначения функции ПолучитьЗначениеРеквизита() и ПолучитьЗначениеРеквизитов().
|
|||
43
Ayvengo
16.06.11
✎
12:37
|
(42) вы от куда? :)
|
|||
44
Fragster
гуру
16.06.11
✎
12:38
|
(41) ну давай кусок по регистру продаж, посмотрю. коньяк отправлять почтой до востребования
|
|||
45
Aprobator
16.06.11
✎
12:40
|
нефига не понял:
не работает что ли? |
|||
46
Aprobator
16.06.11
✎
12:41
|
а млин - вложенный запрос.
|
|||
47
Ayvengo
16.06.11
✎
12:41
|
(45) работает, если сооружать текст запроса в цикле по каким-то условиям
|
|||
48
Aprobator
16.06.11
✎
12:43
|
(47) имя реквизита во вложенном запросе меняется?
|
|||
49
Ayvengo
16.06.11
✎
12:47
|
(48) ага
|
|||
50
Ayvengo
16.06.11
✎
12:51
|
(40) да запрос то присылать зачем? :) сейчас скачал с Сайта Чистова консоль запросов (там секундомер есть)
Выполнение запроса по регистру товары на складах (обороты) с уровнем вложенности 3-7 (0.025-0.030 с) без вложенных 0.024 - 0.027 с Можно взять типовую ут (демо) на ней тестировал. |
|||
51
Ayvengo
16.06.11
✎
12:54
|
(41) - ага, ошибся, но у меня небыло секундомера, да и прирост не особо большой и на глаз не заметен.
|
|||
52
Ayvengo
16.06.11
✎
13:00
|
Возвращаясь к теме: то, что мне нужно в 1С не продумано прямым способом, только через изменение текста запроса в цикле (подобно (29),(34),(35)), либо подобно (32)
|
|||
53
Ayvengo
16.06.11
✎
13:03
|
(52) не исключаю и другие варианты, но я только их увидел
|
|||
54
Aprobator
16.06.11
✎
13:03
|
сдается мне, что в СКД это как то через характеристики можно реализовать. Но сама суть задачи нефига не понятна, поэтому дальнейших предположений делать не буду.
|
|||
55
SUA
16.06.11
✎
13:04
|
(52)не нужно было вот и не продумали. метаданные отдельно, данные отдельно - это нормально, все кто хочет большего пусть делают сами. я делал как-то по типу (34) - одна процедура формирует условие по нужным реквизитам, потом текст подставляется куда нужно
|
|||
56
Ayvengo
16.06.11
✎
13:08
|
(55) так я и хочу получить тоже самое, но без условий, а напрямую ;) Но такое как я понимаю невозможно ...
|
|||
57
Ayvengo
16.06.11
✎
13:09
|
(54) с СКД не очень дружу, и пока даже не представляю как это там сделать можно =\ и почему-то сомневаюсь, что то, что нужно возможно все-таки там сделать.
|
|||
58
azernot
16.06.11
✎
13:11
|
Не верю, что задачу нельзя решить формированием текста запроса в цикле, предварительно запросив данные из нужной таблицы настройки. Проще, легче, быстрее, оптимальнее.. Чего ещё нужно автору?
|
|||
59
Ayvengo
16.06.11
✎
13:14
|
(58) что бы вы читали внимательно ... посмотрите (52)
|
|||
60
azernot
16.06.11
✎
13:16
|
(59) Так я и спрашиваю, что ЕЩЁ нужно? Решение есть (и не одно), что в них не устраивает?
|
|||
61
Ayvengo
16.06.11
✎
13:17
|
(60) методы решения, я хотел как-то иначе ... проще ... без циклов и т.п.
|
|||
62
azernot
16.06.11
✎
13:19
|
(61) Нет их. А доказать это просто: сами 1С-ники когда пишут типовые конфы, использует метод формирования запроса в цикле.. Если они не знают - не знает никто.
|
|||
63
Ayvengo
16.06.11
✎
13:21
|
(62) вот это я и выяснил общаясь на форуме :) и сделал вывод в (52).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |