Как в запросе получить разность двух документов?

1. Kernel38 24.12.24 04:09 Сейчас в теме
Приветствую, дамы и господа!
Помогите новичку)
Подскажите как в запросе получить разность двух "документов", содержащие схожие элементы.
Примерно получается так, есть справочник в котором есть список значении, есть документ который их использует. Документ создается с датой, по дате делаем отбор документов, получает актуальные списки значении в документе за период. Теперь нужно сравнить эти документы со справочником и получить из справочника значения, которые не используются в документе за указанный период.
На данный момент реализовал свою хотелку через разность массивов.
// Возвращает разность массивов. Разностью двух массивов является массив, содержащий
// все элементы первого массива, не существующие во втором массиве.

Конфигурация ЗИК
Сами запросы которые добавляю в массивы:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Начисления.Наименование КАК Наименование
ИЗ
ПланВидовРасчета.Начисления КАК Начисления
ГДЕ
Начисления.ВАрхиве = ЛОЖЬ

**********************************************
ВЫБРАТЬ РАЗЛИЧНЫЕ
ПлановыеНачисления.Начисление.Наименование КАК НачислениеНаименование
ИЗ
РегистрСведений.ПлановыеНачисления КАК ПлановыеНачисления
ГДЕ
ПлановыеНачисления.Период >= &Период

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

ВЫБРАТЬ РАЗЛИЧНЫЕ
РазовоеНачисление.Начисление.Наименование
ИЗ
Документ.РазовоеНачисление КАК РазовоеНачисление
ГДЕ
РазовоеНачисление.Дата >= &Период
По теме из базы знаний
Найденные решения
5. Anton_new01 24.12.24 12:56 Сейчас в теме
(3)
если я тебя правильно понял, то переведу на русский:
1. есть справочник.Начисления
2. есть документ.РазовоеНачисление, который использует элементы этого справочника.
3. ты хочешь отобрать те Начисления, которые не использовались, за указанный период.

делается это так:
1. отбираем все Начисления которые используются за период. и помещаем их во веменую таблицу втНачисления.
2. левым соединением соединяем со справочником.Начисления и ставим отбор Is null.

	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	РазовоеНачисление.Начисление КАК Начисление
	|ПОМЕСТИТЬ втНачисления
	|ИЗ
	|	Документ.РазовоеНачисление КАК РазовоеНачисление
	|Где 
	|	РазовоеНачисление.Дата между &Дата1 и &Дата2 
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Начисления.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Начисления КАК Начисления
	|		Левое соединение втНачисления КАК втНачисления
	|		По Начисления.Ссылка = втНачисления.Начисление
	|Где 
	|	втНачисления.Начисление is null"
Показать


PS. не совсем понятно зачем ты в регист полез.
т.е. мы взяли все начисления присоединили к ним те которые используются. а к тем которые не используются - остались пустые клетки (null) и поставили отбор на эти пустые клетки (Есть null)
Kernel38; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 24.12.24 08:50 Сейчас в теме
(1) В справочнике не может храниться СписокЗначений. Текст задания и запросы даже рядом не лежали. Или перепишите задание или запросы.
user1619761; Raskad; +2 Ответить
3. Kernel38 24.12.24 09:58 Сейчас в теме
(2) Неправильно описал ситуацию в силу плохого знания терминологий. Есть вот такой "справочник" (скрин1), где создаются начисления. Они используются в документе (Скрин2) и ещё в одном. Вот из этих "документов" я собрал "актуальные" начисления за текущий год, в "справочнике" их 399, а по документам за год использовали 209. Я хочу понять можно-ли соединить эти запросы чтоб мне показывались только те начисления в "справочнике" что не используются в "документах". Из 399 - 209 = 190, вот эти 190 и хочу увидеть, без 209)
В запросах что в примере. Пробовал разные варианты соединения и без, через ВременуюТаблицу и указывать сравнения Начисления.Наименование = ВТ.Наименование так и не понял возможно такое сравнение или нет.

последняя интерпретация запроса:
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПлановыеНачисления.Начисление.Наименование КАК НачислениеНаименование
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
	РегистрСведений.ПлановыеНачисления КАК ПлановыеНачисления
ГДЕ
	ПлановыеНачисления.Период >= &Период

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

ВЫБРАТЬ РАЗЛИЧНЫЕ
	РазовоеНачисление.Начисление.Наименование
ИЗ
	Документ.РазовоеНачисление КАК РазовоеНачисление
ГДЕ
	РазовоеНачисление.Дата >= &Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Начисления.Наименование КАК Наименование
ИЗ
	ВременнаяТаблица КАК ВременнаяТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления КАК Начисления
		ПО (Начисления.Наименование = ВременнаяТаблица.НачислениеНаименование)
ГДЕ
	Начисления.Наименование = ВременнаяТаблица.НачислениеНаименование
	ИЛИ  ВременнаяТаблица.НачислениеНаименование = Начисления.Наименование
Показать
Прикрепленные файлы:
4. lmnlmn 69 24.12.24 10:06 Сейчас в теме
(3) Ход мыслей в нужном направлении. В соединении результирующего запроса можно поменять таблицы местами, а в секции ГДЕ добавить проверку на NULL (ГДЕ Начисления.Наименование ЕСТЬ NULL)

P.S. Можно и даже нужно не таскать наименование начисления по запросам, если только это не какая-то специфика вашей задачи.
Kernel38; +1 Ответить
5. Anton_new01 24.12.24 12:56 Сейчас в теме
(3)
если я тебя правильно понял, то переведу на русский:
1. есть справочник.Начисления
2. есть документ.РазовоеНачисление, который использует элементы этого справочника.
3. ты хочешь отобрать те Начисления, которые не использовались, за указанный период.

делается это так:
1. отбираем все Начисления которые используются за период. и помещаем их во веменую таблицу втНачисления.
2. левым соединением соединяем со справочником.Начисления и ставим отбор Is null.

	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	РазовоеНачисление.Начисление КАК Начисление
	|ПОМЕСТИТЬ втНачисления
	|ИЗ
	|	Документ.РазовоеНачисление КАК РазовоеНачисление
	|Где 
	|	РазовоеНачисление.Дата между &Дата1 и &Дата2 
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Начисления.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Начисления КАК Начисления
	|		Левое соединение втНачисления КАК втНачисления
	|		По Начисления.Ссылка = втНачисления.Начисление
	|Где 
	|	втНачисления.Начисление is null"
Показать


PS. не совсем понятно зачем ты в регист полез.
т.е. мы взяли все начисления присоединили к ним те которые используются. а к тем которые не используются - остались пустые клетки (null) и поставили отбор на эти пустые клетки (Есть null)
Kernel38; +1 Ответить
6. Kernel38 25.12.24 04:15 Сейчас в теме
(5) Все три пункта почти правильные, кроме 1 у меня нет справочник.Начисления у меня есть ПланВидовРасчета.Начисления (скрин1)

т.е. мы взяли все начисления присоединили к ним те которые используются. а к тем которые не используются - остались пустые клетки (null) и поставили отбор на эти пустые клетки (Есть null)
Вот это я как-то ещё не понимаю...

Изменил запрос под себя, и как и хотел 399 - 209 = 190 (скрин2) СПАСИБО!

"ВЫБРАТЬ РАЗЛИЧНЫЕ
|	ПлановыеНачисления.Начисление.Наименование КАК НачислениеНаименование
|ПОМЕСТИТЬ втНачисления
|ИЗ
|	РегистрСведений.ПлановыеНачисления КАК ПлановыеНачисления
|ГДЕ
|	ПлановыеНачисления.Период >= &Период
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
|	РазовоеНачисление.Начисление.Наименование
|ИЗ
|	Документ.РазовоеНачисление КАК РазовоеНачисление
|ГДЕ
|	РазовоеНачисление.Дата >= &Период
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	Начисления.Наименование КАК Наименование
|ИЗ
|	ПланВидовРасчета.Начисления КАК Начисления
|		ЛЕВОЕ СОЕДИНЕНИЕ втНачисления КАК втНачисления
|		ПО (Начисления.Наименование = втНачисления.НачислениеНаименование)
|ГДЕ
|	втНачисления.НачислениеНаименование ЕСТЬ NULL"
Показать
Прикрепленные файлы:
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот