8.х Таблица значений с циклическим заполнением колонок

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ste4kin48455, 21 дек 2015.

  1. TopicStarter Overlay
    ste4kin48455
    Offline

    ste4kin48455 Опытный в 1С

    Регистрация:
    15 дек 2014
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    Всем доброго.
    Задача - вывести таблицу прихода/расхода товаров за выбранный период с понедельной разбивкой. Решил реализовать как ТаблицуЗначений (сначала думал сделать отчетом, но не нашел, как). Поскольку количество столбцов заранее неизвестно, таблица генерируется программно:
    Код:
       
    //*** описание ТЗ как реквизита формы
        массивТипаВыбора = новый массив;
        массивТипаВыбора.Добавить(тип("таблицаЗначений"));
        описаниеТипаВыбора = новый описаниеТипов(массивТипаВыбора);
        массивРеквизитов = новый массив;
        массивРеквизитов.Добавить(новый реквизитФормы("ТЗФорма", описаниеТипаВыбора, "", "ТЗформа"));
       
        //*** описание типов
        КЧ = новый КвалификаторыЧисла(10,2);
        КС = новый КвалификаторыСтроки(100);
    
        мас = новый массив;
        мас.Добавить(тип("Строка"));
        ТипСтрока = новый ОписаниеТипов(мас,,, КС);
        мас.Очистить();
    
        мас = новый массив;
        мас.Добавить(тип("Число"));
        ТипЧисло = новый ОписаниеТипов(мас,, КЧ);
        мас.Очистить();
        // ***
    
       //создаем временную таблицу значений
        ТЗ = новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("товар", ТипСтрока, "товар");   
       
        для н=1 по КолвоНедель цикл
            ТЗ.Колонки.Добавить("приход" + н, ТипЧисло, "приход" + н);
            ТЗ.Колонки.Добавить("расход" + н, ТипЧисло, "расход" + н);
        КонецЦикла;
       
        для каждого колонка из тз.Колонки цикл
            массивРеквизитов.Добавить(новый РеквизитФормы(колонка.Имя, колонка.ТипЗначения, "ТЗФорма"));
        КонецЦикла;   
       
        изменитьРеквизиты(массивРеквизитов);
        таблицаПолейВыбора = Элементы.Добавить("ТЗФорма", тип("ТаблицаФормы"));
        таблицаПолейВыбора.ПутьКДанным = "ТЗФорма";
        таблицаПолейВыбора.Отображение = отображениеТаблицы.Список;
       
        для каждого колонка из ТЗ.колонки цикл
            новыйЭлемент = элементы.Добавить(колонка.Имя, тип("ПолеФормы"), таблицаПолейВыбора);
            новыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
            новыйЭлемент.ПутьКДанным = "ТЗФорма." + Колонка.Имя;
            новыйЭлемент.Ширина = 10;
        КонецЦикла;
    
    Потом заполняется колонка наименований:
    Код:
        запрНом = новый запрос;
        запрНом.Текст = "выбрать ТоварыНаСкладахОбороты.Номенклатура КАК номенклатура
        | из РегистрНакопления.ТоварыНаСкладах.Обороты() КАК ТоварыНаСкладахОбороты";
        ТЗНом = запрНом.Выполнить().Выгрузить();   
           
        для каждого стрНом из ТЗНом цикл
            стрНом = стрНом.номенклатура;
           
            //добавить данную номенклатуру во временную ТЗ
            СтрТЗ = ТЗ.Добавить();
            СтрТЗ.товар = стрНом;
        КонецЦикла;
    
    Наконец, выгружаем товар из временной ТЗ в ТЗ формы:
    Код:
    ЗначениеВРеквизитФормы(ТЗ, "ТЗФорма");
    Проблема - циклическое заполнение приходов и расходов. Если я правильно понимаю, каждая строка этих данных заполняется циклом, вложенным в цикл заполнения колонки товаров. То есть на каждой итерации по заполнению строки с товаром делаем запрос на приход и расход, в который передаем наименование товара, даты начала и конца периода. Результат запроса выгружаем в таблицу значений, которая в итоге имеет одну строку. Это работает, когда показываются данные за весь период, то есть когда есть три колонки: товар, приход, расход.

    Но в данном случае требуется по две колонки на каждую неделю. Пусть имена этих колонок будут отличаться номером недели, то есть приход1, расход1, приход2, расход2 и тд. Понятно, что при этом организуется цикл, в котором в запросе на приход и расход вместо конца периода передается дата, бывшая на начало итерации + неделя.

    Вопрос возникает при передаче сумм прихода и расхода из таблицы значений по результатам запроса во временную таблицу. Как описать, что в каждой итерации при выгрузке данных из таблицы результата запроса во временную ТЗ цифра в имени колонок прихода и расхода увеличивается на 1? Ведь в целом процесс выгрузки выглядит так:
    Код:
            
            ТЗПрихРасхОбор = ЗапрПрихРасхОбор.Выполнить().выгрузить();
            для каждого стрПрихРасхОбор из ТЗПрихРасхОбор цикл
                    стрТЗ.приход = стрПрихоРасхОбор.приход;
                   стрТЗ.расход = стрПрихоРасхОбор.расход;
                    стрТЗ.оборот = стрПрихоРасхОбор.оборот;
             КонецЦикла;
    
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Насколько понял суть проблемы: использовать счетчик итераций и устанавливать имя колонки согласно значения этого счетчика.
    Запрос в цикле - не очень хорошее решение.
  3. TopicStarter Overlay
    ste4kin48455
    Offline

    ste4kin48455 Опытный в 1С

    Регистрация:
    15 дек 2014
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    наконец добрался до кода. спасибо, помогло. получилось так:
    Код:
    ТЗ = ЗапросНоменклатуры();
    
    для н=1 по колвоНедель цикл              
            ТЗ.колонки.добавить("приход" + н, типЧисло, "приход" + н);      
            ТЗ.колонки.добавить("расход" + н, типЧисло, "расход" + н);
        КонецЦикла;
      
        для н = 1 по колвоНедель цикл  
            КолонкаПрих = ТЗ.колонки.найти("приход" + н);
            КолонкаРасх = ТЗ.колонки.найти("расход" + н);
          
            КонецПериода = началоПериода + неделя;
            ТЗПР = ЗапросОборотов(НачалоПериода, КонецПериода);
          
            МПрих = ТЗПР.выгрузитьКолонку(0);
            МРасх = ТЗПР.выгрузитьКолонку(1);          
            ТЗ.загрузитьКолонку(МПрих, КолонкаПрих);
            ТЗ.загрузитьКолонку(Мрасх, КолонкаРасх);
          
            НачалоПериода = КонецПериода;
     КонецЦикла;
    
    оптимизировать не стал (например, по поводу запроса в цикле), так как итоговый вид таблицы изначально не устраивал в плане наглядности, хотелось другого решения. вспомнил про макет и табличный документ, пробую через него

Поделиться этой страницей