Здравствуйте, Есть таблица с ПВХ в ней колонка "ТипЗначения" с типом ОписаниеТипов, необходимо эту таблицу поместить во временную и произвести некоторые манипуляции. Но при помещении: ошибка. "Тип не может быть выбран в запросе". Колонки все явно типизированы, как я понял проблема все именно в типе "ОписаниеТипов" система его не понимает, как можно обойти такую ошибку?
ВЫБРАТЬ
ВидыСубконтоХозрасчетные.Ссылка,
ВидыСубконтоХозрасчетные.ТипЗначения
ПОМЕСТИТЬ Вт
ИЗ
ПланВидовХарактеристик.ВидыСубконтоХозрасчетные КАК ВидыСубконтоХозрасчетные
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Вт.Ссылка,
Вт.ТипЗначения
ИЗ
Вт КАК Вт
ТЗ = Новый ТаблицаЗначений;
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ОписаниеТипов"));
ТЗ.Колонки.Добавить("Колонка1", Новый ОписаниеТипов(МассивТипов));
ТЗ.Колонки.Добавить("Колонка2", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(10)));
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ *
|Поместить ВТТЗ
| ИЗ &ТЗ КАК ТЗ;
|Выбрать * ИЗ ВТТЗ
|";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
НоваяТЗ = Запрос.Выполнить().Выгрузить();
(6) Bazin, и так можно, по-моему твой и мой код равноценны, просто мой сделан через массив.
(7) vovan_victory, опишу задачу, мне нужно перенести ПВХ из одной базы в другую полностью. Использую выгрузку xml. При загрузке получается таблица с реквизитами ПВХ, я эти реквизиты помещаю в запрос, и там шаманю с помощью соединений, чтобы найти есть такой объект или нет.
(8) vovan_victory, по-твоему колонка не может иметь составной тип?
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
МассивТипов.Добавить(Тип("Строка"));
МассивТипов.Добавить(Тип("СправочникСсылка.Валюты"));
Прекрасно работает
(9) Serginio, а это вообще не к месту, так как я в запросе не сравниваю типы, и в запросе нельзя "Выразить как ОписаниеТипов", + ошибка срабатывает до возможности приведения типов в запросе.
(10) А как ты представляешь себе хранение такого типа в Базе?
В базе для составного типа есть поле для конкретизации поля. Тип может быть только один.
В ОписанииТипа хранится множество типов
(23) Serginio, а как мы представляем хранения строки, ведь она может содержать множество букв, так и здесь это какой-то абстрактный объект, который содержит в себе различные описания типов.
(34) Serginio, спасибо, но я не понимаю ход ваших мыслей, причем здесь строки. Я привел просто пример, что даже строку нужно представлять как объектную сущность, и что любые данные могут храниться в базе. Ну вот хоть убейте почему тип("описаниеТипов") мутабельный. Вот объект или списокЗначений - мутабельные, но ОписаниеТипов, хм.
(37) Serginio, в чем проблема? ТаблицаЗначений и СписокЗначений могут быть в запросе. Мутабельным является элементСписказначений и СтрокаТаблицыЗначений.
(38) vovan_victory, ну тогда парадокс реквизит базы имеет такой тип, но он является мутабельным.
(39) vovan_victory, теперь понял, спасибо.
З = Новый ТаблицаЗначений;
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ОписаниеТипов"));
ТЗ.Колонки.Добавить("Колонка1", Новый ОписаниеТипов(МассивТипов));
ТЗ.Колонки.Добавить("Колонка2", Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(10)));
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ *
|Поместить ВТТЗ
| ИЗ &ТЗ КАК ТЗ;
|Выбрать * ИЗ ВТТЗ
|";
Запрос.УстановитьПараметр("ТЗ", ТЗ);
НоваяТЗ = Запрос.Выполнить().Выгрузить();
Показать
выкинуть
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("ОписаниеТипов"));
ТЗ.Колонки.Добавить("Колонка1", Новый ОписаниеТипов(МассивТипов));
(83) Serginio, а это реальная задача или так - эксперимент?
Это к стати получилось из-за того, что на выходе, в ТЗ у колонки ТипЗначения значение = ОписаниеТипов примерно то же самое , что и
МассивТипов.Добавить(Тип("ОписаниеТипов"));
ТЗ.Колонки.Добавить("Колонка1", Новый ОписаниеТипов(МассивТипов));
(7) vovan_victory, небольшое уточнение. В первом случае мы работаем с типом "ОписаниеТипов", а во втором с конструктором типов, это разные вещи. В пвх такой тип реквизиты позволяет динамически создавать типы для объектов прямо в базе без конфигуратора.
Новый ОписаниеТипов(МассивТипов) на выходе получается мутабельный(изменчивый/сложный) тип. Это все равно, что вообще не определить тип колонки. Нужно явным образом определить тип колонки.
(12) vovan_victory, подожди, но реквизит то в ПВХ имеет такой тип. И прекрасно с ним можно работать в запросе, разница лишь в том, что я его помещаю через временную таблицу.
В первом случае мы работаем с типом "ОписаниеТипов", а во втором с конструктором типов,
Какой первый, а какой второй? Вы создаете таблицу значений как источник данных для запроса. Именно по этому и типизируете колонки,а значит рассматривать создание ТЗ и обработку её запросом нельзя.
В случае Новый ОписаниеТипов("Строка") получаем описание типа строка, а в случае Новый ОписаниеТипов() описание какого типа получаете?
Любого , т.е неопределенного, т.е мутабильного, а это все равно, что вообще ни какого типа. Вот что я хотел сказать
(21) vovan_victory, хм, все равно не понятно, тогда какую объектную структуру имеет типзначения в пвх. Там же явно указывается, что тип.Типы() и в массиве содержится именно "ОписаниеТипов" - я этого не могу понять.
(27) vovan_victory, скорее всего мы друг друга не понимаем. Я уж точно не догоняю. Согласно синтакс помощнику, что создать колонку необходимо указать ей имя, и присвоить тип с помощью конструктора ОПисаниеТипов, так как конструктор и тип - разные вещи, таким образом чтобы присвоить колонке тип("ОписаниеТипов" я передаю этот тип в конструктор.
Новый ОписаниеТипов("ОписаниеТипов", , КС);
И такой код работает и я получаю тот результат, который я хочу. Этой колонке я могу присваивать реквизит "типзначения" и он будет присваиваться, так как типы совпадает. Теперь эти данные я хочу поместить в запрос, и здесь у меня затупок.
МассивТипов = Новый Массив;
Для Каждого Стр Из тип.Типы() Цикл
МассивТипов.Добавить(Стр);
КонецЦикла;
ТЗ.Колонки.Добавить("Колонка1", Новый ОписаниеТипов(МассивТипов));
на выходе должна быть колонка с составным(но конкретно определенным составом) типом
(29) vovan_victory, этот вариант подойдет для реквизитов как раз с составными типами, но не для ТипЗначения. Кстати я даже не использую конструктор Описаниетипов, я делаю так
Ну вот хоть убейте почему тип("описаниеТипов") мутабельный
Да по тому, что выходе что получается? Нужно получить описание какого то объекта/ов метаданных, а получается Новый ОписаниеТипов = все что хочешь,а не что то конкретное, а это значит изменяемый.
Тз =Новый ТаблицаЗначений;
ПВх = Метаданные.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Тип;
МассивТипов = Новый Массив;
Для Каждого Стр Из ПВх.Типы() Цикл
МассивТипов.Добавить(Стр);
КонецЦикла;
ТЗ.Колонки.Добавить("Колонка1", Новый ОписаниеТипов(МассивТипов));
Запрос = Новый Запрос("Выбрать * Поместить ТЗ Из &Парам КАК Парам ; Выбрать * Из ТЗ КАК ТЗ");
Запрос.УстановитьПараметр("Парам",ТЗ);
Результат = Запрос.Выполнить().Выгрузить();
МассивТипов = Новый Массив;
//
Для Каждого Стр Из ПВх.Типы() Цикл
МассивТипов.Добавить(Стр);//Стр = Тип("какая то ссчлка")
КонецЦикла;
Новый ОписаниеТипов(МассивТипов) // По данным массива с ссылками, делаем описание типов
Показать
Не много модернизированный пример из СП:
// расширим описание ДопустимыеТипы новыми типами
ДопустимыеТипы= Новый Массив;
ДопустимыеТипы.Добавить(Тип("СправочникСсылка.Методы"));
ДопустимыеТипы.Добавить(Тип("Число"));
ДопустимыеТипы = Новый ОписаниеТипов(ДопустимыеТипы);
(58) vovan_victory, немного абстрагируемся. Следуя твоему примеру Допустимые содержит Описание типов для Числа И СправочникСсылка.Методы. Значит колонка с созданным таким описанием может принимать значения Либо ЧИсло, либо СправочникСсылка.Методы. Однако на не это нужно. Нам нужно, чтобы эта колонка не принимала такие типы, а являлась описанием этих типов, так как в следующую строчку мы можем Поместить другое Описание, например ОписаниеТипоы("строка"), а ниже еще какое-нибудь.
Следовательно тип колонки, которая должна содержать это не должен быть привязан к определенному типу.
(59) karpik666, я не пойму, Вы пытаетесь что то понять или меня в чем то убедить? Я выложил Вам вполне рабочий пример, при чем на основе Вашего же.
Запустите его во внешней обработке и посмотрите отладчиком какой тип колонки будет у таблице значений. Далее , выполните запрос и убедитесь, что ошибки нет.
(65) karpik666, а я Вам на скрине показал от куда берутся допустимые типы которые могут использовать стандартные реквизиты. И если какой то тип не выбран там, где показано на скрине, так от куда получаете Вы их вообще не будет.
А для того, чтобы понять, что же все таки не понимает запрос, сделайте реквизит во внешней обработке с типом описание типов, выведите его на форму и нажмите кнопку выбора. Что получиться в итоге? В итоге откроется диалог выбора типа. А теперь представьте, как это должен делать запрос?
(67) vovan_victory, Ладно, спасибо. Я понял вашу позицию, по вашим объяснениям Значения колонки "ТипЗначения" будут такие:
1. "Какая-то строка"
2. 15
3. СправочникССылка
4. ДокументСсылка.
А то чего я хочу добиться:
1. Новый ОписаниеТипов("строка")
2. Новый ОписаниеТипов("Число")
3. Новый ОписаниеТипов("СправочникССылка")
4. Новый ОписаниеТипов("ДокументСсылка")
и это именно значения.
(69) vovan_victory, Ведь когда мы создаем новый элемент ПВХ мы указываем какие типы он принимает, вот эти типы и хранятся в этом реквизите конкретно для одного элемента пвх.
(72) vovan_victory, Пример:
Есть элемент ПВХ - "цвет" - он имеет характеристики "черный", "Белый", "Красный". - эти характеристики являются элементами справочники "дополнительныеХарактеристики", чтобы система понимала, что для ПВХ "цвет" можно создавать только элементы справочника "ДополнительныеХарактеристики" в реквизите ТипЗначения хранится ОписаниеТипов("ДополнительныеХарактеристики"). Есть еще пвх "Ширина" - его характеристика "Число", аналогично первому случаю типзначения = ОписаниеТипов("Число").
Теперь разместить эти пвх в одну таблицу
Наименование типЗначения
цвет ОписаниеТипов("ДополнительныеХарактеристики")
Ширина ОписаниеТипов("Число")
Вопрос: какой тип Имеет Колонка "ТипЗначения"?
Запрос=новый Запрос;
Запрос.Текст="ВЫБРАТЬ ПЕРВЫЕ 10
|ВзаиморасчетыСДепонентамиОрганизаций.Регистратор,
|ПРЕДСТАВЛЕНИЕ(ВзаиморасчетыСДепонентамиОрганизаций.Регистратор),
|ТИПЗНАЧЕНИЯ(ВзаиморасчетыСДепонентамиОрганизаций.Регистратор) КАК Поле1,
|ТИПЗНАЧЕНИЯ(ТИПЗНАЧЕНИЯ(ВзаиморасчетыСДепонентамиОрганизаций.Регистратор)) КАК Поле2
|ИЗ
|РегистрНакопления.ПартииТоваровНаСкладах КАК ВзаиморасчетыСДепонентамиОрганизаций";
Тз=Запрос.Выполнить().Выгрузить();
Показать
Выдает тип колонки как составной значения Null и Тип и ТипЗначения ОписаниеТипов
(43) Serginio, при выгрузке таблицы из запроса, она всегда имеет тип NULL наряду с другим типами.
Мне кажется эта строчка тоже должна NULL выдавать или ошибку вообще
|ТИПЗНАЧЕНИЯ(ТИПЗНАЧЕНИЯ(ВзаиморасчетыСДепонентамиОрганизаций.Регистратор)) КАК Поле2
Если рассуждать логически. Запросы нужны для получения выборок из хранимых данных 1С, и нельзя создать поле данных с типом "ОписаниеТипов"
(хотя можно создать реквизит отчета с этим типом). Поэтому это тип не может быть выбран в запросе.
(56) karpik666, я вам на скрине показал разницу между тем, что у Вас есть и как должно быть. Я еще раз попытаюсь объяснить: значение ОписаниеТипов - это не описание объекта метаданных - это конструкция для создания этого описания.
(60) vovan_victory, я вам в (56) показал, как у меня есть. Этот скрин отличается от вашего. Плюс в (52) я показал, как выглядит выгрузка планов видов характеристик - она совпадает с моим типом. То что вы предлагаете отличается от моего, и в (59) я объясняю, что должно быть не так.
(75) vovan_victory, неправильно, так как есть еще тип Число, а добавь мы в эту таблицу еще какой-нибудь ПВХ, имеющий тип "Строка". Поэтому, как я считаю должен быть тип "ОписаниеТипов", который содержит в каждой своей строке Конструктор ОписанияТипов.
я же не говорил, что моя таблица неверная и что она не может содержать конструкторы, она их содержит и все прекрасно работает. У меня проблема возникла имеенно с запросом. Спасибо за помощь, благодаря вам я решил хранить описаниетипов в строке с помощью ЗначениеВСтрокуВнутр