Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 окт 2025, 07:04

При входящих в запрос на левое соединение 2 строк ТЗ, возвращается одна

Автор Sasha1C, 29 сен 2025, 09:07

0 Пользователей и 1 гость просматривают эту тему.

Sasha1C

Добрый день, есть запрос типовой, я к нему добавил только группировку. Вопрос вот в чем, в параметре передается тЗ с двумя строками, а на выходе получаем только одну, которая в остатках в регистре бухгалтерии. Почему? НА каком этапе я туплю, если левое соединение в любом случае должно вернуть 2 строки из исходной таблицы.
Запрос.Текст =
"ВЫБРАТЬ
| ВнешнийИсточник.ИмяСписка КАК ИмяСписка,
| ВнешнийИсточник.Номенклатура КАК Номенклатура,
| ВнешнийИсточник.ДокументОприходования КАК ДокументОприходования,
| ВнешнийИсточник.ТипБСО КАК ТипБСО,
| ВнешнийИсточник.СерияБСО КАК СерияБСО,
| ВнешнийИсточник.Количество КАК Количество
|ПОМЕСТИТЬ ТаблицаНоменклатуры
|ИЗ
| &ВнешнийИсточник КАК ВнешнийИсточник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаНоменклатуры.ИмяСписка КАК ИмяСписка,
| ТаблицаНоменклатуры.ДокументОприходования КАК ДокументОприходования,
| СУММА(ЕСТЬNULL(ТаблицаНоменклатуры.Количество, 0)) КАК Количество,
| МАКСИМУМ(ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0)) КАК СтоимостьОстаток,
| МАКСИМУМ(ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстатокДт, 0)) КАК КоличествоОстаток,
| ТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
| ТаблицаНоменклатуры.ТипБСО КАК ТипБСО,
| ТаблицаНоменклатуры.СерияБСО КАК СерияБСО,
| ХозрасчетныйОстатки.Субконто2.СерияБСО.Ссылка КАК Субконто2СерияБСОСсылка,
| ХозрасчетныйОстатки.Субконто2.ТипБСО.Ссылка КАК Субконто2ТипБСОСсылка
|ИЗ
| ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В (&СчетаУчетаБСО), &ВидыСубконтоБСО) КАК ХозрасчетныйОстатки
| ПО ТаблицаНоменклатуры.Номенклатура = ХозрасчетныйОстатки.Субконто1
| И ТаблицаНоменклатуры.ДокументОприходования = ХозрасчетныйОстатки.Субконто2
| И ТаблицаНоменклатуры.ТипБСО = ХозрасчетныйОстатки.Субконто2.ТипБСО.Ссылка
| И ТаблицаНоменклатуры.СерияБСО = ХозрасчетныйОстатки.Субконто2.СерияБСО.Ссылка
|ГДЕ
| ХозрасчетныйОстатки.Субконто3 = &Склад
|
|СГРУППИРОВАТЬ ПО
| ТаблицаНоменклатуры.СерияБСО,
| ТаблицаНоменклатуры.ДокументОприходования,
| ХозрасчетныйОстатки.Субконто2.СерияБСО.Ссылка,
| ТаблицаНоменклатуры.ИмяСписка,
| ТаблицаНоменклатуры.ТипБСО,
| ТаблицаНоменклатуры.Номенклатура,
| ХозрасчетныйОстатки.Субконто2.ТипБСО.Ссылка";


antoneus

Цитата: Sasha1C от 29 сен 2025, 09:07левое соединение в любом случае должно вернуть 2 строки из исходной таблицы

Кто сказал? Может вообще ни одной не вернуть, если условие в ГДЕ не выполнится для обеих.

Sasha1C


Sasha1C

antoneus, А как в этот запрос можно условие по складу запихнуть? Моя задача такая, В параметр была передана ТЗ с N строчками, Эти же N и должны быть на выходе из запроса (просто с количеством остатка выйти) А сейчас, если установить условие, то строки удаляются, а без склада остатки неверные

Sasha1C


Максим75

Sasha1C, ну сделайте временную таблицу остатков по нужному складу, а уже потом соединяйте с этой временной таблицей.

antoneus

Если нужно исходное количество строк в результате - условие на склад добавляется в соединение таблиц. Или в параметры вт. Тогда в остатки с другого склада приедет null. И да, соединение с виртуальной таблицей - ай-яй-яй.

Sasha1C


Sasha1C

antoneus, Возник еще вопрос, Запрос 1 -старый код: сумму показывает и количество. ( Это запрос просто для примера, а нужно второй переделать)
    //Запрос.Текст =
    // "ВЫБРАТЬ
    // |    ВнешнийИсточник.ИмяСписка КАК ИмяСписка,
    // |    ВнешнийИсточник.Номенклатура КАК Номенклатура,
    // |    ВнешнийИсточник.ДокументОприходования КАК ДокументОприходования,
    // |    ВнешнийИсточник.ТипБСО КАК ТипБСО,
    // |    ВнешнийИсточник.СерияБСО КАК СерияБСО,
    // |    ВнешнийИсточник.Количество КАК Количество
    // |ПОМЕСТИТЬ ТаблицаНоменклатуры
    // |ИЗ
    // |    &ВнешнийИсточник КАК ВнешнийИсточник
    // |;
    // |
    // |////////////////////////////////////////////////////////////////////////////////
    // |ВЫБРАТЬ
    // |    ТаблицаНоменклатуры.ИмяСписка КАК ИмяСписка,
    // |    ТаблицаНоменклатуры.ДокументОприходования КАК ДокументОприходования,
    // |    СУММА(ЕСТЬNULL(ТаблицаНоменклатуры.Количество, 0)) КАК Количество,
    // |    МАКСИМУМ(ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0)) КАК СтоимостьОстаток,
    // |    МАКСИМУМ(ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстатокДт, 0)) КАК КоличествоОстаток,
    // |    ТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    // |    ТаблицаНоменклатуры.ТипБСО КАК ТипБСО,
    // |    ТаблицаНоменклатуры.СерияБСО КАК СерияБСО,
    // |    ХозрасчетныйОстатки.Субконто2.СерияБСО.Ссылка КАК Субконто2СерияБСОСсылка,
    // |    ХозрасчетныйОстатки.Субконто2.ТипБСО.Ссылка КАК Субконто2ТипБСОСсылка
    // |ИЗ
    // |    ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
    // |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В (&СчетаУчетаБСО), &ВидыСубконтоБСО) КАК ХозрасчетныйОстатки
    // |        ПО ТаблицаНоменклатуры.Номенклатура = ХозрасчетныйОстатки.Субконто1
    // |            И ТаблицаНоменклатуры.ДокументОприходования = ХозрасчетныйОстатки.Субконто2
    // |            И ТаблицаНоменклатуры.ТипБСО = ХозрасчетныйОстатки.Субконто2.ТипБСО.Ссылка
    // |            И ТаблицаНоменклатуры.СерияБСО = ХозрасчетныйОстатки.Субконто2.СерияБСО.Ссылка
    // |
    // |СГРУППИРОВАТЬ ПО
    // |    ТаблицаНоменклатуры.СерияБСО,
    // |    ТаблицаНоменклатуры.ДокументОприходования,
    // |    ХозрасчетныйОстатки.Субконто2.СерияБСО.Ссылка,
    // |    ТаблицаНоменклатуры.ИмяСписка,
    // |    ТаблицаНоменклатуры.ТипБСО,
    // |    ТаблицаНоменклатуры.Номенклатура,
    // |    ХозрасчетныйОстатки.Субконто2.ТипБСО.Ссылка";


Код 2 Количество работает, а сумма нет. А почему, логика вообще 1 в 1. Уже и группировку делал у виртуальной и все равно поле сумма пустое. Единственное существенное изменение - это перенос группировки в ВТ. Где может быть проблема, а то я в неком ступоре.
    Запрос.Текст =
     "ВЫБРАТЬ
     |    ВнешнийИсточник.ИмяСписка КАК ИмяСписка,
     |    ВнешнийИсточник.Номенклатура КАК Номенклатура,
     |    ВнешнийИсточник.ДокументОприходования КАК ДокументОприходования,
     |    ВнешнийИсточник.ТипБСО КАК ТипБСО,
     |    ВнешнийИсточник.СерияБСО КАК СерияБСО,
     |    ВнешнийИсточник.Количество КАК Количество
     |ПОМЕСТИТЬ ТаблицаНоменклатуры
     |ИЗ
     |    &ВнешнийИсточник КАК ВнешнийИсточник
     |;
     |
     |////////////////////////////////////////////////////////////////////////////////
     |ВЫБРАТЬ
     |    ХозрасчетныйОстатки.Субконто1 КАК НоменклатураОст,
     |    ХозрасчетныйОстатки.Субконто2 КАК ПартияОст,
     |    ХозрасчетныйОстатки.КоличествоОстатокДт КАК КоличествоОстатокДт,
     |    ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
     |    ХозрасчетныйОстатки.Субконто2.СерияБСО.Ссылка КАК Субконто2СерияБСОСсылка,
     |    ХозрасчетныйОстатки.Субконто2.ТипБСО.Ссылка КАК Субконто2ТипБСОСсылка
     |ПОМЕСТИТЬ Остатки
     |ИЗ
     |    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В (&СчетаУчетаБСО), &ВидыСубконтоБСО) КАК ХозрасчетныйОстатки
     |ГДЕ
     |    ХозрасчетныйОстатки.Субконто3 = &Склад
     |;
     |
     |////////////////////////////////////////////////////////////////////////////////
     |ВЫБРАТЬ
     |    ТаблицаНоменклатуры.ИмяСписка КАК ИмяСписка,
     |    ТаблицаНоменклатуры.ДокументОприходования КАК ДокументОприходования,
     |    СУММА(ЕСТЬNULL(ТаблицаНоменклатуры.Количество, 0)) КАК Количество,
     |    МАКСИМУМ(ЕСТЬNULL(Остатки.СуммаОстатокДт, 0)) КАК СтоимостьОстаток,
     |    МАКСИМУМ(ЕСТЬNULL(Остатки.КоличествоОстатокДт, 0)) КАК КоличествоОстаток,
     |    ТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
     |    ТаблицаНоменклатуры.ТипБСО КАК ТипБСО,
     |    ТаблицаНоменклатуры.СерияБСО КАК СерияБСО
     |ИЗ
     |    ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
     |        ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
     |        ПО ТаблицаНоменклатуры.Номенклатура = Остатки.НоменклатураОст
     |            И ТаблицаНоменклатуры.ДокументОприходования = Остатки.ПартияОст
     |            И ТаблицаНоменклатуры.СерияБСО = Остатки.Субконто2СерияБСОСсылка
     |            И ТаблицаНоменклатуры.ТипБСО = Остатки.Субконто2ТипБСОСсылка
     |
     |СГРУППИРОВАТЬ ПО
     |    ТаблицаНоменклатуры.СерияБСО,
     |    ТаблицаНоменклатуры.ДокументОприходования,
     |    ТаблицаНоменклатуры.ИмяСписка,
     |    ТаблицаНоменклатуры.ТипБСО,
     |    ТаблицаНоменклатуры.Номенклатура";


antoneus


Теги: Запрос 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск