Имя: Пароль:
1C
1С v8
Как в построителе отчета сделать отбор по полю составного типа?
,
0 Тенепопятам
 
01.04.21
11:55
Источник данных для построителя - таблица значений с полями составного типа. При выполнении отбора по полю составного типа построитель ругается, что нельзя сравнивать значения разных типов. Как обойти эту проблему?
1 Kondarat
 
01.04.21
12:33
(0) И что не получаетс? Показывай как делал.
2 Тенепопятам
 
01.04.21
13:14
//ДокументыКИмпортуДляОтбора - таблица значений на форме обработки "КлиентБанк"
//Поле контрагент имеет составной тип - Контрагент, Строка, Организация


ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументыКИмпортуДляОтбора);

ПоляНастройки = ПостроительОтчета.Отбор.ПолучитьДоступныеПоля();

//Тут удаление лишних полей отбора              

ПостроительОтчета.Отбор.УстановитьДоступныеПоля(ПоляНастройки);


ФормаНастройкиЗаполнения = ЭтотОбъект.ПолучитьФорму("ФормаОтбора");

//На форму выведен ПостроительОтчета.Отбор

ФормаНастройкиЗаполнения.ОткрытьМодально(); //пользователь устанавливает отбор. Для полей составного типа выбирает сначала тип, потом значение

ПостроительОтчета.Выполнить();

ДокументыКИмпорту = ПостроительОтчета.Результат.Выгрузить();
              
//////////////////////////
Далее ошибка:

{ВнешняяОбработка.КлиентБанк.Форма.Форма.Форма(1004)}: Ошибка при получении значения атрибута контекста (Результат)

ДокументыКИмпорту = ПостроительОтчета.Результат.Выгрузить();

по причине:

{(99, 37)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля

неограниченной длины и поля несовместимых типов.

ОписаниеИсточникаДанных.Контрагент <<?>>= &Параметр1
3 Тенепопятам
 
01.04.21
14:13
?
4 RomanYS
 
01.04.21
14:15
Ограничь длину строки
5 RomanYS
 
01.04.21
14:17
+(4) возможно ещё лучше разделить данные на две колонки: контрагентСсылка и контрагентСтрока
6 Kondarat
 
01.04.21
14:18
(3) А как отбор на форме заполняется? Который пользователю показывается.
Такое впечатление, что для поля "Контрагент" Отбор = Ложь.
Только, что проверил. Отбор по полю составного типа рпботает штатно.
7 Тенепопятам
 
01.04.21
14:19
(4) длина строки ограничена. Если в качестве значения выбирать строку, то ошибки нет, а если контрагента, то есть.
8 Тенепопятам
 
01.04.21
14:22
(6) Заполняется автоматом. Построитель отчета реквизит обработки, у формы отбора основной реквизит "ОбработкаОбъект", на форму выведена ТЗ с источником данных Построитель.Отбор
9 Тенепопятам
 
01.04.21
14:23
Выглядит все адекватно, отбор-вид сравнения-значение. Для контрагента сначала выбираешь тип, потом значение
10 Kondarat
 
01.04.21
14:34
(8) Из того кода, что ты привел отбор не может заполниться автоматом.
11 АнализДанных
 
01.04.21
14:40
(2) Если я правильно понял твою проблему, то тебе надо использовать "Выразить"

Выразить(ОписаниеИсточникаДанных.Контрагент КАК Справочник.Контрагенты) = &Параметр1

или так

Выбор когда ТипЗнч(&Параметр1) = Тип(Строка) Тогда
   Выразить(ОписаниеИсточникаДанных.Контрагент КАК Строка(1024)) = &Параметр1
Иначе
   Выразить(ОписаниеИсточникаДанных.Контрагент КАК Справочник.Контрагенты) = &Параметр1
Конец
12 Тенепопятам
 
01.04.21
14:44
(10) Заполняется и работает. После открытия на форме список полей и значений, можно выбрать что нужно, закрыть форму и построитель отбирает что нужно. Спотыкается только на поле составного типа "Контрагент"
13 Тенепопятам
 
01.04.21
14:48
(11) Так запроса то нет - в качестве источника используется ТЗ. Попробую переделать на запрос.
14 Kondarat
 
01.04.21
14:57
(12) >> на форму выведена ТЗ с источником данных Построитель.Отбор
Наверное не ТЗ а ТабличноеПоле с типом Отбор?

А так смотри, что в ДоступныхПолях построителя и в полях отбора.
Ибо с составным типом все работает как надо.
Да, и что хоть за конфигурация?
15 Тенепопятам
 
01.04.21
15:47
УПП. Да, табличное поле конечно, сорри.
16 Тенепопятам
 
01.04.21
15:59
Если в списке составного типа есть строка - ругается. Если нет, но все ок... Проверил на других реквизитах.
17 Kondarat
 
01.04.21
16:08
(16) Ну не знаю... Взял УТ 10.3., документ ПриходныйКассовыйОрдер. Там Реквизит Контрагент составного типа. Добавил ему Тип("Строка"), длина 500, пихнул построителю - все работает.
18 Тенепопятам
 
01.04.21
16:25
(17) Может таблица значений ему не нравится... А как еще можно скормить ТЗ построителю кроме источника данных? В качестве параметра к запросу он ТЗ не воспринимает...
19 Тенепопятам
 
01.04.21
16:25
Или может уже на СКД сделать...
20 Kondarat
 
01.04.21
16:44
(18) Может и не нравится... Посмотри как она заполняется и типы колонки "Контрагент"
21 Kassern
 
01.04.21
16:48
(0) в ТЗ, какая длина строки указана для составного типа?
22 Kassern
 
01.04.21
16:49
(21) вообще когда работаешь с ТЗ и хочешь его запихнуть куда нить типа запроса, то все типы для колонок должны быть явно указаны, если хочешь сравнивать по строке, то нужно ее ограничить
23 Kondarat
 
01.04.21
17:02
(18) Попробуй так сделать. Что получиться?

    Пока ПостроительОтчета.Отбор.Количество() <> 0 Цикл
        
        ПостроительОтчета.Отбор.Удалить(0);
        
    КонецЦикла;    
    
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументыКИмпортуДляОтбора);
    
    ДоступныеПоля = ПостроительОтчета.ДоступныеПоля;
    Для Каждого Поле ИЗ ДоступныеПоля Цикл
        Если Поле.Отбор Тогда
            ПостроительОтчета.Отбор.Добавить(Поле.Имя);
        КонецЕсли;    
    КонецЦикла;    
    
    ФормаНастройкиЗаполнения = ЭтотОбъект.ПолучитьФорму("ФормаОтбора");
    РезультатЗакрытия = ФормаНастройкиЗаполнения.ОткрытьМодально();
    ДокументыКИмпорту  = ПостроительОтчета.Результат.Выгрузить();
24 Тенепопятам
 
01.04.21
17:58
Спасибо за помощь! Причина оказалась в том, что в модуле обработки эта ТЗ, которая изначально находится на форме, создается заново и при ее создании не устанавливается квалификатор строки.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.