Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Выбор элементов справочника, у которых нет записи в регистре сведений

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

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

Прямо буквально:
ГДЕ
    ВЫБОР
        КОГДА ВыгрузкаОбъектовСрезПоследних.Период ЕСТЬ NULL ТОГДА
            // Нет записи в регистре

            ИСТИНА
        КОГДА ВыгрузкаОбъектовСрезПоследних.Период < &ДатаВыгрузки ТОГДА
            // Меньше указанной

            ИСТИНА
        ИНАЧЕ
            // Больше или равна

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует