Имя: Пароль:
1C
1С v8
Типизация колонок таблицы значений при передаче в запрос
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)
AdBlock убивает бесплатный контент. 1Сергей