|
Отчет с использованием универсального отчета | ☑ | ||
---|---|---|---|---|
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) Обрати внимание на квадратные скобки, их размещение и наполнение
"ВЫБРАТЬ | ТоварыВРозницеОстатки.Склад, | ТоварыВРозницеОстатки.Номенклатура, | ТоварыВРозницеОстатки.КоличествоОстаток КАК КоличествоОстаток |{ВЫБРАТЬ | Склад.*, | Номенклатура.*, | КоличествоОстаток} |ИЗ | РегистрНакопления.ТоварыВРознице.Остатки(&ДатаКон, {(Номенклатура).*, (Склад).*}) КАК ТоварыВРозницеОстатки |{ГДЕ | ТоварыВРозницеОстатки.Склад.*, | ТоварыВРозницеОстатки.Номенклатура.*} |{УПОРЯДОЧИТЬ ПО | Склад.*, | Номенклатура.*} |ИТОГИ | СУММА(КоличествоОстаток) |ПО | ОБЩИЕ |{ИТОГИ ПО | Склад.*, | Номенклатура.*}" |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |