Имя: Пароль:
1C
1С v8
Вывод даты на макет печатной формы
,
0 Валидатор
 
02.09.13
12:23
Столкнулся с проблемой: получаю запросом все необходимые данные для вывода на печатную форму, после чего заполняю печатную форму циклом, но в этом цикле я могу вытащить дату, которая должна быть у меня в шапке, т.е.
Шапка: ДатаПланирования
Потом сам макет: куча заполненных строк, вот код:
ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("Макет");
    Шапка = Макет.ПолучитьОбласть("Шапка");
    //Шапка.Параметры.ДатаДокумента = формат(СсылкаНаОбъект.Дата,"ДФ=ММММ-кк-гггг");
    План = Макет.ПолучитьОбласть("План");
    Строка = Макет.ПолучитьОбласть("Строка");
    Отступ = Макет.ПолучитьОбласть("Отступ");
    Подписи = Макет.ПолучитьОбласть("Подписи");
    
    Шапка.Параметры.Подразделение = СсылкаНаОбъект.Подразделение;
    //ТабДок.Вывести(Шапка);
    //ТабДок.Вывести(План);
    
    Если ЗначениеЗаполнено(СсылкаНаОбъект.Подразделение) Тогда
    ПолучениеКода = СтрЗаменить(СсылкаНаОбъект.Подразделение.ПолныйКод(), "/", Символы.ПС);
    НаименованиеПодразделения = Справочники.Подразделения.НайтиПоКоду(ПолучениеКода);
    КонецЕсли;
    
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПланЗакупокСоставПлана.Номенклатура.Артикул КАК НоменклатураАртикул,
    |    ПланЗакупокСоставПлана.Номенклатура КАК Номенклатура,
    |    ПланЗакупокСоставПлана.Количество,
    |    ПланЗакупокСоставПлана.Цена КАК Цена,
    |    ПланЗакупокСоставПлана.ттДатаИзвещения КАК ДатаИзвещения,
    |    ПланЗакупокСоставПлана.Ссылка.ДатаПланирования,
    |    ПланЗакупокСоставПлана.ЕдиницаИзмерения.Наименование,
    |    ПланЗакупокСоставПлана.Номенклатура.ДополнительноеОписаниеНоменклатуры КАК МинимальныеТребования,
    |    ПланЗакупокСоставПлана.ттСпособЗакупки КАК СпособЗакупки,
    |    ПланЗакупокСоставПлана.ЗакупкаВЭлектронной КАК Закупка,
    |    ВЫБОР
    |        КОГДА ЕСТЬNULL(ПланЗакупокСоставПлана.Номенклатура.Артикул, """") = """"
    |            ТОГДА """"
    |        ИНАЧЕ ПОДСТРОКА(ПланЗакупокСоставПлана.Номенклатура.Артикул, 1, 2) + ""."" + ПОДСТРОКА(ПланЗакупокСоставПлана.Номенклатура.Артикул, 3, 2) + ""."" + ПОДСТРОКА(ПланЗакупокСоставПлана.Номенклатура.Артикул, 5, 100)
    |    КОНЕЦ КАК Артикул,
    |    &Параметр,
    |    ПланЗакупокСоставПлана.НомерСтроки,
    |    ПланЗакупокСоставПлана.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.Код КАК ЕдОКЕИ,
    |    ПланЗакупокСоставПлана.СуммаНДС
    |ПОМЕСТИТЬ втПараметр
    |ИЗ
    |    Документ.ПланЗакупок.СоставПлана КАК ПланЗакупокСоставПлана
    |ГДЕ
    |    ПланЗакупокСоставПлана.Ссылка = &Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ттРегионПоставки.кодОКАТО,
    |    ттРегионПоставки.Наименование,
    |    втПараметр.НоменклатураАртикул,
    |    втПараметр.Номенклатура,
    |    втПараметр.Количество,
    |    втПараметр.Цена,
    |    втПараметр.ДатаИзвещения,
    |    втПараметр.ДатаПланирования,
    |    втПараметр.ЕдиницаИзмеренияНаименование,
    |    втПараметр.МинимальныеТребования,
    |    втПараметр.СпособЗакупки,
    |    втПараметр.Артикул,
    |    втПараметр.Параметр,
    |    втПараметр.НомерСтроки КАК НомерСтроки,
    |    втПараметр.ЕдОКЕИ,
    |    втПараметр.Закупка,
    |    втПараметр.СуммаНДС
    |ИЗ
    |    втПараметр КАК втПараметр
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ттРегионПоставки КАК ттРегионПоставки
    |        ПО втПараметр.Параметр = ттРегионПоставки.Подразделение
    |
    |УПОРЯДОЧИТЬ ПО
    |    НомерСтроки";    
    Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
    Запрос.УстановитьПараметр("Параметр", НаименованиеПодразделения);
    Результат = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Номер = 0;
    
    

    
        
    
    
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Номер = Номер + 1 ;
        Шапка.Параметры.ДатаДокумента = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=ММММ-кк-гггг");
        Строка.Параметры.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Строка.Параметры.Порядковый = Номер;
        Строка.Параметры.Закупка = ВыборкаДетальныеЗаписи.Закупка;
        Строка.Параметры.Артикул = ВыборкаДетальныеЗаписи.Артикул;
        Строка.Параметры.Количество = ВыборкаДетальныеЗаписи.Количество;
        Строка.Параметры.Сумма = ОКР(((ВыборкаДетальныеЗаписи.Цена * ВыборкаДетальныеЗаписи.Количество) + ВыборкаДетальныеЗаписи.СуммаНДС),1);
        Строка.Параметры.ОКДП = ВыборкаДетальныеЗаписи.НоменклатураАртикул;
        Строка.Параметры.ЕдОКЕИ = ВыборкаДетальныеЗаписи.ЕдОКЕИ;
        Строка.Параметры.ОКАТОРегион = ВыборкаДетальныеЗаписи.КодОкато;
        Строка.Параметры.НаименованиеРегион = ВыборкаДетальныеЗаписи.Наименование;
        Строка.Параметры.Требования = ВыборкаДетальныеЗаписи.МинимальныеТребования;
        Строка.Параметры.ЕдНаименование = ВыборкаДетальныеЗаписи.ЕдиницаИзмеренияНаименование;
        Строка.Параметры.СпособЗакупки = ВыборкаДетальныеЗаписи.СпособЗакупки;
                    
        //заполняем по дате извещения месяцы
        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 1 Тогда
            Строка.Параметры.январь = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;
        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 2 Тогда
            Строка.Параметры.февраль = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 3 Тогда
            Строка.Параметры.мартИсп = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 4 Тогда
            Строка.Параметры.апрИсп = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 5 Тогда
            Строка.Параметры.майИсп = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 6 Тогда
            Строка.Параметры.июньИсп = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 7 Тогда
            Строка.Параметры.июльИсп = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 8 Тогда
            Строка.Параметры.авгИсп = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 9 Тогда
            Строка.Параметры.сентябрь = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 10 Тогда
            Строка.Параметры.октярь = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 11 Тогда
            Строка.Параметры.нобярь = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаПланирования)= 12 Тогда
            Строка.Параметры.декабрь = формат(ВыборкаДетальныеЗаписи.ДатаПланирования,"ДФ=yyyy");    
        КонецЕсли;


        //заполняем по дате планирования месяцы
        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 1  И  НЕ ВыборкаДетальныеЗаписи.ДатаИзвещения = '00010101'Тогда
            Строка.Параметры.я = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.я = "";
        КонецЕсли;
        
        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 2 Тогда
            Строка.Параметры.ф = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.ф = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 3 Тогда
            Строка.Параметры.март = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
             Строка.Параметры.март = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 4 Тогда
            Строка.Параметры.апр = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.апр = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 5 Тогда
            Строка.Параметры.май = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.май = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 6 Тогда
            Строка.Параметры.июнь = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");    
        Иначе
            Строка.Параметры.июнь = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 7 Тогда
            Строка.Параметры.июль = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.июль = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 8 Тогда
            Строка.Параметры.авг = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.авг = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 9 Тогда
            Строка.Параметры.с = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.с = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 10 Тогда
            Строка.Параметры.о = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.о = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 11 Тогда
            Строка.Параметры.н = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.н = "";
        КонецЕсли;

        Если Месяц(ВыборкаДетальныеЗаписи.ДатаИзвещения)= 12 Тогда
            Строка.Параметры.д = формат(ВыборкаДетальныеЗаписи.ДатаИзвещения,"ДФ=yyyy");
        Иначе
            Строка.Параметры.д = "";
        КонецЕсли;

        ТабДок.Вывести(строка);
    КонецЦикла;
    
    ТабДок.Вывести(Шапка);
    ТабДок.Вывести(План);

Область шапка - область с Датой планирования которая в начале должна идти, но данные в нее попадают только когда отрабатывает цикл, то есть или каждый раз будет дублирование шапки, или строк в печатной форме. Как мне сделать, чтобы шапка писалась 1 раз, потом выводилась, а потом заполнялись остальные части?
1 Валидатор
 
02.09.13
12:24
в цикл заполнение шапки не поставить, потому что будет дублироваться шапка, а данные, для вывода шапки в цикле мы и получаем при обходе выборки
2 Wobland
 
02.09.13
12:24
нужно как-то повлиять на порядок строк в коде
3 Godofsin
 
02.09.13
12:25
я бы сказал, приложить неимоверные усилия.
4 Валидатор
 
02.09.13
12:26
ну так вот как, я и спрашиваю
5 Валидатор
 
02.09.13
12:26
если сначала я получаю данные для вывода в шапку, при обходе выборки, в цикле, и в этом же цикле вывожу строки, мне в этом цикле и шапку выводить?
6 Wobland
 
02.09.13
12:27
(4) колдовство_над_шапкой;
магия_остальных_частей_в_цикле;
7 Валидатор
 
02.09.13
12:29
(6) по нормальному не ответить? какая магия?
8 Godofsin
 
02.09.13
12:29
Ну можно так наг*внокодить:

    Результат = Запрос.Выполнить().Выгрузить();
    
  //  ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Номер = 0;
    
    

    
        
        Шапка.Параметры.ДатаДокумента = формат(Результат[0].ДатаПланирования,"ДФ=ММММ-кк-гггг");    
    
    
    Для каждого ВыборкаДетальныеЗаписи.Следующий из Результат Цикл
        Номер = Номер + 1 ;

        Строка.Параметры.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Строка.Параметры.Порядковый = Номер;
        Строка.Параметры.Закупка = ВыборкаДетальныеЗаписи.Закупка;
9 Godofsin
 
02.09.13
12:31
блин, поторопился
10 Godofsin
 
02.09.13
12:31
Результат = Запрос.Выполнить().Выгрузить();
    
  //  ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Номер = 0;
    
    

    
        
        Шапка.Параметры.ДатаДокумента = формат(Результат[0].ДатаПланирования,"ДФ=ММММ-кк-гггг");    
    ТабДок.Вывести(Шапка);
    
    Для каждого ВыборкаДетальныеЗаписи из Результат Цикл
        Номер = Номер + 1 ;

        Строка.Параметры.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Строка.Параметры.Порядковый = Номер;
        Строка.Параметры.Закупка = ВыборкаДетальныеЗаписи.Закупка;
11 Wobland
 
02.09.13
12:31
(7) по нормальному: убери вывод шапки из цикла
12 Валидатор
 
02.09.13
12:32
(11) но данные в шапку получаются только после обхода цикла, вот в чем проблема
13 Валидатор
 
02.09.13
12:34
(10) спс помогло
14 Godofsin
 
02.09.13
12:36
(13) но это криво, задумайся =)
15 Wobland
 
02.09.13
12:38
(12) отличный повод задуматься над подходом к задаче
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан