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

Вывод области

Автор Asdfq, 23 окт 2025, 19:42

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

Asdfq

Здравствуйте! Помогите, пожалуйста, не понимаю почему так криво выводится отчёт.




      
   
   
   Макет = Отчеты.ОтчетНеНаСКД.ПолучитьМакет("Макет");
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   УчетТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
      |   УчетТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
      |   СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
      |   СУММА(УчетТоваровНаСкладахОстаткиИОбороты.СуммаНачальныйОстаток) КАК СуммаНачальныйОстаток,
      |   СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоПриход) КАК КоличествоПриход,
      |   СУММА(УчетТоваровНаСкладахОстаткиИОбороты.СуммаПриход) КАК СуммаПриход,
      |   СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
      |   СУММА(УчетТоваровНаСкладахОстаткиИОбороты.СуммаРасход) КАК СуммаРасход,
      |   СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
      |ИЗ
      |   РегистрНакопления.УчетТоваровНаСкладах.ОстаткиИОбороты(, , , Движения, ) КАК УчетТоваровНаСкладахОстаткиИОбороты
      |
      |СГРУППИРОВАТЬ ПО
      |   УчетТоваровНаСкладахОстаткиИОбороты.Номенклатура,
      |   УчетТоваровНаСкладахОстаткиИОбороты.Склад
      |
      |УПОРЯДОЧИТЬ ПО
      |   Номенклатура";
   
   РезультатЗапроса = Запрос.Выполнить();
   
      
   
   ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы|Заголовок");
   ОбластьСклад = Макет.ПолучитьОбласть("ШапкаТаблицы|Склад");
   ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали|Заголовок");
   ОбластьКоличества = Макет.ПолучитьОбласть("Детали|Склад");
                     
   
   ТабДок.Очистить();
   ТабДок.Вывести(ОбластьШапкаТаблицы);
   ТабДок.НачатьАвтогруппировкуСтрок();
   
   ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
   
   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
      ОбластьСклад.Параметры.Склад = ВыборкаДетальныеЗаписи.Склад;
      ОбластьДетальныхЗаписей.Параметры.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
      ОбластьКоличества.Параметры.КоличествоКонечныйОстаток = ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток;
      ТабДок.Присоединить(ОбластьСклад);
      Табдок.Вывести(ОбластьДетальныхЗаписей);
      ТабДок.Присоединить(ОбластьКоличества);
   КонецЦикла;
   
   
   ТабДок.ЗакончитьАвтогруппировкуСтрок();
   





antoneus

Выгружаем запрос в таблицу значений.
Из таблицы выдираем списки уникальных товаров и складов (можно через Скопировать(), Свернуть(), например).

Выводим шапку|Заголовок, цикл по списку складов - присоединяем шапку|склад.
Цикл по списку товаров - выводим Детали|Заголовок, потом цикл по складам - ищем в таблице строку по складу и товару (НайтиСтроки). Нашли - присоединяем Детали|Склад с количеством, не нашли - присоединяем Детали|Склад пустую.

Это если в лоб и не заморачиваться.

Asdfq

antoneus, подскажите, пожалуйста, а какой параметр отбора для НайтиСтроки

antoneus

Примерно так.

ТабДок.Очистить();
ТабДок.Вывести(ОбластьШапкаТаблицы);

тзОтчет = РезультатЗапроса.Выгрузить();
//получаем таблицы с уникальными значениями
тзНоменклатура = тзОтчет.Скопировать(, "Номенклатура");
тзНоменклатура.Свернуть("Номенклатура");
тзСклады = тзОтчет.Скопировать(, "Склад");
тзСклады.Свернуть("Склад");

Для каждого стр из тзСклады Цикл
    ОбластьСклад.Параметры.Склад = стр.Склад;
    ТабДок.Присоединить(ОбластьСклад)
КонецЦикла;

Для каждого стр из тзНоменклатура Цикл
    ОбластьДетальныхЗаписей.Параметры.Номенклатура = стр.Номенклатура;
    ТабДок.Вывести(ОбластьДетальныхЗаписей);
    Для каждого стрСклад из тзСклады Цикл
        стрКоличество = тзОтчет.НайтиСтроки(Новый Структура("Номенклатура, Склад", стр.Номенклатура, стрСклад.Склад));
        Если стрКоличество.Количество() = 0 Тогда
            ОбластьКоличества.Параметры.КоличествоКонечныйОстаток = ""
        Иначе
            ОбластьКоличества.Параметры.КоличествоКонечныйОстаток = стрКоличество[0].КоличествоКонечныйОстаток;
        КонецЕсли;
        ТабДок.Присоединить(ОбластьКоличества);         
   КонецЦикла;
КонецЦикла;

Asdfq

antoneus, спасибо огромное!!! :zebzdr:  :ooifh:

Asdfq

antoneus, у меня возникла последняя проблемка, не понимаю как вывести итоги по всему справа.

Макет = Отчеты.ОтчетНеНаСКД.ПолучитьМакет("Макет");
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    УчетТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
    |    УчетТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
    |    СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
    |    СУММА(УчетТоваровНаСкладахОстаткиИОбороты.СуммаНачальныйОстаток) КАК СуммаНачальныйОстаток,
    |    СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоПриход) КАК КоличествоПриход,
    |    СУММА(УчетТоваровНаСкладахОстаткиИОбороты.СуммаПриход) КАК СуммаПриход,
    |    СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоРасход) КАК КоличествоРасход,
    |    СУММА(УчетТоваровНаСкладахОстаткиИОбороты.СуммаРасход) КАК СуммаРасход,
    |    СУММА(УчетТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток
    |ИЗ
    |    РегистрНакопления.УчетТоваровНаСкладах.ОстаткиИОбороты(, , , , ) КАК УчетТоваровНаСкладахОстаткиИОбороты
    |
    |СГРУППИРОВАТЬ ПО
    |    УчетТоваровНаСкладахОстаткиИОбороты.Номенклатура,
    |    УчетТоваровНаСкладахОстаткиИОбороты.Склад
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура
    |ИТОГИ
    |    СУММА(КоличествоНачальныйОстаток),
    |    СУММА(СуммаНачальныйОстаток),
    |    СУММА(КоличествоПриход),
    |    СУММА(СуммаПриход),
    |    СУММА(КоличествоРасход),
    |    СУММА(СуммаРасход),
    |    СУММА(КоличествоКонечныйОстаток)
    |ПО
    |    Номенклатура";
   
   

    РезультатЗапроса = Запрос.Выполнить();
    Таблица = РезультатЗапроса.Выгрузить();
    ТаблицаСклады = Таблица.Скопировать(,"Склад");
    ТаблицаСклады.Свернуть("Склад");
    ТаблицаНоменклатура = Таблица.Скопировать(,"Номенклатура");
    ТаблицаНоменклатура.Свернуть("Номенклатура");
   
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы|Заголовок");
    ОбластьСклад = Макет.ПолучитьОбласть("ШапкаТаблицы|Склад");
    ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали|Заголовок");
    ОбластьКоличества = Макет.ПолучитьОбласть("Детали|Склад");
    ОбластьНазваниеИтогов = Макет.ПолучитьОбласть("ШапкаТаблицы|Итоги");
    ОбластьИтоги = Макет.ПолучитьОбласть("Детали|Итоги");
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьШапкаТаблицы);
   
    ТабДок.НачатьАвтогруппировкуСтрок();
   
    Для каждого Стр Из ТаблицаСклады Цикл
       
        ОбластьСклад.Параметры.Склад = Стр.Склад;
        ТабДок.Присоединить(ОбластьСклад);
    КонецЦикла;
    ТабДок.Присоединить(ОбластьНазваниеИтогов);
    Для каждого Стр Из ТаблицаНоменклатура Цикл
       
        ОбластьДетальныхЗаписей.Параметры.Номенклатура = Стр.Номенклатура;
        Табдок.Вывести(ОбластьДетальныхЗаписей);
       
    Для каждого Стр2 Из ТаблицаСклады Цикл
        Отбор = Новый Структура;
        Отбор.Вставить("Номенклатура",Стр.Номенклатура);
        Отбор.Вставить("Склад",Стр2.Склад);
        Колво = Таблица.НайтиСтроки(Отбор);
        Если Колво.Количество() = 0 Тогда
        ОбластьКоличества.Параметры.КоличествоНачальныйОстаток = "";   
        ОбластьКоличества.Параметры.СуммаНачальныйОстаток = "";   
        ОбластьКоличества.Параметры.КоличествоПриход ="";
        ОбластьКоличества.Параметры.СуммаПриход = "";
        ОбластьКоличества.Параметры.КоличествоРасход = "";
        ОбластьКоличества.Параметры.СуммаРасход = "";
        ОбластьКоличества.Параметры.КоличествоКонечныйОстаток = "";
        Иначе
        ОбластьКоличества.Параметры.КоличествоНачальныйОстаток = Колво[0].КоличествоНачальныйОстаток;   
        ОбластьКоличества.Параметры.СуммаНачальныйОстаток = Колво[0].СуммаНачальныйОстаток;   
        ОбластьКоличества.Параметры.КоличествоПриход = Колво[0].КоличествоПриход;
        ОбластьКоличества.Параметры.СуммаПриход = Колво[0].СуммаПриход;
        ОбластьКоличества.Параметры.КоличествоРасход = Колво[0].КоличествоРасход;
        ОбластьКоличества.Параметры.СуммаРасход = Колво[0].СуммаРасход;
        ОбластьКоличества.Параметры.КоличествоКонечныйОстаток = Колво[0].КоличествоКонечныйОстаток;
        КонецЕсли;
        ТабДок.Присоединить(ОбластьКоличества);
       
    КонецЦикла;
КонецЦикла;

    ТабДок.ЗакончитьАвтогруппировкуСтрок();

Asdfq

Asdfq, пробовал сделать отдельный запрос с итогами и присоединить область, но они уходят в самый низ документа

antoneus

Потому что их надо присоединять между циклами.

ТабДок.Присоединить(ОбластьКоличества);
       
    КонецЦикла;
//тут присоединить область с итогами
КонецЦикла;

Asdfq

antoneus, спасибо огромное!

Asdfq

antoneus, стыдно у вас что то еще спрашивать :( 

Сделал отдельный запрос по итогам и вывел это в таблицу значений, последний цикл с таблицей итогов проходится до конца и из за этого выводится последнее значение. Пробовал прервать не помогает, не понимаю куда этот цикл засунуть. В разные места пробовал ситуация не меняется

Для каждого Стр Из ТаблицаНоменклатура Цикл
        ОбластьДетальныхЗаписей.Параметры.Номенклатура = Стр.Номенклатура;
        Табдок.Вывести(ОбластьДетальныхЗаписей);
       
        Для каждого Стр2 Из ТаблицаСклады Цикл
            Отбор = Новый Структура;
            Отбор.Вставить("Номенклатура",Стр.Номенклатура);
            Отбор.Вставить("Склад",Стр2.Склад);
            Колво = Таблица.НайтиСтроки(Отбор);
            Если Колво.Количество() = 0 Тогда
                ОбластьКоличества.Параметры.КоличествоНачальныйОстаток = "";   
                ОбластьКоличества.Параметры.СуммаНачальныйОстаток = "";   
                ОбластьКоличества.Параметры.КоличествоПриход ="";
                ОбластьКоличества.Параметры.СуммаПриход = "";
                ОбластьКоличества.Параметры.КоличествоРасход = "";
                ОбластьКоличества.Параметры.СуммаРасход = "";
                ОбластьКоличества.Параметры.КоличествоКонечныйОстаток = "";
            Иначе
                ОбластьКоличества.Параметры.КоличествоНачальныйОстаток = Колво[0].КоличествоНачальныйОстаток;   
                ОбластьКоличества.Параметры.СуммаНачальныйОстаток = Колво[0].СуммаНачальныйОстаток;   
                ОбластьКоличества.Параметры.КоличествоПриход = Колво[0].КоличествоПриход;
                ОбластьКоличества.Параметры.СуммаПриход = Колво[0].СуммаПриход;
                ОбластьКоличества.Параметры.КоличествоРасход = Колво[0].КоличествоРасход;
                ОбластьКоличества.Параметры.СуммаРасход = Колво[0].СуммаРасход;
                ОбластьКоличества.Параметры.КоличествоКонечныйОстаток = Колво[0].КоличествоКонечныйОстаток;
               
            КонецЕсли;
            ТабДок.Присоединить(ОбластьКоличества);
            КонецЦикла;
              Для Каждого Стр3 из ТаблицаИтогов Цикл
                ОбластьИтоги.Параметры.КоличествоНачальныйОстаток1 = Стр3.КоличествоНачальныйОстаток;   
                ОбластьИтоги.Параметры.СуммаНачальныйОстаток1 = Стр3.СуммаНачальныйОстаток;   
                ОбластьИтоги.Параметры.КоличествоПриход1 = Стр3.КоличествоПриход;
                ОбластьИтоги.Параметры.СуммаПриход1 = Стр3.СуммаПриход;
                ОбластьИтоги.Параметры.КоличествоРасход1 = Стр3.КоличествоРасход;
                ОбластьИтоги.Параметры.СуммаРасход1 = Стр3.СуммаРасход;
                ОбластьИтоги.Параметры.КоличествоКонечныйОстаток1 = Стр3.КоличествоКонечныйОстаток;
                КонецЦикла;
            ТабДок.Присоединить(ОбластьИтоги);
           
    КонецЦикла;

Теги:

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

Рейтинг@Mail.ru

Поиск