Имя: Пароль:
1C
 
Произвольные выражения в запросах
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).
Ошибка? Это не ошибка, это системная функция.