Имя: Пароль:
1C
 
Пятничный вопрос по запросам 1С 8…
0 Wirtuozzz
 
04.08.17
13:29
Всем привет. Сразу прошу не пинать, но пятница, очень хочется поговорить. Вопрос касается запросов 1С.

Итак у нас ситуация (это исключительно лабараторный эксперимент), допустим у нас есть некий регистр накопления, подчиненный регистраторам, а регистраторов у нас допустим 300 штук ( более 256 точно). В части регистраторов есть реквизит «Реквизит1».

Вопрос как вывести все регистраторы, где этот реквизит1 заполнен запросом? Сделать это нужно максимально красиво и универсально.

Всем спасибо за обсуждение.
1 Wirtuozzz
 
04.08.17
13:30
Ну и что бы было весело, пусть это будет серверная база.
2 vis_tmp
 
04.08.17
13:30
Какой тип у реквизита «Реквизит1»?
3 Wirtuozzz
 
04.08.17
13:31
(2) Пусть тип будет Дата
4 vis_tmp
 
04.08.17
13:31
У части регистраторов такого реквизита нет?
5 1c-bs
 
04.08.17
13:31
Для начала отсеять регистраторы с нужным реквизитом через оператор ССЫЛКА например.
6 Wirtuozzz
 
04.08.17
13:32
(4) Да, у части реквизит есть, у части реквизита нет.
7 vis_tmp
 
04.08.17
13:33
(6)Хитрый )
8 Wirtuozzz
 
04.08.17
13:34
(5) вылетит в ошибку, т.к. построитель сделает столько левых соединений, сколько регистраторов, а если регистраторов более 256, то запрос вылетит в ошибку
9 Wirtuozzz
 
04.08.17
13:34
(7) ;)
10 1dvd
 
04.08.17
13:34
Добавить в реквизиты регистра Реквизит1 не предлагали ещё?
11 vi0
 
04.08.17
13:35
(8) разбей на несколько запросов
12 h-sp
 
04.08.17
13:36
(9) сейчас больше или меньше 256 уже никого не парит. Можно больше 256.
13 ptiz
 
04.08.17
13:36
(8) Обновить SQL
14 Быдло замкадное
 
04.08.17
13:36
так выведи реквизит.. в документах у которых его нет будет null. Нет?
15 Wirtuozzz
 
04.08.17
13:37
(10) принимается, но лучше все таки запросом
16 H A D G E H O G s
 
04.08.17
13:37
Если других отборов нет - никак. Ну, тоесть, из регистратора.
17 Wirtuozzz
 
04.08.17
13:38
(14) Через обращение к каждому типу с условием и конструкцию Объединить все?
18 1dvd
 
04.08.17
13:38
(15) т.е. скорость не важна?
Тогда в чем трабла?
ГДЕ
   Регистратор.Реквизит1 = ...
19 Wirtuozzz
 
04.08.17
13:39
(18)  Регистратор.Реквизит1  - должна в ошибку вылететь, будет более 256 левых соединений.
20 Быдло замкадное
 
04.08.17
13:39
(17) нет. РегистрНакопления.Регистратор.Реквизит1
ВСЕ.
21 H A D G E H O G s
 
04.08.17
13:39
(17) Бессмысленно.
22 1dvd
 
04.08.17
13:39
(19) сху.. с чего бы?
23 H A D G E H O G s
 
04.08.17
13:39
(19) Это если вы еще в прошлом десятилетии.
24 Wirtuozzz
 
04.08.17
13:40
(23) Да, мы в прошлом десятилетии
25 h-sp
 
04.08.17
13:40
(19) еще раз, не вылетит уже с такой ошибкой.
26 Wirtuozzz
 
04.08.17
13:41
(25) на новом SQL не вылетит, а 2008 ляжет. Так ведь?
27 1dvd
 
04.08.17
13:41
(24) достань доллар по 30, плиз
28 Wirtuozzz
 
04.08.17
13:42
(27) Иронично )
Я имею в виду, можно ли как то было в то время извернуться и решить эту проблему именно запросом. Понятно, что если была бы в 2008 году такая проблема это было бы архитектурной ошибкой, но все же.
29 h-sp
 
04.08.17
13:47
(28) 2008 работает, не ляжет. Неужели у вас 8.1.8, ну вы динозавры?
30 Wirtuozzz
 
04.08.17
13:50
(29) Да хоть зубры, не важно. У меня в голове родился вопрос, я его решил обсудить с самыми жесткими гуру на форуме.
31 Wirtuozzz
 
04.08.17
13:50
(29) ну значит у нас такой sql, где он ляжет.
32 H A D G E H O G s
 
04.08.17
13:52
(31) есть еще отборы на регистр?
33 Wirtuozzz
 
04.08.17
13:54
(32) Приведи пример, я не понимаю.
Давайте пока без отборов, если они потребуются, то добавим, только какого рода отбора нам могут помочь?
34 h-sp
 
04.08.17
13:55
(30) жесткие гуру сейчас в отпуске
35 vi0
 
04.08.17
13:56
(33) чем тебе не нравится мое предложение в (11) ?
36 Wirtuozzz
 
04.08.17
13:57
Ты хочешь в цикле что ли запрос строить? Как ты разбивать собрался?
37 vi0
 
04.08.17
13:57
(36) я никак не собирался
дальше сам думай
простор для творчества
38 h-sp
 
04.08.17
13:58
(31) ну тогда (10) без вариантов. Непонятно зачем выпендриваетесь, если у вас действиткельно такое невероятное старье. Доработка эта может на 1 час. Если сами не сможете вызовите специалиста.
39 Wirtuozzz
 
04.08.17
13:58
(37) Хорошо, у нас появились варианты:
1. Сделать общий реквизит у всех документов;
2. Сделать этот запрос в цикле (разбив большой запрос на кучу маленьких);

Есть еще предложения как это сделать?
40 H A D G E H O G s
 
04.08.17
13:59
(33) Ну, например, РН - это Продажи и у тебя есть список номенклатур или период, для которых нужен отчет (0). Тогда мы могли бы выбрать по этому периоду регистраторы в Выборку на сервере 1С, разбили бы их по типам в разные массивы и для каждого массива, в цикле, получили бы реквизит. Отобрали бы по реквизиту и отправили бы верные регистраторы в первичный запрос.
41 vi0
 
04.08.17
13:59
(39) не обязательно именно кучу маленьких
можно на допустимые для сервера порции
42 Леха Дум
 
04.08.17
13:59
А что мешает сделать кучу запросов по каждому регистратору через ОБЪЕДИНИТЬ ВСЕ?
43 2S
 
04.08.17
14:01
(42) причем это можно сделать красиво в цикле
44 mistеr
 
04.08.17
14:02
(0) Сгенерировать запрос через объединение. Таблицы, где нет Реквизит1, участвовать не будут.
45 Wirtuozzz
 
04.08.17
14:02
(43) замечательно, а без цикла?
46 Wirtuozzz
 
04.08.17
14:02
(44) Не понял, можно простейший пример?
47 Wirtuozzz
 
04.08.17
14:03
(40) Варинант, т.е. через временные таблицы решить задачу, да?
48 Wirtuozzz
 
04.08.17
14:03
(47) не временные, а виртуальные
49 Wirtuozzz
 
04.08.17
14:04
(48) * все таки временные )))
50 mistеr
 
04.08.17
14:09
(46) Что непонятного...


ВЫБРАТЬ ... ИЗ Регистр
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Регистратор1
ПО ...
ГДЕ Регистратор1.Реквизит1 <> '00010101'

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ... ИЗ Регистр
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Регистратор2
ПО ...
ГДЕ Регистратор2.Реквизит1 <> '00010101'
...

Генерируем, естественно, в цикле, выполняем один раз.
51 _Дайвер_
 
04.08.17
14:11
Выбрать первые 256, Поместить в ВТ + Выбрать остальные и т.д.
52 Wirtuozzz
 
04.08.17
14:12
(51) Как отловить первые 256?
53 Wirtuozzz
 
04.08.17
14:14
(50) Чем ваше отличается от:

ВЫБРАТЬ
    РН.Регистратор.Дата
ИЗ
    РегистрНакопления.НашРегистр КАК РН
Где
РН.Регистратор.Дата > ДатаВремя(1,1,1)

?
54 vi0
 
04.08.17
14:15
(52) составляй текст запроса динамически
55 xXeNoNx
 
04.08.17
14:15
Через ВЫБОР..... ВЫРАЗИТЬ...
+ (54)
56 Wirtuozzz
 
04.08.17
14:17
(55) Т.е. циклом, а когда формируается текст запроса, то через выразить обращаться к нужному реквизиту?
57 xXeNoNx
 
04.08.17
14:20
(56)
Как Вариант:
ГДЕ
   ВЫРАЗИТЬ(ССЫЛКА КАК ВидДокумента1).Реквизит1 = &Значение
   ИЛИ ВЫРАЗИТЬ(ССЫЛКА КАК ВидДокумента2).Реквизит1 = &Значение
58 dezss
 
04.08.17
14:20
Сперва подготовить список регистраторов с этим реквизитом, а потом их запихать в запрос.
59 dezss
 
04.08.17
14:21
(58) + ну и про 256 не забыть. Если превышен, то остальные в другую коллекцию и Объеденить.
60 mistеr
 
04.08.17
14:22
(53) Вместо соединений — объединения. Их может быть больше 256.
61 Fragster
 
гуру
04.08.17
14:25
самый правильный выход - добавить реквизит регистра и цеплять оттуда.
62 Fragster
 
гуру
04.08.17
14:25
а так - 256 таблиц никого не парит. и в данном случае от параллелизма sql профит будет :)
63 Fragster
 
гуру
04.08.17
14:26
уже лет 5 как в актуальных скуль серверах нет такого ограничения (хотя и было-то только в mssql)
64 Wirtuozzz
 
04.08.17
14:27
(61) Согласен.
65 _Дайвер_
 
04.08.17
14:41
(64) в (10) тебе тоже самое говорили
66 Wirtuozzz
 
04.08.17
15:09
(65) Я за это еще в (15) поблагодарил.
67 vi0
 
04.08.17
15:44
Для сферического коня описанного в (0) любое озвученное здесь решение можно считать идеальным