|
Помогите с СКД 🠗 (Pro-tone 10.06.2021 11:20) | ☑ | ||
---|---|---|---|---|
0
WED
10.06.21
✎
08:49
|
Нужно сделать отчет а-ля "Прайс-Лист" - иерархический список номенклатуры с ценой, которую рассчитывает функция общего модуля.
Внешнюю функцию в схеме компоновки внешнюю функцию использовать нельзя по двум причинам: 1. Функция возвращает структуру Цена+Валюта цены, 2. Несмотря на отбор по Номенклатуре, СКД сперва обрабатывает весь справочник номенклатуры (и почему-то по нескольку раз вызывает внешнюю функцию для каждой номенклатуры), а только потом накладывает отбор. На данный я решил задачу в СКД отчета добавил НабораДанных вида Объект, а в в функции ПриКомпоновкеРезультата формирую конечную таблицу (Номенклатура, Цена, Валюта), но этот подход мне не нравится из-за того, что приходится перед выполнением своего запроса разбираться с отборами и другими настройками, которые сделал пользователь в отчете. Вопрос: Есть ли возможность при выполнении отчета, не своим запросом формировать таблицу номенлатуры с учетом пользовательских отборов и других настроек отчета, а получить её из СКД, чтобы добавить в эту таблицу свои данные (Цена+Валюта) и вывести результат? |
|||
1
toypaul
гуру
10.06.21
✎
08:57
|
"Несмотря на отбор по Номенклатуре, СКД сперва обрабатывает весь справочник номенклатуры" кривой отбор. правильный отбор накладывается сразу в запросе
"и почему-то по нескольку раз вызывает внешнюю функцию для каждой номенклатуры" а как иначе-то? |
|||
2
ДенисЧ
10.06.21
✎
08:59
|
Можно сделать две схемы. Одну для получения списка номенклатуры, вторую - для формирования отчёта.
|
|||
3
toypaul
гуру
10.06.21
✎
09:00
|
"Есть ли возможность при выполнении отчета, не своим запросом формировать таблицу номенлатуры с учетом пользовательских отборов" есть. недавно такой отчет сделал. делается это через две схемы. в первой схеме получаем таблицу базовую. во второй цепляем остальные данные
|
|||
4
WED
10.06.21
✎
09:04
|
(1)
"кривой отбор. правильный отбор накладывается сразу в запросе" Каким образом в запросе в СКД я могу заранее сделать отбор, который напрямую зависит от настроек пользователя и непредсказуем? Отбора может не быть совсем, а может быть, например, по единице измерения номенклатуры. "а как иначе-то?" Объясните? Я вот не понимаю почему внешняя функция вызывается для каждой номенклатуры по 2 раза. (2),(3) Пробовал так, но первая схема (запрос) выдает мне вообще всю номенклатуру без учета настроек и отборов пользователя. В запросе отборов нет. Я где-то ошибся? |
|||
5
toypaul
гуру
10.06.21
✎
09:16
|
1 - долго объяснять
2 - несколько раз для каждой. ну это перебор наверное зависит от схемы 3 - где-то ошибся. не передал отборы из основной схемы в базовую. никто же не говорил что будет просто |
|||
6
ДенисЧ
10.06.21
✎
09:32
|
(4) "В запросе отборов нет. Я где-то ошибся?"
Сам ответил, сам спросил... |
|||
7
WED
10.06.21
✎
09:54
|
(6) Я предположил :) Никогда в отчетах в запросе в схеме компоновки не делал отборы - они же автоматом накладываются в зависимости от настроек отчета пользователем. И как я понимаю, СКД делает выборку по всем данным, а только потом накладывает пользовательский отбор. Есть другой способ?
|
|||
8
GreyK
10.06.21
✎
10:11
|
(7) Это зависит от того как написан запрос и какие соединения в нем использованы.
|
|||
9
WED
10.06.21
✎
10:14
|
(7) Да куда-уж проще:
ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения ИЗ Справочник.Номенклатура КАК Номенклатура |
|||
10
Pro-tone
10.06.21
✎
10:26
|
Делается всё очень просто. Запрос должен состоять из обращения к двум таблицам - спр номенклатура и цены номенклатуры (вся либо срез последних в зависимости от нужд), левое соединение. Зачем там 2 схемы СКД я не понимаю...
|
|||
11
WED
10.06.21
✎
10:27
|
(10) Таблицы цен не существует. Цена рассчитывается по сложной формуле.
|
|||
12
Pro-tone
10.06.21
✎
10:32
|
(11) тогда добавляется вычисляемое поле, в выражении которого пишешь вызов функции общего модуля для расчета цены
|
|||
13
WED
10.06.21
✎
10:47
|
(12) Вы первый пост вообще не читали?
1. Функция расчета цены возвращает структуру с Ценой и Валютой цены. В вычисляемых полях нельзя использовать структуру. 2. СКД вызывает внешнюю функцию для каждой номенклатуры по несколько раз (минимум 2). Функция "тяжелая", а из-за того, что СКД сперва получает данные (и, соответственно, вызывает внешнюю функцию) для всего справочника, а лишь потом накладывает отборы, то это превращается в очень долгое ожидание даже для 1 номенклатуры. |
|||
14
Pro-tone
10.06.21
✎
10:53
|
(13)
1. так перепишите чтоб возвращала цену 2. ставьте отбор на конкретную номенклатуру, включая запрет на вывод таблицы, в чем проблема? если нужна таблица всей номенклатуры - делаете отдельный регистр цен номенклатуры, заполняется он (обновляется) регламентным фоновым заданием, допустим, раз в 5-10 минут робот ее перезаполняет фоном, а вы в свой отчет данные по ценам тащите из нее |
|||
15
Pro-tone
10.06.21
✎
10:56
|
+ я уверен, что каждые 5-10 мин перезаполнять регистр цен это даже часто, можно фоновое стартовать при записи новой номенклатуры или изменения реквизитов при записи и по расписанию раз в час,два,три
|
|||
16
WED
10.06.21
✎
11:06
|
(14)(15)
1. Не перепишу, потому что, во-первых, цена формируется для каждой номенклатуры по весьма тяжелому алгоритму, учитывающему в том числе и валюту, а, во-вторых, Прайс мультивалютный, т.е. валюта для каждой номенклатуры своя, а не не одна на весь прайс. Поэтому функция возвращает и цену и валюту этой цены. 2. Заранее считать и хранить цены в регистре бессмысленно, т.к. цена рассчитывается по запросу в реальном времени и зависит от массы факторов (в том числе и от пользователя для которого эта цена считается). Цена может измениться в любую секунду и рассчитанная 5-10 минут назад уже неактуальна. На этом, думаю, дискуссию можно прекратить. Через объединение наборов данных вопрос решается вполне приемлимо. |
|||
17
Pro-tone
10.06.21
✎
11:14
|
1. неубедительно, а пересчет по курсу всегда можно сделать
2. тоже неубедительно >>Через объединение наборов данных вопрос решается вполне приемлимо. так медленное выполнение никуда ж не уйдет |
|||
18
1Сергей
10.06.21
✎
11:27
|
(16) интересно у вас бизнес делается...
|
|||
19
1Сергей
10.06.21
✎
11:34
|
Приятель пишет о своей трудовой юности (конец 90-х):
«Когда-то давно из меня пытались сделать сэйла. Предлагалось продавать людЯм услуги по установке внешних антенн. Я спросил, почем это стоит. Мне было сказано: тыща умножить на коэффициент крыши. Я спросил, что такое коэффициент крыши. Мне разъяснили, что если крыша сложная, то коэффициент может быть сильно больше единицы. А если простая, то может быть меньше единицы. Тогда я поинтересовался, а как же узнать, сложная крыша или простая. И оказалось... если у клиента есть деньги, значит крыша у него сложная. И вот читаю в новостях: "Tesla резко повышает цены на солнечные крыши из-за нового параметра "сложность крыши".» https://bash.im/quote/465508 |
|||
20
WED
10.06.21
✎
11:45
|
(18) А шо поделать? Не мы такие, жизнь такая :)
(19) Ну что-то типа того, только еще есть коэффициенты "ветра", "солнца" и "настроения директора". По делу: Вопрос окончательно решён (без применения двух наборов данных) благодаря этому решению: http://forum.infostart.ru/forum9/topic246390/message2490592/#message2490592 Коротко: результат запроса выгружается в таблицу значений, обрабатывается как надо, а потом загружается обратно в СКД и выводится. Длинно: Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Настройки = КомпоновщикНастроек.ПолучитьНастройки(); ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); НаборДанных = МакетКомпоновки.НаборыДанных.ВнутренниеДанные; Запрос = Новый Запрос(НаборДанных.Запрос); Для Каждого ПараметрЗапроса Из МакетКомпоновки.ЗначенияПараметров Цикл Запрос.УстановитьПараметр(ПараметрЗапроса.Имя, ПараметрЗапроса.Значение); КонецЦикла; ТЗ = Запрос.Выполнить().Выгрузить(); ОбработкаРезультатаСКД(ТЗ); СвойстваНабора = Новый Структура("Имя,ИсточникДанных,Поля,Отбор"); ЗаполнитьЗначенияСвойств(СвойстваНабора, НаборДанных); МакетКомпоновки.НаборыДанных.Удалить(НаборДанных); НаборДанных = МакетКомпоновки.НаборыДанных.Добавить(Тип("НаборДанныхОбъектМакетаКомпоновкиДанных")); ЗаполнитьЗначенияСвойств(НаборДанных, СвойстваНабора); НаборДанных.ИмяОбъекта = "ТЗ"; Для Каждого Поле Из СвойстваНабора.Поля Цикл НовоеПоле = НаборДанных.Поля.Добавить(); ЗаполнитьЗначенияСвойств(НовоеПоле, Поле); КонецЦикла; ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, Новый Структура("ТЗ", ТЗ), ДанныеРасшифровки, Истина); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновки); КонецПроцедуры Процедура ОбработкаРезультатаСКД(ТЗ) //Обрабатываем ТЗ как нам нравится КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |