Имя: Пароль:
   
1C
1С v8
Обращение через точку в запросе
0 slavawashere
 
21.01.21
12:18
1. это смертный грех 38% (3)
2. это не смертный грех, но... 38% (3)
3. всегда так делаю 25% (2)
Всего мнений: 8

Во всех статьях про запросы 1С  пишут про "смертный грех" - обращение к данным через точку, которое порождает вложенный запрос и влечет замедление запроса.

Но я не совсем понимаю до конца про что это:  Вот есть у нас регистр "ФактическоеРабочееВремяСотрудников", а там есть измерение "Сотрудник" с типом "Справочник.ФизическиеЛица", а у этого справочника есть реквизит "Магазин" - чтобы понимать где  работает этот сотрудник.

И вот я пишу запрос к этому регистру, пытаясь выяснить всех работающих сотрудников определенного магазина (ну такая задача - надо именно через этот регистр, с учетом еще некоторых сведений из этого регистра, которые я опустил в запросе для простоты)

ВЫБРАТЬ
    ФактическоеРабочееВремяСотрудников.Сотрудник КАК Сотрудник
ИЗ
    РегистрНакопления.ФактическоеРабочееВремяСотрудников КАК ФактическоеРабочееВремяСотрудников
ГДЕ

    ФактическоеРабочееВремяСотрудников.Сотрудник.Магазин = &Магазин

Я тут совершил этот грех или нет?  И если да, то как это исправить?  Как наложить такое условие не обращаясь через две точки?  Делать сначала запрос к справочнику Физ-лица, выбирать оттуда сотрудников определенного магазина и потом в запросе к регистру  выбирать сотрудников только из полученного ранее списка?  А не будет ли это дольше в конечном итоге?
1 ДенисЧ
 
21.01.21
12:19
"Во всех статьях про запросы 1С  пишут про "смертный грех" - обращение к данным через точку"

Не читай всех статей. Читай вменяемые.
2 ДенисЧ
 
21.01.21
12:20
"Я тут совершил этот грех или нет?"
Ты совершил грех, появившись на этот свет (гугле: первородный грех).

А вообще - надо просто понимать, во что в скуле превращается твой запрос.
В данном конкретном случае - ничего страшного.

А вот если бы ты написал регОбороты.Регистратор.Комментарий - тут уже 10 лет строгого расстрела...
3 DrShad
 
21.01.21
12:21
(2) +1
(0) в твоем случае будет неявное соединение, но если ты даже сделаешь явное, то план запроса не изменится
4 Масянька
 
naïve
21.01.21
12:22
(2) Не-е... 20 лет без права переписки.
5 trad
 
21.01.21
12:24
(2) а как надо?
6 Hans
 
21.01.21
12:24
(2) В чем проблема регОбороты.Регистратор.Комментарий  от ФактическоеРабочееВремяСотрудников.Сотрудник.Магазин?
7 DrShad
 
21.01.21
12:24
другими словами, если у тебя измерение Сотрудник не составного типа то норм
8 DrShad
 
21.01.21
12:25
(6) регистратор составного типа - в итоге запрос превратится в соединения с "миллионом" таблиц
9 trad
 
21.01.21
12:26
(8) этот "миллион" разве не ограничен таблицами возможных регистраторов
10 Hans
 
21.01.21
12:27
(8) что он со всеми документами будет соединяться даже теми которые не указаны как регистраторы?
11 mikecool
 
21.01.21
12:28
(8) ну не совсем миллионом, но напакостить может
12 DrShad
 
21.01.21
12:28
(9) ограничен, но тогда все зависит от регистра
к примеру к регистру бухгалтерии запрос?
13 DrShad
 
21.01.21
12:28
(11) ну так я же и обернул в кавычки
14 Hans
 
21.01.21
12:29
регОбороты.Регистратор.Комментарий - эта тема плохая если регистраторов много, а комментарий есть только у одного документа, двух документов.
15 sapphire
 
21.01.21
12:29
Анафема

это смертный грех
16 trad
 
21.01.21
12:30
(12) на что заменить "регОбороты.Регистратор.Комментарий"
если надо в запросе получить комментарии регистраторов?
17 ДенисЧ
 
21.01.21
12:30
(10) Со всеми регистраторами
18 Timon1405
 
21.01.21
12:38
(16) использовать РС РеестрДокументов если у вас типовая УТ/КА на УФ итд или посмотреть как это сделано в последней типовой
19 trad
 
21.01.21
12:44
(18) хм. Но в гипотетической нетиповой конфе не завезли этот регистр.
20 Сергиус
 
21.01.21
12:51
(0)Контроль во фреше такой запрос не прошел бы)
21 xXeNoNx
 
21.01.21
13:00
>>Я тут совершил этот грех или нет?
Да, в некоторых случаях

Например, кто-то хранит двоичные данные в справочниках какие-нить

например, кто-то будет хранить двоичные данные в справочнике

Так что да, это смертный грех
22 xXeNoNx
 
21.01.21
13:02
Забыл
На кол его!

это смертный грех
23 Кир Пластелинин
 
21.01.21
13:04
(7) нет никаких гарантий, что по прошествии времени оно (измерение) не станет составным по каким-либо причинам.
24 youalex
 
21.01.21
13:05
(0) не вложенный запрос, а соединение.
в твоем примере это нормально, тяжесть греха зависит от того, является ли тип поля составным.

это не смертный грех, но...
25 xXeNoNx
 
21.01.21
13:09
Сделай цикл на 1000, а в нем запрос, проверь свой запрос и этот:
ВЫБРАТЬ
    ФактическоеРабочееВремяСотрудников.Сотрудник КАК Сотрудник
ИЗ
    РегистрНакопления.ФактическоеРабочееВремяСотрудников КАК ФактическоеРабочееВремяСотрудников
    ВНУТРЕННЕЕ Справочник.Сотрудники КАК спрСотрудники
        ПО ФактическоеРабочееВремяСотрудников.Сотрудник = спрСотрудники.Ссылка
            И спрСотрудники.Магазин = &Магазин

Скинь результат сюда
26 ДенисЧ
 
21.01.21
13:10
(25) Запрос в цикле? 15 лет.
27 xXeNoNx
 
21.01.21
13:12
(26) Как думаешь корректно замерить время двух запросов на 5-6 пользователях получится?
28 xXeNoNx
 
21.01.21
13:14
+(27) В том и дело что 15 лет и знаю с чем готовить запрос в цикле.
29 Kassern
 
21.01.21
13:14
(26) тут аж целая ветка была по поводу запросов в цикле, всех к "стенке"?))
Запрос в цикле
30 xXeNoNx
 
21.01.21
13:15
(29) как раз там отметился
31 Timon1405
 
21.01.21
14:07
(19) в негипотетической БСП он тоже есть, а у писателей нетленки есть варианты взять его оттуда, изобрести его заново или страдать)
32 Жан Пердежон
 
21.01.21
14:08
(0) слышал звон...
33 xXeNoNx
 
21.01.21
14:19
(0) Есть результат? по тестированию в (25)?
34 slavawashere
 
21.01.21
14:50
(25) у меня в базе кстати около 1000 физлиц и разницы между твоим запросом и моим - вообще нет
35 youalex
 
21.01.21
14:52
(34) в профайлере еще сравни (если скуль)
36 ViSo76
 
21.01.21
15:00
(0) Грез не совершил, если .Магазин =< не составной тип из десятков справочников и ты точно знаешь тип входящего значения. Если тебе будет легче, могу выписать индульгенцию. (25) Твой запрос такой же как и в (0), если .Магазин не составной тип
37 slavawashere
 
21.01.21
15:08
(36) 1С  сам преобразует запросы через точку  к внутреннему соединению?  или скуль?
38 ДенисЧ
 
21.01.21
15:09
(37) Скуль про твои точки даже в кошмарных снах не видел...
39 ViSo76
 
21.01.21
15:14
(37) 1с разумеется, ms sql не знает русского, да и итоги тоже нет в ms sql. Объект Запрос всегда преобразует в синтаксис той базы, с которой работает 1с. Конструктор запроса преобразует {}, передаёт текст в объект запрос скорее всего )
40 ГдеСобака Зарыта
 
naïve
21.01.21
15:28
(0) Архитектура говно. Магазин должен быть измерением регистра.
41 trad
 
21.01.21
15:34
(31) Страдать - это натягивать БСП туда где она не нужна, или заниматься денормализацией данных там где она (денормализация) не нужна.
Ничего не имею против денормализации, она необходима там где на самом деле оправдана. Но не по каждому поводу.
42 trad
 
21.01.21
15:37
(40) Глупость полная.
Магазин не должен, а может быть измерением.

Завтра ему понадобится отобрать по полу сотрудника. Пол тоже потащим в измерение?
43 ГдеСобака Зарыта
 
naïve
21.01.21
15:39
(42) Пол не станем. Пол не изменен. А вот сотрудник может перейти работать в другой магазин, и что ТС получит своим запросом?
44 trad
 
21.01.21
15:48
(43) Если смотреть в этом ключе - согласен.
(Я же еще в контексте обсуждения точки)
45 Anton1307
 
21.01.21
15:52
(43) Что значит "пол не изменен". Ты из какого века свалился?
Я, кстати, ещё лет 5 назад на партнёрском форуме "1С" задал вопрос, как в ЗУП отразить смену пола сотрудником.
Техподдержка ещё думает.

По теме - если обращаешься к какому ни-будь небольшому справочнику на 10-100 записей - через точку не смертный грех.
А вот если через точку регистратора регистра - смертный

это не смертный грех, но...
46 ГдеСобака Зарыта
 
naïve
21.01.21
16:21
(45) Тех поддержка не думает. Они просто не смогли подобрать литературных слов, чтобы описать куда тебе стоит идти, поэтому ничего и не ответили.
47 fisher
 
21.01.21
16:25
Грех только если через поле составного типа. А так - какая альтернатива? Явное соединение? И какой смысл при наличии более удобного синтаксиса?

всегда так делаю
48 Temai
 
21.01.21
16:26
Для кого же придумали это:
Выразить(Регистратор КАК Документ.Поступление).Склад

всегда так делаю
49 fisher
 
21.01.21
16:30
(0) По сабжевому запросу: если отбор по магазину обладает высокой селективностью в таблице ФактическоеРабочееВремяСотрудников и часто используется, то правильным вариантом было бы иметь его в измерениях. Тем более, что один и тот же сотрудник может переходить из магазина в магазин. А так, если уже припекло, то какая уже разница - через точку обращаться или явное соединение присобачивать?
50 slavawashere
 
21.01.21
16:50
(49) (40) (42) В регистре есть измерение "Магазин", чтобы отражать где фактически работал сотрудник в этот день.  Но также есть и реквизит "Магазин" в справочнике "Физические Лица", чтобы указать "родной" магазин сотрудника, где он работает постоянно.  И требовалось вывести именно подробности работы сотрудников во всех остальных магазинах, которые обычно "приписаны" к родному магазину.
51 slavawashere
 
21.01.21
16:53
вопрос же был о правомерности такого обращения через точку к "реквизитам реквизитов"
52 МихаилМ
 
21.01.21
16:55
чем точнее и однозначней 1с8 указать текст запроса, тем предсказуемым и стабильным будет результат преобразования запроса 1с в запрос субд.

1с аж два раза умудрилась накосячить с разименованием через точку. ждем третьего.

это не смертный грех, но...
53 xXeNoNx
 
21.01.21
17:20
(34) да ну, не верю
54 fisher
 
21.01.21
17:41
(51) Как уже отвечали, критерием "зашкварности" является то, во что такой запрос преобразуется при посылке в СУБД. В сабжевом случае это будет просто неявное соединение со справочником сотрудников. А следовательно - все ок.
55 aka MIK
 
21.01.21
19:29
(20) что значит это словосочетание?
56 aka MIK
 
21.01.21
19:29
(52) интересно, и как же 1С тут могу накосячить?
57 sikuda
 
21.01.21
19:42
(0) Условия на регистры надо писать в параметрах таблицы, а не в секции ГДЕ

это смертный грех
58 sikuda
 
21.01.21
19:44
(56) Почитайте Нуралиева о великих возможностях составных типов, а потом современные требования 1сфреш
59 МихаилМ
 
21.01.21
19:46
(56) аж 2 раза умудрились, как в 1с77 , при обращении через точку использовать не одну таблицу а создавать но вое соединение с тойже

если написано

.таб.рекв1,
.таб.рекв2

то 1с8 ламеняла на left (outer) join таб1 (as tab).рекв1
+left (outer) join таб2 (as tab).рекв2

если N реквизитов - то N джоинов с оной и тоже таблицей.
60 rsv
 
21.01.21
20:20
(0) пишите по влзможности всегда явные джойны. Текста будет поболее конечно.
А по побыстрому и так софдет.
61 slavawashere
 
25.01.21
19:01
(15) Так это же не виртуальная таблица регистра,  разве ей можно передать параметры?