|
Типизация колонок таблицы значений при передаче в запрос | ☑ | ||
---|---|---|---|---|
0
erudemz
01.03.23
✎
17:14
|
Стоит задача создать отчет по созданным за период контрагентам. Реквизит аля "ДатаСоздания" отсутствует, дополнительных документов при создании элемента справочника не создается.
Вижу два варианта: вычисление даты создания из GUID и ВыгрузитьЖурналРегистрации(). Остановился на втором. Выгружаю в таблицу значений, всё успешно. Но при попытке передать полученную ТЗ в запрос, выдает ошибку "Тип не может быть выбран в запросе". Пробую типизировать перед передачей в функцию выгрузки - эффект тот же, типизация слетает. Полный код: Фильтр = Новый Структура("ДатаНачала,ДатаОкончания,Событие,Метаданные"); Фильтр.ДатаНачала = НачалоПериода; Фильтр.ДатаОкончания = КонецПериода; Фильтр.Событие = "_$Data$_.New"; Фильтр.Метаданные = Метаданные.Справочники.Контрагенты; // Попытка типизации ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Данные", Новый ОписаниеТипов("СправочникСсылка.Контрагенты")); ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Данные"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТЗ.Данные КАК Данные |ПОМЕСТИТЬ ВТТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТТЗ.Данные КАК Данные |ИЗ | ВТТЗ КАК ВТТЗ"; Запрос.УстановитьПараметр("ТЗ", ТЗ); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); Как наиболее эффективно типизировать эту колонку? По задумке, я получаю список созданных за месяц контрагентов, а потом расширяю его необходимыми для отчета данными в запросе. |
|||
1
lEvGl
гуру
01.03.23
✎
17:20
|
можно сортировать по ссылке
|
|||
2
lEvGl
гуру
01.03.23
✎
17:25
|
а, за период, не понял
|
|||
3
FIXXXL
01.03.23
✎
17:25
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | ВЫРАЗИТЬ(ТЗ.Данные КАК Справочник.Контрагенты) КАК Данные |ПОМЕСТИТЬ ВТТЗ |ИЗ | &ТЗ КАК ТЗ |
|||
4
lEvGl
гуру
01.03.23
✎
17:28
|
после ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Данные") тз ведь перетрется, значит типизировать нужно после
либо 3 да, если отработает |
|||
5
НЕА123
01.03.23
✎
17:29
|
масиивконтров = тз.выгрузитьколонку("Данные")
? |
|||
6
erudemz
01.03.23
✎
17:36
|
(3) по причине:
{(2, 2)}: Несовместимые типы "ВЫРАЗИТЬ" <<?>>ВЫРАЗИТЬ(ТЗ.Данные КАК Справочник.Контрагенты) КАК Данные |
|||
7
FIXXXL
01.03.23
✎
17:39
|
(6) а что там вообще в колонке "данные"? журнал то текстовый по сути
|
|||
8
erudemz
01.03.23
✎
17:45
|
(7) Записи типа Справочник.Контрагенты: https://pastenow.ru/966a8f8ea92d8af09e22aaaa535f8ed3
|
|||
9
erudemz
01.03.23
✎
17:46
|
(4) после не получится, типизация возможна только при создании или выгрузке
|
|||
10
lEvGl
гуру
01.03.23
✎
17:47
|
(9) та ну
|
|||
11
lEvGl
гуру
01.03.23
✎
17:49
|
(7) судя по сп должны быть составного
Данные (Data) - данные, произвольного типа, в зависимости от события |
|||
12
FIXXXL
01.03.23
✎
17:57
|
(8) видимо таки тип составной, да с NULL
|
|||
13
lEvGl
гуру
02.03.23
✎
11:03
|
действительно не выбирает
ну так можно ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Данные"); ТЗ.Колонки.Добавить("Хренанные", Новый ОписаниеТипов("СправочникСсылка.Контрагенты")); Для Каждого Строка Из ТЗ Цикл Строка.Хренанные = Строка.Данные; КонецЦикла; вцелом если надо определить добавленных за период, то это учитывается фильтром здесь ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Данные"); |
|||
14
lEvGl
гуру
02.03.23
✎
11:08
|
а тип данных эта история ВыгрузитьЖурналРегистрации забавный какой то возвращает, даже не тип, а типок какой то неясный
|
|||
15
Гипервизор
02.03.23
✎
12:03
|
(14) Это просто пустое описание типов, всё равно что написать Новый ОписаниеТипов("") или Новый ОписаниеТипов(Новый Массив).
|
|||
16
Has
02.03.23
✎
12:07
|
(0) может есть версионирование
|
|||
17
lEvGl
гуру
02.03.23
✎
12:09
|
(15) да, но тип у колонки только на чтение, так что..
|
|||
18
erudemz
02.03.23
✎
12:51
|
(13) Спасибо, вариант с копированием вертелся в голове, но думал может что-то поинтереснее найдется
Задача определения добавленных за период выполнена изначально, к ней вопросов нет, фильтр отрабатывает верно |
|||
19
erudemz
02.03.23
✎
12:55
|
По итогу просто передал полученную из ВыгрузитьЖурналРегистрации() таблицу значений в СКД. Дополнительные данные получил через точку в настройках группировки СКД (Данные.ИНН...).
Итоговый код: Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); Настройки = КомпоновщикНастроек.ПолучитьНастройки(); ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; НачалоПериода = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода").Значение; КонецПериода = Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода").Значение; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); // Создаём фильтр для журнала регистрации Фильтр = Новый Структура("ДатаНачала,ДатаОкончания,Событие,Метаданные"); Фильтр.ДатаНачала = НачалоПериода; Фильтр.ДатаОкончания = КонецПериода; Фильтр.Событие = "_$Data$_.New"; Фильтр.Метаданные = Метаданные.Справочники.Контрагенты; // Выгружаем записи журнала в ТЗ: "Дата" - дата создания, "Данные" - элемент справочника "Контрагенты" ТЗ = Новый ТаблицаЗначений; ВыгрузитьЖурналРегистрации(ТЗ, Фильтр, "Дата,Данные"); // Передаём ТЗ в СКД ВнешнийНаборДанных = Новый Структура("ТаблицаЗначений", ТЗ); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки); ДокументРезультат.Очистить(); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); КонецПроцедуры |
|||
20
erudemz
02.03.23
✎
13:00
|
(16) Нет, версионирование для этого справочника отключено. Да и не до конца представляю, как из данных версионирования вытащить только контргаентов, которые были созданы за период. Журнал регистрации подошел отлично
|
|||
21
Garykom
гуру
02.03.23
✎
13:17
|
(0) Нафуя знать когда контрагент создан?
Не проще первые документы где контрагент появился взять? |
|||
22
erudemz
02.03.23
✎
16:28
|
(21) Плановый отдел отчитывается о количестве новых клиентов за период.
Я предлагал им определить по документам, но в каких-то редких случаях никаких документов не создается, заводится только новый контрагент. Плюс пришлось бы проверять что это действительно первый документ у данного контрагента. И на первый взгляд, алгоритм не очень бы эффективный получился. |
|||
23
lEvGl
гуру
02.03.23
✎
16:45
|
(22) ну так новый элемент в справочнике - еще не клиент. если появился договор, значит началось движение, значит клиент
и потом, могут одного и того же в реальности создавать в базе повторно... в общем методика определения состояния дел на предприятии по созданным в справочнике контрагенте некорректная имхо |
|||
24
lEvGl
гуру
02.03.23
✎
16:48
|
+ закончился договор следовательно и поставки, клиент отвалился, потом через год возобновился и т д и т д. определять по элементам справочника это чепуха.
|
|||
25
mistеr
02.03.23
✎
17:04
|
(0) Оффтопик, но
>Реквизит аля "ДатаСоздания" отсутствует >Вижу два варианта: вычисление даты создания из GUID и ВыгрузитьЖурналРегистрации() Почему начинаешь с самых сложных: Почему бы просто не создать такой реквизит и не заполнять его? Хотя бы как доп. реквизит. |
|||
26
Garykom
гуру
02.03.23
✎
17:29
|
(25) причем автоматически при записи заполнять если пустой
|
|||
27
Garykom
гуру
02.03.23
✎
17:29
|
(26)+ для всех старых контрагентов заполнить по документам или еще как
|
|||
28
lEvGl
гуру
02.03.23
✎
17:30
|
(26) в договоре есть, это и "пометодичнее" будет
|
|||
29
erudemz
06.03.23
✎
13:00
|
(24) Да, логика странная, согласен. Но они по такому принципу отчитываются уже n лет до моего прихода, причем раньше новые контрагенты вычленялись в отчет ещё более "интересным" методом: по нумерации из справочника. Но потом что-то поломалось
|
|||
30
erudemz
06.03.23
✎
13:07
|
(25) Добавление реквизита - это первое, что пришло в голову. Но в тот момент им требовались данные за прошедший месяц, так что пришлось бы решать вопрос с заполнением дат. Да и по итогу, использование варианта с ВыгрузитьЖурналРегистрации() оказалось довольно простым вариантом
|
|||
31
erudemz
06.03.23
✎
13:23
|
(28) Повторюсь: иногда они заводят только контрагента без проведения каких-либо документов. По какому принципу и зачем - не знаю.
Да и вообще, насколько методично создавать новый реквизит ради одного отчета, который используется раз в месяц? |
|||
32
Lexandr
06.03.23
✎
13:30
|
(31) База треснет? Дата и автор создания объекта иногда нужные вещи и лучше, если они лежат под рукой и доступны не только программисту.
|
|||
33
Сергиус
06.03.23
✎
13:38
|
(0)А зачем тебе помещать в запрос ТЗ и потом тут же её выгружать через него? Или там еще какие-то действа с ней планируются? Бери готовую ТЗ и по ней ходи циклом.
|
|||
34
erudemz
06.03.23
✎
17:09
|
(33) Планировались. Потом всё пришло к (19)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |