Имя: Пароль:
1C
1С v8
Отчет с использованием универсального отчета
,
0 hawk1
 
26.03.18
12:54
Делаю самописный отчет с использованием универсального отчета. В модуле отчета в процедуре УстановитьНачальныеНастройки прописываю
    УниверсальныйОтчет.ДобавитьОтбор("Период");
    УниверсальныйОтчет.ДобавитьОтбор("ТипЦен");
    УниверсальныйОтчет.ДобавитьОтбор("Склад");
    УниверсальныйОтчет.ДобавитьОтбор("Номенклатура");
В модуле формы в обработчике кнопки Настройка прописываю
УниверсальныйОтчет.ФормаНастройка(УниверсальныйОтчет, ЭтотОбъект, ЭтаФорма, ЭлементыФормы.ТабДок);
Но форма настроек выводится пустая. Никак не могу понять в чем дело.
1 Kondarat
 
26.03.18
12:58
(0) Что там с текстом запроса построителя?
2 hawk1
 
26.03.18
13:41
(1)     ТекстЗапроса =        "ВЫБРАТЬ
                          |    ТоварыНаСкладахОстатки.Номенклатура.Бренд КАК Бренд,
                          |    ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
                          |    ТоварыНаСкладахОстатки.Номенклатура.Ссылка КАК ТМЦ,
                          |    ТоварыНаСкладахОстатки.Номенклатура.БазоваяЕдиницаИзмерения КАК ЕдиницаИзмерения,
                          |    ВЫБОР
                          |        КОГДА &МаксимальныйОстаток > 0
                          |            ТОГДА ВЫБОР
                          |                    КОГДА &УчитыватьРезерв = ИСТИНА
                          |                        ТОГДА ВЫБОР
                          |                                КОГДА ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) > &МаксимальныйОстаток
                          |                                    ТОГДА ЕСТЬNULL(&МаксимальныйОстаток, 0)
                          |                                ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)
                          |                            КОНЕЦ
                          |                    ИНАЧЕ ВЫБОР
                          |                            КОГДА ТоварыНаСкладахОстатки.КоличествоОстаток > &МаксимальныйОстаток
                          |                                ТОГДА ЕСТЬNULL(&МаксимальныйОстаток, 0)
                          |                            ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток
                          |                        КОНЕЦ
                          |                КОНЕЦ
                          |        ИНАЧЕ ВЫБОР
                          |                КОГДА &УчитыватьРезерв = ИСТИНА
                          |                    ТОГДА ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)
                          |                ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток
                          |            КОНЕЦ
                          |    КОНЕЦ КАК Количество,
                          |    ТоварыНаСкладахОстатки.Номенклатура.МинОстаток КАК МинОстаток,
                          |    СерииНоменклатуры.Ссылка КАК ОсновноеСвойство,
                          |    ТоварыНаСкладахОстатки.Номенклатура.Страна КАК Страна,
                          |    ТоварыНаСкладахОстатки.Номенклатура.Производитель КАК Производитель,
                          |    ТоварыНаСкладахОстатки.Номенклатура.МинПартия КАК МинПартия,
                          |    ТоварыНаСкладахОстатки.Номенклатура.Модель КАК Модель,
                          |    ТоварыНаСкладахОстатки.Номенклатура.Кросс КАК Кросс,
                          |    ТоварыНаСкладахОстатки.Номенклатура.Упаковка КАК Упаковка,
                          |    ЦеныНоменклатурыСрезПоследних.Цена
                          |ИЗ
                          |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
                          |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
                          |        ПО ТоварыНаСкладахОстатки.СерияНоменклатуры = СерииНоменклатуры.Ссылка
                          |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Период, ) КАК ТоварыВРезервеНаСкладахОстатки
                          |        ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
                          |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
                          |        ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                          |ГДЕ
                          |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";
    
    Если мНоменклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда
        ТекстЗапроса = ТекстЗапроса + "    И ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ(&Номенклатура)";
    КонецЕсли;
    
    Если мСклад <> Справочники.Склады.ПустаяСсылка() Тогда
        ТекстЗапроса = ТекстЗапроса + "    И ТоварыНаСкладахОстатки.Склад = &Склад";
    КонецЕсли;                      
    
    ТекстЗапроса = ТекстЗапроса + " УПОРЯДОЧИТЬ ПО ТМЦ";        
    
    УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;
3 Kondarat
 
26.03.18
13:49
(2) А где поля, условия, итоги построителя?
4 novichok79
 
26.03.18
13:52
где описание полей условий в квадратных скобках?
зачем вот это?

    Если мНоменклатура <> Справочники.Номенклатура.ПустаяСсылка() Тогда
        ТекстЗапроса = ТекстЗапроса + "    И ТоварыНаСкладахОстатки.Номенклатура В ИЕРАРХИИ(&Номенклатура)";
    КонецЕсли;
    
    Если мСклад <> Справочники.Склады.ПустаяСсылка() Тогда
        ТекстЗапроса = ТекстЗапроса + "    И ТоварыНаСкладахОстатки.Склад = &Склад";
    КонецЕсли;

без вас построитель не поймет как скомпоновать условия?
если склад и номенклатура являются измерениями, то почему
не вставить условия по ним вот сюда?
РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Период, )
и сюда?
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
5 novichok79
 
26.03.18
13:57
(3) закладка построитель в конструкторе запросов.
а вообще типа такого должно быть

  |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, {(Номенклатура).*, (Склад).*}) КАК ТоварыНаСкладахОстатки
  |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
  |        ПО ТоварыНаСкладахОстатки.СерияНоменклатуры = СерииНоменклатуры.Ссылка
  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Период, ) КАК ТоварыВРезервеНаСкладахОстатки
  |        ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
  |        ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
6 novichok79
 
26.03.18
13:58
в остальных таблицах тоже соответственно условия по измерениям занести.
7 Михаил Козлов
 
26.03.18
13:58
Посмотрите типовые отчеты на базе универсального. Например, ВаловаяПрибыль и АнализДоступностиТоваров.
И сделайте по аналогии. Написанное в (2) не годится.
8 novichok79
 
26.03.18
13:59
и еще я бы перенес запросы виртуальных таблиц регистров во временные, а то если база на постгри крутится, то могут быть тормоза.
9 hawk1
 
26.03.18
22:41
Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт
    
    // Настройка общих параметров универсального отчета
    УправлениеОтчетами.ВосстановитьРеквизитыОтчета(ЭтотОбъект, ДополнительныеПараметры);
    
    // Содержит название отчета, которое будет выводиться в шапке.
    // Тип: Строка.
    // Пример:
    // УниверсальныйОтчет.мНазваниеОтчета = "Название отчета";
    УниверсальныйОтчет.мНазваниеОтчета = СокрЛП(ЭтотОбъект.Метаданные().Синоним);
    
    // Содержит признак необходимости отображения надписи и поля выбора раздела учета в форме настройки.
    // Тип: Булево.
    // Значение по умолчанию: Истина.
    // Пример:
    // УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь;
    УниверсальныйОтчет.мВыбиратьИмяРегистра = Ложь;
    
    // Содержит имя регистра, по метаданным которого будет выполняться заполнение настроек отчета.
    // Тип: Строка.
    // Пример:
    // УниверсальныйОтчет.ИмяРегистра = "ТоварыНаСкладах";
    
    // Содержит значение используемого режима ввода периода.
    // Тип: Число.
    // Возможные значения: 0 - произвольный период, 1 - на дату, 2 - неделя, 3 - декада, 4 - месяц, 5 - квартал, 6 - полугодие, 7 - год
    // Значение по умолчанию: 0
    // Пример:
    УниверсальныйОтчет.мРежимВводаПериода = 1;
    
    // Содержит признак необходимости вывода отрицательных значений показателей красным цветом.
    // Тип: Булево.
    // Значение по умолчанию: Ложь.
    // Пример:
    // УниверсальныйОтчет.ОтрицательноеКрасным = Истина;
    УниверсальныйОтчет.ОтрицательноеКрасным = Истина;
    
    // Содержит признак необходимости вывода в отчет общих итогов.
    // Тип: Булево.
    // Значение по умолчанию: Ложь.
    // Пример:
    // УниверсальныйОтчет.ВыводитьОбщиеИтоги = Ложь;
    
    // Содержит признак необходимости вывода детальных записей в отчет.
    // Тип: Булево.
    // Значение по умолчанию: Ложь.
    // Пример:
    // УниверсальныйОтчет.ВыводитьДетальныеЗаписи = Истина;
    
    // Содержит признак необходимости отображения флага использования свойств и категорий в форме настройки.
    // Тип: Булево.
    // Значение по умолчанию: Истина.
    // Пример:
    // УниверсальныйОтчет.мВыбиратьИспользованиеСвойств = Ложь;
    
    // Содержит признак использования свойств и категорий при заполнении настроек отчета.
    // Тип: Булево.
    // Значение по умолчанию: Ложь.
    // Пример:
    // УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = Истина;
    //УниверсальныйОтчет.ИспользоватьСвойстваИКатегории = Истина;
    
    // Содержит признак использования простой формы настроек отчета без группировок колонок.
    // Тип: Булево.
    // Значение по умолчанию: Ложь.
    // Пример:
    // УниверсальныйОтчет.мРежимФормыНастройкиБезГруппировокКолонок = Истина;
    УниверсальныйОтчет.мРежимФормыНастройкиБезГруппировокКолонок = Истина;
    
    ТекстЗапроса =        "ВЫБРАТЬ
                          |    ВложенныйЗапрос.Бренд,
                          |    ВложенныйЗапрос.Артикул,
                          |    ВложенныйЗапрос.ТМЦ КАК ТМЦ,
                          |    ВложенныйЗапрос.ЕдиницаИзмерения,
                          |    ВложенныйЗапрос.Количество,
                          |    ВложенныйЗапрос.МинОстаток,
                          |    ВложенныйЗапрос.ОсновноеСвойство,
                          |    ВложенныйЗапрос.СтранаПроисхождения,
                          |    ВложенныйЗапрос.Производитель,
                          |    ВложенныйЗапрос.МинПартия,
                          |    ВложенныйЗапрос.Модель,
                          |    ВложенныйЗапрос.Кросс,
                          |    ВложенныйЗапрос.Упаковка,
                          |    ВложенныйЗапрос.Цена
                          |{ВЫБРАТЬ
                          |    Бренд.*,
                          |    Артикул,
                          |    ТМЦ.*,
                          |    ЕдиницаИзмерения.*,
                          |    Количество,
                          |    МинОстаток,
                          |    ОсновноеСвойство.*,
                          |    СтранаПроисхождения.*,
                          |    Производитель.*,
                          |    МинПартия,
                          |    Модель.*,
                          |    Кросс,
                          |    Упаковка,
                          |    Цена}
                          |ИЗ
                          |    (ВЫБРАТЬ
                          |        ТоварыНаСкладахОстатки.Номенклатура.Бренд КАК Бренд,
                          |        ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
                          |        ТоварыНаСкладахОстатки.Номенклатура.Ссылка КАК ТМЦ,
                          |        ТоварыНаСкладахОстатки.Номенклатура.БазоваяЕдиницаИзмерения КАК ЕдиницаИзмерения,
                          |        ВЫБОР
                          |            КОГДА &МаксимальныйОстаток > 0
                          |                ТОГДА ВЫБОР
                          |                        КОГДА &УчитыватьРезерв = ИСТИНА
                          |                            ТОГДА ВЫБОР
                          |                                    КОГДА ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) > &МаксимальныйОстаток
                          |                                        ТОГДА ЕСТЬNULL(&МаксимальныйОстаток, 0)
                          |                                    ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)
                          |                                КОНЕЦ
                          |                        ИНАЧЕ ВЫБОР
                          |                                КОГДА ТоварыНаСкладахОстатки.КоличествоОстаток > &МаксимальныйОстаток
                          |                                    ТОГДА ЕСТЬNULL(&МаксимальныйОстаток, 0)
                          |                                ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток
                          |                            КОНЕЦ
                          |                    КОНЕЦ
                          |            ИНАЧЕ ВЫБОР
                          |                    КОГДА &УчитыватьРезерв = ИСТИНА
                          |                        ТОГДА ТоварыНаСкладахОстатки.КоличествоОстаток - ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0)
                          |                    ИНАЧЕ ТоварыНаСкладахОстатки.КоличествоОстаток
                          |                КОНЕЦ
                          |        КОНЕЦ КАК Количество,
                          |        ТоварыНаСкладахОстатки.Номенклатура.МинОстаток КАК МинОстаток,
                          |        СерииНоменклатуры.Ссылка КАК ОсновноеСвойство,
                          |        ТоварыНаСкладахОстатки.Номенклатура.Страна КАК СтранаПроисхождения,
                          |        ТоварыНаСкладахОстатки.Номенклатура.Производитель КАК Производитель,
                          |        ТоварыНаСкладахОстатки.Номенклатура.МинПартия КАК МинПартия,
                          
                          |        ТоварыНаСкладахОстатки.Номенклатура.Модель КАК Модель,
                          |        ТоварыНаСкладахОстатки.Номенклатура.Кросс КАК Кросс,
                          |        ТоварыНаСкладахОстатки.Номенклатура.Упаковка КАК Упаковка,
                          |        ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
                          |    ИЗ
                          
                          |        РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
                          |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
                          |            ПО ТоварыНаСкладахОстатки.СерияНоменклатуры = СерииНоменклатуры.Ссылка
                          |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Период, ) КАК ТоварыВРезервеНаСкладахОстатки
                          |            ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
                          |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
                          |            ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура) КАК ВложенныйЗапрос
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    ТМЦ
                          |{УПОРЯДОЧИТЬ ПО
                          |    Бренд.*,
                          |    Артикул,
                          |    ТМЦ.*,
                          |    ЕдиницаИзмерения.*,
                          |    Количество,
                          |    МинОстаток,
                          |    ОсновноеСвойство.*,
                          |    СтранаПроисхождения.*,
                          |    Производитель.*,
                          |    МинПартия,
                          |    Модель.*,
                          |    Кросс,
                          |    Упаковка,
                          |    Цена}
                          |{ИТОГИ ПО
                          |    Количество}";
        
    
    Если УниверсальныйОтчет.ИспользоватьСвойстваИКатегории Тогда
        УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("ВложенныйЗапрос.ТМЦ", "ТМЦ", "ТМЦ", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура);
        УниверсальныйОтчет.ДобавитьСвойстваИКатегорииДляПоля("ВложенныйЗапрос.ЕдиницаИзмерения", "ЕдиницаИзмерения", "Единица измерения", ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Номенклатура);
    КонецЕсли;
    
    УниверсальныйОтчет.ПостроительОтчета.Текст = ТекстЗапроса;
    
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Бренд", "Бренд");    
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Артикул", "Артикул");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("ТМЦ", "ТМЦ");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("ЕдиницаИзмерения", "Единица измерения");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Количество", "Количество");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("ОсновноеСвойство", "Основное свойство");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Страна", "Страна");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Производитель", "Производитель");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("МинПартия", "Мин партия");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Модель", "Модель");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Кросс", "Кросс");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Упаковка", "Упаковка");
    УниверсальныйОтчет.мСтруктураПредставлениеПолей.Вставить("Цена", "Цена");
    
    УниверсальныйОтчет.ДобавитьОтбор("ТипЦен");
    УниверсальныйОтчет.ДобавитьОтбор("Склад");
    УниверсальныйОтчет.ДобавитьОтбор("Номенклатура");
    
        // Установка представлений полей
    УниверсальныйОтчет.УстановитьПредставленияПолей(УниверсальныйОтчет.мСтруктураПредставлениеПолей, УниверсальныйОтчет.ПостроительОтчета);
    
    // Установка типов значений свойств в отборах отчета
    УниверсальныйОтчет.УстановитьТипыЗначенийСвойствДляОтбора();
    
    // Заполнение начальных настроек универсального отчета
    УниверсальныйОтчет.УстановитьНачальныеНастройки(Ложь);
КонецПроцедуры // УстановитьНачальныеНастройки()

но все остается по прежнему.
10 chelentano
 
27.03.18
07:12
(9) смотри (5)
11 hawk1
 
27.03.18
15:23
(10) Переписал эту часть запроса вот так
                          |        РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, {(Номенклатура).*, (Склад).*}) КАК ТоварыНаСкладахОстатки
                          |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СерииНоменклатуры КАК СерииНоменклатуры
                          |            ПО ТоварыНаСкладахОстатки.СерияНоменклатуры = СерииНоменклатуры.Ссылка
                          |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Период, {(Номенклатура).*, (Склад).*}) КАК ТоварыВРезервеНаСкладахОстатки
                          |            ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
                          |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
                          |            ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура) КАК ВложенныйЗапрос

и ничего
12 Kondarat
 
27.03.18
15:29
(11) Обрати внимание на квадратные скобки, их размещение и наполнение
"ВЫБРАТЬ
|    ТоварыВРозницеОстатки.Склад,
|    ТоварыВРозницеОстатки.Номенклатура,
|    ТоварыВРозницеОстатки.КоличествоОстаток КАК КоличествоОстаток
|{ВЫБРАТЬ
|    Склад.*,
|    Номенклатура.*,
|    КоличествоОстаток}
|ИЗ
|    РегистрНакопления.ТоварыВРознице.Остатки(&ДатаКон, {(Номенклатура).*, (Склад).*}) КАК ТоварыВРозницеОстатки
|{ГДЕ
|    ТоварыВРозницеОстатки.Склад.*,
|    ТоварыВРозницеОстатки.Номенклатура.*}
|{УПОРЯДОЧИТЬ ПО
|    Склад.*,
|    Номенклатура.*}
|ИТОГИ
|    СУММА(КоличествоОстаток)
|ПО
|    ОБЩИЕ
|{ИТОГИ ПО
|    Склад.*,
|    Номенклатура.*}"