|
ВыполнитьИнструкцию() 1cpp 1С 7.7 | ☑ | ||
---|---|---|---|---|
0
Franchiser
31.05.24
✎
17:03
|
Есть запрос в котором есть поля типа ID 9 и указаны алиасы полей для преобразования парсером в ссылочные типы 1с. Запрос с итогами с конструкцией with rollup. На месте агрегированный полей хотел вывести слово "все", но из-за парсера получается, что при использовании выполнитьинструкцию() парсер считает что нужно в этих полях в ТЗ делать типы справочник.контрагенты, т.е. получается что строка "все" пропадает и заменяется на пустую ссылку.
Как можно дать указание парсеру, чтобы на выходе в колонке ТЗ получался составной тип: Справочник.Контрагенты + Строка, т.е. чтобы строка "все" не пропадала. И еще другая проблем есть: но это уже по SQL. Если сделать CASE c функцией Grouping() то внутри case почему то перестает работать кастование строки в дату. |
|||
1
Garykom
31.05.24
✎
16:59
|
поставь хотя бы секция "1С 7.7"
|
|||
2
АгентБезопасной Нацио
31.05.24
✎
17:19
|
составных типов в клюшках нет.
Если правильно понял, у тебя в агрегированных полях будет null, значит, делай еще одно поле с наименованием контрагента, куда IsNull вместо наименования будет подставлять строку "<все>". Ну а действия отрабатывай по значнию поля контрагента. |
|||
3
trad
31.05.24
✎
17:23
|
(2) составных нет, но есть неопределенный
|
|||
4
АгентБезопасной Нацио
31.05.24
✎
17:26
|
(3) предлагаешь заюзать СамуюДлиннуюСтроку ?
|
|||
5
trad
31.05.24
✎
17:31
|
case when Grouping() then 'S' + 'все' else 'B1' + $ВидСправочника36.ВидСправочника + id end [Пеле $Неопределено]
|
|||
6
Franchiser
31.05.24
✎
17:34
|
(5) тогда придется делать преобразование через Metadatawork
|
|||
7
trad
31.05.24
✎
17:36
|
зачем?
|
|||
8
Franchiser
31.05.24
✎
17:37
|
(2) Документов разных типов могут же быть в одной колонке ТЗ, мне нужно тоже самое почти, но чтобы были в колонке как строки так и ссылки на справочник.
|
|||
9
Franchiser
31.05.24
✎
17:37
|
(5) что такое S и В1. В результате выполнения запроса парсер выдаст готовые ссылки?
|
|||
10
trad
31.05.24
✎
17:38
|
у тебя в значении ТЗ уже будет либо ссылка либо строка
|
|||
11
АгентБезопасной Нацио
31.05.24
✎
17:39
|
(9) S - строка, В1 - справочник, О1 - документ
|
|||
12
trad
31.05.24
✎
17:40
|
(9) S и В1 - это составные части "СамойДлиннойСтроки"
да выдаст ссылки для E1,B1,O1 E1 - перечисление, B1 -справочник, O1-док |
|||
13
Franchiser
31.05.24
✎
17:42
|
(12) спасибо, проверю, не знал о таком варианте
|
|||
14
trad
31.05.24
✎
17:49
|
'S' + 'все' строка не может быть длиннее скольких-то символов, не помню точно сколько Это для хранения в базе есть ограничение, а тут нет |
|||
15
АгентБезопасной Нацио
31.05.24
✎
17:54
|
(14) о как!
Буду знать. Только зачем? |
|||
16
АгентБезопасной Нацио
31.05.24
✎
17:55
|
(14) вообще, 23 символа
|
|||
17
Franchiser
31.05.24
✎
18:11
|
Такой запрос не работает, в чем может быть причина
Спотыкается именно на "Case when Grouping(дат)=1 then 'все' else дат end as грдата" Нельзя иметь на выходе case два типа varchar и datetime? With tab as ( Select Cast(Left('20240101', 8) AS datetime) as дат, 'test' as test Union all Select Cast(Left('20240102', 8) AS datetime) as дат, 'test2' as test ) Select test, дат, Grouping(test), Case when Grouping(дат)=1 then 'все' else дат end as грдата from tab Group by test, дат with rollup Msg 241, Level 16, State 1, Line 2 Conversion failed when converting date and/or time from character string. |
|||
18
trad
31.05.24
✎
18:56
|
Так же действуй через самую длинную строку. Талько тут будет D и S
|
|||
19
Franchiser
31.05.24
✎
20:53
|
(18) это запрос чисто в студии выполняю
|
|||
20
Franchiser
31.05.24
✎
22:27
|
(18) какое значение нужно написать для вида перечисления вместо $ВидСправочника36.ВидСправочника для формирования строки для СамойДлиннойСтроки?
Upd. Подобрал: $ВидПеречисления36 |
|||
21
trad
31.05.24
✎
23:05
|
(19) ну так скл то сервер не умеет в составные типы, и стороку 'все' он к типу datetime привести не могет
|
|||
22
Franchiser
31.05.24
✎
23:42
|
(21) все получилось - сделал полностью весь отчёт одним запросом sql без постообработки
|
|||
23
Злопчинский
31.05.24
✎
23:51
|
Ну поделись уже
И результат для пояснеоия |
|||
24
Franchiser
01.06.24
✎
02:58
|
(23)
ТекстЗапроса = "-- запрос отчета Итоги |SELECT | Case when Grouping($РасходнаяНакладнаяСтроки.Комитент)=1 then 'S' + '(все)' else 'B1' + $ВидСправочника36.Контрагенты + $РасходнаяНакладнаяСтроки.Комитент end [Комитент $Неопределено] | , Case when Grouping(Журнал.$ОбщийРеквизит.ЮридическоеЛицо)=1 then 'S' + '(все)' else 'B1' +$ВидСправочника36.Контрагенты+ Журнал.$ОбщийРеквизит.ЮридическоеЛицо end [ЮридическоеЛицо $Неопределено] | , Case when Grouping(Left(Журнал.DATE_TIME_IDDOC, 8))=1 then 'S' + '(все)' else 'D'+Left(Журнал.DATE_TIME_IDDOC, 8) end as [Документ_дата $Неопределено] | , Case when Grouping($РасходнаяНакладная.ТипНакладной)=1 then 'S' + '(все)' else 'E1' + $ВидПеречисления36.ТипыРасходнойНакладной + $РасходнаяНакладная.ТипНакладной end [ТипНакладной $Неопределено] | , Sum($РасходнаяНакладнаяСтроки.Сумма) Сумма | , Sum($РасходнаяНакладнаяСтроки.НДС) НДС | , SUM($РасходнаяНакладнаяСтроки.Количество) Количество | , SUM($РасходнаяНакладнаяСтроки.Всего) Всего | , MAX(Комитенты.Descr) as НаименованиеКомитента | , MAX(ЮЛ.Descr) as НаименованиеЮЛ |FROM _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK) ON Журнал.IDDOC = РасходнаяНакладная.IDDOC | INNER JOIN $ДокументСтроки.РасходнаяНакладная AS РасходнаяНакладнаяСтроки With (NOLOCK) ON РасходнаяНакладная.IDDOC = РасходнаяНакладнаяСтроки.IDDOC | LEFT JOIN $Справочник.Контрагенты AS Комитенты With (NOLOCK) ON Комитенты.ID = $РасходнаяНакладнаяСтроки.Комитент | LEFT JOIN $Справочник.Контрагенты AS ЮЛ With (NOLOCK) ON ЮЛ.ID = Журнал.$ОбщийРеквизит.ЮридическоеЛицо |WHERE Журнал.DATE_TIME_IDDOC between :Дата1 and :Дата2~ | AND (Журнал.$ОбщийРеквизит.ЮридическоеЛицо = :ЮЛ) | AND ($РасходнаяНакладнаяСтроки.Комитент = :Комитент) | AND ($РасходнаяНакладная.ХХХ = 1) AND ((Журнал.CLOSED & 1) = 1) | AND (Журнал.$ОбщийРеквизит.НеИспользуется = 0) | AND ($РасходнаяНакладная.ИдКонтрагентаХХХ = :ИдХХХ) |GROUP BY $РасходнаяНакладнаяСтроки.Комитент, Журнал.$ОбщийРеквизит.ЮридическоеЛицо,Left(Журнал.DATE_TIME_IDDOC, 8),$РасходнаяНакладная.ТипНакладной WITH ROLLUP |ORDER BY |GROUPING($РасходнаяНакладнаяСтроки.Комитент) DESC, |НаименованиеКомитента, |GROUPING(Журнал.$ОбщийРеквизит.ЮридическоеЛицо) DESC, |НаименованиеЮЛ, |GROUPING(Left(Журнал.DATE_TIME_IDDOC, 8)) DESC, |Left(Журнал.DATE_TIME_IDDOC, 8), |GROUPING($РасходнаяНакладная.ТипНакладной) DESC, |$РасходнаяНакладная.ТипНакладной;"; //Установка фильтров: Если ПустоеЗначение(ЮЛ)=1 Тогда ТекстЗапроса= СтрЗаменить(ТекстЗапроса,"AND (Журнал.$ОбщийРеквизит.ЮридическоеЛицо = :ЮЛ)",""); ИначеЕсли ВсеЮЛКроме=1 Тогда ТекстЗапроса= СтрЗаменить(ТекстЗапроса,"AND (Журнал.$ОбщийРеквизит.ЮридическоеЛицо = :ЮЛ)","AND (Журнал.$ОбщийРеквизит.ЮридическоеЛицо <> :ЮЛ)"); КонецЕсли; Если ПустоеЗначение(Комитент)=1 Тогда ТекстЗапроса= СтрЗаменить(ТекстЗапроса,"AND ($РасходнаяНакладнаяСтроки.Комитент = :Комитент)",""); КонецЕсли; Если ПустоеЗначение(ИдХХХ)=1 Тогда ТекстЗапроса= СтрЗаменить(ТекстЗапроса,"AND ($РасходнаяНакладная.ИдКонтрагентаХХХ = :ИдХХХ)",""); ИначеЕсли ВсеКонтрагентыКроме = 1 Тогда ТекстЗапроса= СтрЗаменить(ТекстЗапроса,"AND ($РасходнаяНакладная.ИдКонтрагентаХХХ = :ИдХХХ)","AND ($РасходнаяНакладная.ИдКонтрагентаХХХ <> :ИдХХХ)"); КонецЕсли; //Изменения запроса под вариант не по дням: Если ПоДням = 0 Тогда //исключаем из запроса все что касается вывода Даты (можно было отдельный текст запроса написать...) ТекстЗапроса = СтрЗаменить(ТекстЗапроса,", Case when Grouping(Left(Журнал.DATE_TIME_IDDOC, 8))=1 then 'S' + '(все)' else 'D'+Left(Журнал.DATE_TIME_IDDOC, 8) end as [Документ_дата $Неопределено]","");//SELECT для даты ТекстЗапроса = СтрЗаменить(ТекстЗапроса,",Left(Журнал.DATE_TIME_IDDOC, 8)",""); //Group BY для даты ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"GROUPING(Left(Журнал.DATE_TIME_IDDOC, 8)) DESC,",""); //ORDER BY для группинг ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Left(Журнал.DATE_TIME_IDDOC, 8),","");//ORDER BY для поля дата КонецЕсли; рс.УстановитьТекстовыйПараметр("Дата1", НачДата); рс.УстановитьТекстовыйПараметр("Дата2", КонДата); рс.УстановитьТекстовыйПараметр("ЮЛ", ЮЛ); рс.УстановитьТекстовыйПараметр("Комитент", Комитент); рс.УстановитьТекстовыйПараметр("ИдХХХ", ИдХХХ); тз = рс.ВыполнитьИнструкцию(ТекстЗапроса); //тз.ВыбратьСтроку(); Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица1"); Если (ПоДням = 1) Тогда СекцияШапки = "ШапкаДень"; СекцияСтроки = "СтрокиДень"; Иначе СекцияШапки = "Шапка"; СекцияСтроки = "Строки"; КонецЕсли; Таб.ВывестиСекцию(СекцияШапки); Тз.ВыбратьСтроки(); Пока Тз.ПолучитьСтроку() = 1 Цикл Таб.ВывестиСекцию(СекцияСтроки); КонецЦикла;
|
|||
25
Franchiser
03.06.24
✎
15:13
|
(21) ВыполнитьИнструкцию() может выгружать результат сразу в индексированную таблицу?
|
|||
26
АгентБезопасной Нацио
03.06.24
✎
15:14
|
(25) да
|
|||
27
Franchiser
03.06.24
✎
15:23
|
Если сейчас такой код:
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса); Что нужно сделать, заранее определить : тз = СоздатьОбъект("Индексированнаятаблица") или передать ее параметром в метод? Из справки: ВыполнитьИнструкцию(<?>,<?>,<?>) Синтаксис: ExecuteStatement(strTextSQL, obVT, bEraseVT) Назначение: Выполняет SQL запрос, при ошибке парсинга или при ошибке на ODBC драйвере формируется исключение. Если запрос возвращает набор строк, метод возвращает объект с результатом запроса, если запрос не возвращает набор строк (не select, а DML или прочий), возвращается количество обработанных строк. Если запрос содержит несколько SQL инструкций (multistatement batch), результаты возвращаются только от первой инструкции. Однако, на драйвер уходит весь текст запроса (По спецификации ODBC, будут ли выполнены остальные инструкции в пакете зависит от драйвера. Для драйвера SQL Server они выполняются), остальные результаты игнорируются. Если запрос возвращает набор данных, и в наборе данных нет ни одной строки, это не является ошибкой. Если запрос не параметризированный - метод гарантированно закрывает курсор. Возвращает: объект с результатом запроса (ТаблицаЗначений или наследник), или число - количество обработанных строк. Параметры: - strTextSQL (Строка): текст запроса, если пустая строка запрос считается параметризированным. По умолчанию пустая строка. - obVT (объект): ТаблицаЗначений или наследник от нее для приема результатов запроса, именно этот объект и будет возвращаемым значением. Это должен быть именно ТаблицаЗначений или наследник, а не объект реализующий ее интерфейс. Если тип объекта - пустое значение, создается объект типа ТаблицаЗначений. По умолчанию: пустое значение. - bEraseVT (Число): 1 - очистить таблицу и создать колонки. 0 - не создавать. По умолчанию - 1. |
|||
28
Chai Nic
03.06.24
✎
15:36
|
(27) Я неоднократно передавал ИТ в ВыполнитьИнструкцию, всё работает нормально
У вас старая версия документации. Вот актуальная. ВыполнитьИнструкцию / ExecuteStatement Синтаксис: ВыполнитьИнструкцию([ТекстЗапроса], [ОбъектРезультатов], [Очищать]) Параметры: ТекстЗапроса - тип: Строка. Текст запроса, если пустая строка - запрос считается параметризированным. Необязателен, по умолчанию - пустая строка. ОбъектРезультатов - тип: любой из ТаблицаЗначений, СписокЗначений, ИндексированнаяТаблица или наследник от любого из них. (Это должен быть объект какого-либо из перечисленных типов, а не объект, реализующий их интерфейс.) Если параметр передан, то он и будет возвращаемым значением. Необязателен, по умолчанию пустое значение, в этом случае будет возвращен объект типа ТаблицаЗначений. Очищать - тип: Число. 1 - очистить переданный ОбъектРезультатов и создать колонки если его тип ТаблицаЗначений или ИндексированнаяТаблица. 0 - не очищать. Необязателен, по умолчанию - 1. Возвращает: тип: ТаблицаЗначений, СписокЗначений, ИндексированнаяТаблица или наследник от любого из них, Число. Объект с результатом запроса, или число - количество обработанных строк. |
|||
29
Franchiser
03.06.24
✎
15:52
|
(28) Такой код должен быть?
итз = СоздатьОбъект("Индексированнаятаблица") рс.ВыполнитьИнструкцию(ТекстЗапроса,итз) |
|||
30
Chai Nic
03.06.24
✎
15:57
|
(29) Ага
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |