Имя: Пароль:
1C
1С v8
Выбор элементов справочника, у которых нет записи в регистре сведений
,
0 Len1vec
 
25.03.19
13:50
Помогите, пожалуйста, разобраться.
Есть справочник "Спецификации". При записи его элемента производится передача этого элемента и делается соответствующая запись в регистре сведений.
В запросе надо отобрать те элементы справочника, у которых дата выгрузки (ВыгрузкаОбъектовСрезПоследних.Период) меньше указанной или дата больше, но тогда отобрать те элементы, в которых статус не обработан.
Так же есть элементы справочника, у которых запись в регистре сведений нет. Как правильно запросом получить такие элементы справочника?

ВЫБРАТЬ
    Спецификации.Код,
    Спецификации.Ссылка КАК Документ,
    ВыгрузкаОбъектовСрезПоследних.Статус,
    ВыгрузкаОбъектовСрезПоследних.Период КАК Дата
ИЗ
    Справочник.Спецификации КАК Спецификации
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВыгрузкаОбъектов.СрезПоследних КАК ВыгрузкаОбъектовСрезПоследних
        ПО Спецификации.Ссылка = ВыгрузкаОбъектовСрезПоследних.ОбъектВыгрузки
            И Спецификации.Ссылка = ВыгрузкаОбъектовСрезПоследних.ОбъектРегистратор
ГДЕ
    (ВыгрузкаОбъектовСрезПоследних.Период > &ДатаВыгрузки
                И ВыгрузкаОбъектовСрезПоследних.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусВыгрузкиОбъекта.Обработан)
            ИЛИ ВыгрузкаОбъектовСрезПоследних.Период < &ДатаВыгрузки)
1 Cyberhawk
 
25.03.19
13:50
Ты разместил условие на присоединяемую таблицу в секцию ГДЕ. Соединение стало по факту внутренним.
2 Cyberhawk
 
25.03.19
13:51
К тому же это значительно снизило читаемость кода (текста запроса). Не делай так.
3 Len1vec
 
25.03.19
13:57
(1) Этот вариант единственный, который отчасти(!) выдавал правильный результат. Сейчас бы к этому результату получить те элементы справочника, у которых нет записи в регистре сведений.
4 hhhh
 
25.03.19
14:02
(3) ну, вместо ГДЕ пишешь И
5 Len1vec
 
25.03.19
14:11
(4) Выводит лишние записи
6 DrWatson
 
25.03.19
14:26
(5) не только (4), ещё и (1) надо сделать.
7 Len1vec
 
25.03.19
14:28
(6) Что-то не понимаю. Это как?
8 Len1vec
 
25.03.19
14:29
(6) понял)
9 DrWatson
 
25.03.19
14:29
(7) Имеется в виду, что нужно написать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, а не ЛЕВОЕ
10 DrWatson
 
25.03.19
14:33
Хотя всё это неправильно, если обратить внимание на "есть элементы справочника, у которых запись в регистре сведений нет". У тебя же запрос не возвращает такие элементы?
11 Len1vec
 
25.03.19
14:35
(9) с ЛЕВОЕ СОЕДИНЕНИЕ отрабатывает корректнее...
12 Len1vec
 
25.03.19
14:37
(10) Нет, с ЛЕВОЕ СОЕДИНЕНИЕ возвращал, но не все.
В справочнике спецификации 3841 элемент, а в запросе выводит всего 3765 (имеется в виду те, у которых установлен реквизит Справочник.Спецификации.Активность типа булево в значение Ложь)
13 DrWatson
 
25.03.19
14:38
(11) Неожиданно. А в чем получилась разница?
14 zehn
 
25.03.19
14:40
> у которых дата выгрузки (ВыгрузкаОбъектовСрезПоследних.Период) меньше указанной или дата больше, но тогда отобрать те элементы, в которых статус не обработан.

Прямо буквально:
ГДЕ
    ВЫБОР
        КОГДА ВыгрузкаОбъектовСрезПоследних.Период ЕСТЬ NULL ТОГДА
            // Нет записи в регистре
            ИСТИНА
        КОГДА ВыгрузкаОбъектовСрезПоследних.Период < &ДатаВыгрузки ТОГДА
            // Меньше указанной
            ИСТИНА
        ИНАЧЕ
            // Больше или равна
            ВыгрузкаОбъектовСрезПоследних.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусВыгрузкиОбъекта.Обработан)
    КОНЕЦ
15 Len1vec
 
25.03.19
14:41
(13) самому интересно.
Та же ситуация со значением "Истина": 15965 элементов справочника против 15723 записей в запросе.
16 Len1vec
 
25.03.19
14:46
Сейчас полностью запрос выглядит так:

"ВЫБРАТЬ
|    ВЫРАЗИТЬ(0 КАК ЧИСЛО) КАК Номер,
|    Спецификации.Код,
|    Спецификации.Ссылка КАК Техкарта,
|    ВыгрузкаОбъектовСрезПоследних.Статус,
|    ВыгрузкаОбъектовСрезПоследних.Период КАК Дата
|ИЗ
|    Справочник.Спецификации КАК Спецификации
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВыгрузкаОбъектов.СрезПоследних КАК ВыгрузкаОбъектовСрезПоследних
|        ПО Спецификации.Ссылка = ВыгрузкаОбъектовСрезПоследних.ОбъектВыгрузки
|            И Спецификации.Ссылка = ВыгрузкаОбъектовСрезПоследних.ОбъектРегистратор
|            И (ВыгрузкаОбъектовСрезПоследних.Период > &ДатаВыгрузки
|                    И ВыгрузкаОбъектовСрезПоследних.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусВыгрузкиОбъектаВSAPR3.Обработан)
|                ИЛИ ВыгрузкаОбъектовСрезПоследних.Период < &ДатаВыгрузки)
|ГДЕ
|    Спецификации.Наименование ПОДОБНО ""[^В]%"""    +
?(ЭтаФорма.Активность     = "Все", "",(?(ЭтаФорма.Активность = "Активные",     " И Спецификации.Активность",         " И НЕ Спецификации.Активность")))+""+
?(ЭтаФорма.Удаленные     = "Все", "",(?(ЭтаФорма.Удаленные = "Удаленные",     " И Спецификации.ПометкаУдаления",     " И НЕ Спецификации.ПометкаУдаления")))+"
|УПОРЯДОЧИТЬ ПО
|    Спецификации.Код"
;
Запрос.УстановитьПараметр("ДатаВыгрузки", ДатаВыгрузки);
17 Len1vec
 
25.03.19
14:50
(14) Выдает тот же результат
18 bolero
 
25.03.19
14:59
(0) sql-аналог для понимания правильной механики:


SELECT cat1.*
FROM cat cat1
JOIN (
  SELECT DISTINCT cat2.id
  FROM cat cat2
  JOIN reg ON reg.cat_ref = cat.ref
) t
ON cat1.id != t.id


cat - справочник, reg - регистр
19 Len1vec
 
25.03.19
16:41
Решение найдено. Всем спасибо!)
Закон Брукера: Даже маленькая практика стоит большой теории.