0. BelikovSA 27 02.03.20 11:57 Сейчас в теме

СКД - одна из проблем связи Наборов данных

Официальная информация:
1. В схеме компоновки данных нет указания типа связи. Все связи считаются ЛЕВЫМИ внешними соединениями.
2. Если для вложенного набора данных указано условие фильтра, тогда связь вложенного набора данных с родительским набором данных считается ВНУТРЕННЕЙ.

Или как получить все результаты основного набора при отборе в зависимом.

Перейти к публикации

Лучшие комментарии
4. dhurricane 04.03.20 07:37 Сейчас в теме
Еще один способ, как обойти преобразование левого соединения во внутреннее - это добиться появления поля "СкладОтбора" в первом наборе данных.

Попробуйте доработать запрос первого набора данных следующим образом:
ВЫБРАТЬ
	Склады.Ссылка КАК СкладСсылка
ПОМЕСТИТЬ ВтСклады
ИЗ
	Справочник.Склады КАК Склады
{ГДЕ
	Склады.Ссылка.* КАК СкладОтбора}
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СпецификацииВыходныеИзделия.Номенклатура КАК Продукция,
	СпецификацииИсходныеКомплектующие.Номенклатура КАК Комплектующая,
	СРЕДНЕЕ(СпецификацииИсходныеКомплектующие.Количество / СпецификацииВыходныеИзделия.Количество) КАК КоличествоНа1
ИЗ
	Справочник.Спецификации.ВыходныеИзделия КАК СпецификацииВыходныеИзделия
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Спецификации.ИсходныеКомплектующие КАК СпецификацииИсходныеКомплектующие
		ПО СпецификацииВыходныеИзделия.Ссылка = СпецификацииИсходныеКомплектующие.Ссылка

СГРУППИРОВАТЬ ПО
	СпецификацииВыходныеИзделия.Номенклатура,
	СпецификацииИсходныеКомплектующие.Номенклатура
Показать

Здесь я добавил первым запрос к справочнику складов. Т.к. используется секция {ГДЕ}, при установке отбора по полю "СкладОтбор", этот отбор попадет в условия нашей новой временной таблицы. Но при этом само поле "СкладСсылка" в отчете никоим образом не участвует, поэтому оптимизатор СКД просто "выкинет" эту часть запроса (получение временной таблицы).

Т.о. можно немного запутать СКД (а вместе с ней и разработчика, который будет сопровождать отчет), но при этом избавиться от внутреннего соединения в связях наборов данных и не нагрузить базу данных избыточными выборками данных (соединение со справочником номенклатуры во втором наборе можно убрать).
JohnyDeath; purgin; testnv0; toypaul; BelikovSA; +5 Ответить
Остальные комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Valerich 1677 04.03.20 04:36 Сейчас в теме
Вместо двух наборов сделать один и в нем явно сделать левое соединение
3. dhurricane 04.03.20 07:18 Сейчас в теме
(1) Тогда "поплывут" количественные показатели. В частности в общем итоге "КоличествоНа1" задвоится, затроится и т.д. Трудности с наборами данных перерастут в трудности с выражениями ресурсов.
5. BelikovSA 27 04.03.20 10:02 Сейчас в теме
(1)
Одна комплектующая для нескольких продукций - итог несколько строк в результате. При левом соединении несколько строк остатков. В результате нельзя использовать данную колонку в Ресурсах (по крайней мере в виде простой суммы), если знаете как - напишите пожалуйста.
2. dhurricane 04.03.20 07:12 Сейчас в теме
Я бы предложил следующее.

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

2. Добавить отбор данных второго запроса по списку номенклатуры, при том не только для таблицы остатков, но и для основной таблицы. Ведь в действительности нам не нужно получать запросом весь справочник номенклатуры:
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад КАК СкладКомплектующей,
    СпрНоменклатура.Ссылка КАК Комплектующая,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокКомплектующей
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки({(&КонецПериода)}, Номенклатура В (&СписокНоменклатуры) {(Склад).* КАК СкладОтбора}) КАК ТоварыНаСкладахОстатки
        ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
ГДЕ
    СпрНоменклатура.Ссылка В (&СписокНоменклатуры)
Показать

3. На закладке связей первого и второго наборов данных указать в качестве параметра связи "СписокНоменклатуры", установить флажок "Список параметров". Таким образом СКД будет выполнять запрос второго набора данных с отбором по номенклатуре исключительно из первого набора данных. А что попадает в первый - уже решение пользователя.

4. На закладке параметров СКД для нового параметра "СписокНоменклатуры" установить флажок доступности списка значений и ограничить доступность параметра пользователю.
BelikovSA; +1 Ответить
6. BelikovSA 27 04.03.20 10:12 Сейчас в теме
(2)
Я упростил задачу для написания статьи. Исходно список номенклатуры (продукции ) идет из табличной части Заказа, да и разбор на комплектующие идет глубже одного уровня.
Если для отчета - с п.1 и 2 - согласен полностью.
По п.3 - честно говоря плохо его понимаю. В моем понимании получится, что второй набор данных станет выполнятся "в цикле". Возможно не так понял - посмотрю. Спасибо.
7. dhurricane 04.03.20 10:18 Сейчас в теме
(6) Да, наверняка он будет выполнятся в цикле. Но это не так страшно. Флажок "Список параметров" на закладке связей отвечает как раз за то, чтобы получать данные порциями. Порции, на сколько я помню, должны быть достаточно большими (до 1000 значений в параметре), так что итераций будет немного. И это наверняка дешевле, нежели получить запросом весь справочник номенклатуры целиком.
BelikovSA; +1 Ответить
4. dhurricane 04.03.20 07:37 Сейчас в теме
Еще один способ, как обойти преобразование левого соединения во внутреннее - это добиться появления поля "СкладОтбора" в первом наборе данных.

Попробуйте доработать запрос первого набора данных следующим образом:
ВЫБРАТЬ
	Склады.Ссылка КАК СкладСсылка
ПОМЕСТИТЬ ВтСклады
ИЗ
	Справочник.Склады КАК Склады
{ГДЕ
	Склады.Ссылка.* КАК СкладОтбора}
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СпецификацииВыходныеИзделия.Номенклатура КАК Продукция,
	СпецификацииИсходныеКомплектующие.Номенклатура КАК Комплектующая,
	СРЕДНЕЕ(СпецификацииИсходныеКомплектующие.Количество / СпецификацииВыходныеИзделия.Количество) КАК КоличествоНа1
ИЗ
	Справочник.Спецификации.ВыходныеИзделия КАК СпецификацииВыходныеИзделия
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Спецификации.ИсходныеКомплектующие КАК СпецификацииИсходныеКомплектующие
		ПО СпецификацииВыходныеИзделия.Ссылка = СпецификацииИсходныеКомплектующие.Ссылка

СГРУППИРОВАТЬ ПО
	СпецификацииВыходныеИзделия.Номенклатура,
	СпецификацииИсходныеКомплектующие.Номенклатура
Показать

Здесь я добавил первым запрос к справочнику складов. Т.к. используется секция {ГДЕ}, при установке отбора по полю "СкладОтбор", этот отбор попадет в условия нашей новой временной таблицы. Но при этом само поле "СкладСсылка" в отчете никоим образом не участвует, поэтому оптимизатор СКД просто "выкинет" эту часть запроса (получение временной таблицы).

Т.о. можно немного запутать СКД (а вместе с ней и разработчика, который будет сопровождать отчет), но при этом избавиться от внутреннего соединения в связях наборов данных и не нагрузить базу данных избыточными выборками данных (соединение со справочником номенклатуры во втором наборе можно убрать).
JohnyDeath; purgin; testnv0; toypaul; BelikovSA; +5 Ответить
8. BelikovSA 27 04.03.20 10:51 Сейчас в теме
(4)
Блеск :)
Работает!!! Красивое решение :).
Спасибо большое, а то меня именно "нагрузка избыточными данными" и напрягала. Как я уже писал в какой-то момент вообще получал вылет по памяти. А тут такая красота - складов ограниченное количество в отличии от номенклатуры.
9. dhurricane 04.03.20 13:35 Сейчас в теме
(8)
складов ограниченное количество в отличии от номенклатуры.
В приведенном примере запроса к складам не будет вообще, т.к. поле "СкладСсылка" не используется в настройках компоновки. Оптимизатор запросов СКД просто-напросто "выбросит" этот кусок запроса, останется только запрос к спецификациям.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Специалист 1 категории (Программист 1С)
Фрязино
зарплата от 110 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Специалист 1 категории (Методист-аналитик 1С)
Фрязино
зарплата от 100 000 руб.
Полный день

Главный архитектор 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (Оперативный учет)
Санкт-Петербург
зарплата от 120 000 руб.
Полный день