Имя: Пароль:
1C
1С v8
СКД. Программно изменить текст схемы компоновки данных.
0 ProProg
 
24.01.12
14:03
Как программно изменить в тексте запроса некоторые значения.

Например в запросе есть участок по запросу регистра где указана периодичность в параметрах запроса. Например Месяц.
Нужно программно до выполнения изменить Месяц на произвольную (выбирается в диалоге).
1 ProProg
 
24.01.12
14:04
Ранее в обычных запросах это делал методом
ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Месяц",Периодичность);
2 Mort
 
24.01.12
14:04
Периодичность можно вытащить как параметр СКД.
3 Mort
 
24.01.12
14:05
Если текстом трудно, на закладке компоновки можно задать псевдонимы параметров для виртуальных таблиц (кнопка такая есть там)
4 ProProg
 
24.01.12
14:09
(2) не катит. это не параметр. это текст запроса.
5 ProProg
 
24.01.12
14:10
Месяц, день и т.д. и т.п. это методы языка 1С.

|        ВЫБРАТЬ
   |            Продажи.Номенклатура,
   |            Продажи.ХарактеристикаНоменклатуры,
   |            0,
   |            СУММА(Продажи.КоличествоОборот * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / Продажи.Номенклатура.ЕдиницаДляОтчетов.Коэффициент),
   |            КОЛИЧЕСТВО(Различные(Продажи.Период)),
   |            КОЛИЧЕСТВО(Различные(Продажи.ДокументПродажи)),
   |            0,
   |            0,
   |            0,
   |            0,
   |            ВЫБОР
   |                КОГДА КОЛИЧЕСТВО(Различные(Продажи.Период)) > 0
   |                        И СУММА(Продажи.КоличествоОборот) > 0
   |                    ТОГДА СУММА(Продажи.КоличествоОборот * Продажи.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / Продажи.Номенклатура.ЕдиницаДляОтчетов.Коэффициент) / КОЛИЧЕСТВО(Различные(Продажи.Период))
   |                ИНАЧЕ 0
   |            КОНЕЦ,
   |            0,
   |            0,
   |            0,
   |            0,
   |            0,
   |            0,
   |            0
   |        ИЗ
   |            РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Месяц, {(Номенклатура).* КАК Номенклатура, (Подразделение).* КАК Подразделение, (Контрагент).* КАК Покупатель, (ДоговорКонтрагента).* КАК ДоговорКонтрагента}) КАК Продажи
   |       СГРУППИРОВАТЬ ПО
   |                Продажи.Номенклатура,
   |                Продажи.ХарактеристикаНоменклатуры
6 ProProg
 
24.01.12
14:11
Это не может быть указано параметром т.к. является встроенной функцией запроса

РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Месяц, {(Номенклатура).* КАК Номенклатура, (Подразделение).* КАК Подразделение, (Контрагент).* КАК Покупатель, (ДоговорКонтрагента).* КАК ДоговорКонтрагента}) КАК Продажи
7 dmpl
 
24.01.12
14:12
(0) Ну так сделай источник данных - таблица значений. А уж ее формируй как привык.
8 ProProg
 
24.01.12
14:13
У меня СКД запрос, но формируется программно. В том числе результат я программно извлекаю.
Мне сейчас тупо надо как то сделать чтобы в запросе менялся Месяц на любую другую периодичность.
9 dmpl
 
24.01.12
14:13
+(7) или даже результат запроса можно попробовать.
10 Mort
 
24.01.12
14:13
(6) Себя убеждаешь? Ладно...

А у меня работает.

Пысы Месяц, день и т.п. для платформы это числа, ну на случай если программно значение параметра поставить. А так СКД-шка представления даёт для выбора.
11 Mort
 
24.01.12
14:15
(6) "Это не может быть указано параметром т.к. является встроенной функцией запроса ".
А что оно делает в параметрах виртуальной таблицы?
12 Mort
 
24.01.12
14:16
РегистрНакопления.ОборотыБДДСПлан.Обороты(&НачалоПериода, &КонецПериода, Месяц {(&ВидПериода)}, Сценарий = &Сценарий .. и т.д.
13 ProProg
 
24.01.12
14:17
(11) не тупи. в параметрах регистра (для оборотного - это после второй запятой) есть параметр - Периодичность. Оно текстовое.
Это не передаваемый параметр
14 ProProg
 
24.01.12
14:18
если тебя смутило слово Параметр. птут говорится не про параметр запроса, а параметр выборки регистра.
15 ProProg
 
24.01.12
14:18
(12) хм... не знал.
Месяц {(&ВидПериода)} меняет периодичность?
16 Shurjk
 
24.01.12
14:18
(0) Открой для себя построитель запросов.
17 Mort
 
24.01.12
14:19
(15) Во во, сам не тупи.
(16) В бабруйск ПЗ.
18 ProProg
 
24.01.12
14:24
Что то пустой результат.
19 Shurjk
 
24.01.12
14:24
(17) Чего?
20 ProProg
 
24.01.12
14:25
Значение параметра должно быть текстовое или с типом перечисления?
21 ProProg
 
24.01.12
14:29
или число? как только добавил в параметрах появился параметр с значением 9.
Т.е. должно быть число?
22 ProProg
 
24.01.12
14:30
Есть описание как 1С периодичность по числам берет?
Месяц как я понял - 9.
Какие числа будут для других периодичностей?
23 Defender aka LINN
 
24.01.12
14:38
ППЦ... А периодичность "Авто" - не по-пацански, типа?
24 ProProg
 
24.01.12
14:41
(23) какое нафиг авто. авто добавляет в переменные запроса все группировки с периодами. а мне они вообще нафиг не нужны. Ты хоть текст запроса смотрел?
Мне периодичность нужна (её юзер выбирает в диалоге отчета) для просчета определенных колонок которые зависят от неё. никаких группировко по периодичностям не выводится.
25 ProProg
 
24.01.12
14:43
в (5) текст запроса. От указанной периодичности влияет расчет
|            КОЛИЧЕСТВО(Различные(Продажи.Период)),

Юзер выбирает период продаж, периодичность и получает один из показателей - количество периодов продаж (только те когда товар продавался) за весь период. Показатель получает числом.

Т.е. если например выбрал 7 месяцев то по товару будут числа 3,4,5 и т.п. т.е. в скольких месяцах за все 7 были продажи.
26 Defender aka LINN
 
24.01.12
14:51
КОЛИЧЕСТВО(Различные(Продажи.ПериодМесяц))
КОЛИЧЕСТВО(Различные(Продажи.ПериодДень))
И т.д.
27 ProProg
 
24.01.12
15:08
(26) ты сам понимаешь что это фигня полная. да еще и лишние вычисления.
у меня тут 100 000 номенклатуры. 2 года загруженных продаж в УТ11. в день по 2-5 тысяч товаров продаются.
28 ProProg
 
24.01.12
15:08
Итак 1С умирает - недостаточно памяти выдает. Запрос по 10 регистрам. а ты еще хоч чтобя я еще вычислений навешал.
29 sanja26
 
24.01.12
15:12
Посмотри отчет УТ 11 Остатки по складам в ценах номенклатуры. При компоновке данных
30 Defender aka LINN
 
24.01.12
15:12
(27) Какие, нафиг, лишние вычисления? Учите матчасть. Результирующий запрос<>запрос в схеме какбе.
31 sanja26
 
24.01.12
15:23
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
   
   СтандартнаяОбработка = Ложь;
   
   ПараметрВидЦены = Новый ПараметрКомпоновкиДанных("ВидЦены");
   ЗначениеПараметраВидЦены = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрВидЦены);
   Если ЗначениеПараметраВидЦены <> Неопределено Тогда
       ЗначениеПараметраВидЦены.Значение = ВидЦены;
       ЗначениеПараметраВидЦены.Использование = Истина;
   КонецЕсли;
   
   ДокументРезультат.Очистить();
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
   
   Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры") Тогда
       
       СхемаКомпоновкиДанных = Отчеты.ВедомостьПоТоварамНаСкладахВЦенахНоменклатуры.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
       ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос;
       
       ЗаменяемыйТекст =
       "    ВЫБОР
       |        КОГДА
       |            ЦеныНоменклатурыА.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
       |            ИЛИ ЕСТЬNULL(ЦеныНоменклатурыА.Упаковка.Коэффициент,0) = 0
       |        ТОГДА
       |            ЦеныНоменклатурыА.Цена
       |        ИНАЧЕ
       |            ЦеныНоменклатурыА.Цена / ЦеныНоменклатурыА.Упаковка.Коэффициент
       |    КОНЕЦ КАК Цена,
       |    ВЫБОР
       |        КОГДА
       |            ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
       |        ТОГДА
       |            0
       |        КОГДА
       |            ЦеныНоменклатурыБ.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
       |            ИЛИ ЕСТЬNULL(ЦеныНоменклатурыБ.Упаковка.Коэффициент,0) = 0
       |        ТОГДА
       |            ЦеныНоменклатурыБ.Цена
       |        ИНАЧЕ
       |            ЦеныНоменклатурыБ.Цена / ЦеныНоменклатурыБ.Упаковка.Коэффициент
       |    КОНЕЦ КАК СтараяЦена,
       |        ВЫБОР
       |            КОГДА
       |                ЦеныНоменклатурыА.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
       |                ИЛИ ЕСТЬNULL(ЦеныНоменклатурыА.Упаковка.Коэффициент,0) = 0
       |            ТОГДА
       |                ЦеныНоменклатурыА.Цена
       |            ИНАЧЕ
       |                ЦеныНоменклатурыА.Цена / ЦеныНоменклатурыА.Упаковка.Коэффициент
       |        КОНЕЦ
       |        - ВЫБОР
       |            КОГДА
       |                ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
       |            ТОГДА
       |                0
       |            КОГДА
       |                ЦеныНоменклатурыБ.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
       |                ИЛИ ЕСТЬNULL(ЦеныНоменклатурыБ.Упаковка.Коэффициент,0) = 0
       |            ТОГДА
       |                ЦеныНоменклатурыБ.Цена
       |            ИНАЧЕ
       |                ЦеныНоменклатурыБ.Цена / ЦеныНоменклатурыБ.Упаковка.Коэффициент
       |        КОНЕЦ
       |         КАК Дельта";
       
       Если Найти(ТекстЗапроса, ЗаменяемыйТекст) = 0 Тогда
           ВызватьИсключение НСтр("ru = 'Некорректный текст запроса'");
       КонецЕсли;
       
       ТекстЗамены =
       "    ЦеныНоменклатурыА.Цена КАК Цена,
       |    ВЫБОР
       |        КОГДА
       |            ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
       |        ТОГДА
       |            0
       |        ИНАЧЕ
       |            ЦеныНоменклатурыБ.Цена
       |    КОНЕЦ КАК СтараяЦена,
       |        ЦеныНоменклатурыА.Цена
       |        - ВЫБОР
       |            КОГДА
       |                ЦеныНоменклатурыБ.Цена ЕСТЬ NULL
       |            ТОГДА
       |                0
       |            ИНАЧЕ
       |                ЦеныНоменклатурыБ.Цена
       |        КОНЕЦ
       |         КАК Дельта";
       
       ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЗаменяемыйТекст, ТекстЗамены);
       СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = ТекстЗапроса;
       
   КонецЕсли;
   
   МакетКомпоновки = КомпоновщикМакета.Выполнить(
       СхемаКомпоновкиДанных,
       КомпоновщикНастроек.ПолучитьНастройки(),
       ДанныеРасшифровки
   );

   ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
   ПроцессорКомпоновки.Инициализировать(
       МакетКомпоновки,
       ,
       ДанныеРасшифровки
   );

   ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
   ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

   ПроцессорВывода.НачатьВывод();
   ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
   ПроцессорВывода.ЗакончитьВывод();
   
КонецПроцедуры // ПриКомпоновкеРезультата()
32 ProProg
 
24.01.12
15:40
(31)а проще никак? не хотелось бы весь текст запроса дублировать. он огромный. а менять надо всего 1 слово.
33 ProProg
 
24.01.12
15:40
ааа. все допер
34 ProProg
 
24.01.12
15:40
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос;
далее меняем и опять впихиваем
35 ProProg
 
24.01.12
15:40
Спасибо!
36 ProProg
 
24.01.12
15:56
(31) вот это лучший вариант. Всего три строчки ушло. Всего навсего нужно было текст получить, заменить что надо и опять вставить. Все работает! Считает правильно.