Подобное http://www.forum.mista.ru/topic.php?id=685265&all=1 При попытке добавить отбор в ПостроительЗапроса : Ошибка при вызове метода контекста (Добавить)
ЭлемОтбораЗапроса = Запрос.Отбор.Добавить(ЭлементОтбора.ПутьКДанным);
по причине:
Недопустимое значение параметра (параметр номер '1')
////////////////////////////////
Столкнулся с такой же ошибкой, Оказалось, что несмотря на то что в "ПостроительЗапроса" можно Запихать ТаблицуЗначений с колонками без жесткой типизации (в отличии от МенеджерВиртуальныхТаблиц Запроса)
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Источник);
НО при использользовании отбора по НЕТИПИЗИРОВАННОЙ колонке - система будет выдовать Ошибку(((
=>
пока Решение только одно изначально в "Источник" жестко задавать тип колонки, например: ТЗ_Источник.Колонки.Добавить("Статус",Новый ОписаниеТипов ("ПеречислениеСсылка.СтатусыМаршрутныхЛистов"));
/////////////// Хотелось бы без предварительно ЖЕСТКОЙ типизации ИСТОЧНИК.. у кого какие идеи? ))) ///////////////////////////////
вообще использую ... модификацию типовой ОтобратьСтрокиПоКритериям(....
// Отбирает из переданной таблицы строки по заданным критериям.
//
// Параметры:
// Источник - ТаблицаЗначений, РезультатЗапроса, ОбластьЯчеекТабличногоДокумента. Таблица-источник.
// СтруктураКритериев - Структура. Названия отборов и значения, по которым нужно отобрать строки.
// СтруктураСложныхКритериев - Структура. Если свойство передано, то значение содержит вид сравнения.
//
// Возвращаемое значение:
// РезультатЗапроса - таблица с нужными строками.
///////////////////// ПРИМЕР ////////////////////////////////
//СтруктураКритериев=Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", СписокДляОтбораОрганизацияСтрока,
// СписокДляОтбораЕО, СписокДляОтбораСменаXY, СписокДляОтбораДатаВыпискиСтрока)
//
//СтруктураСложныхКритериев=Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке,
// ВидСравнения.ВСписке, ВидСравнения.ВСписке, ВидСравнения.ВСписке)
//
Функция ОтобратьСтрокиПоКритериям(Источник, СтруктураКритериев, СтруктураСложныхКритериев = Неопределено) Экспорт
Перем ВидСравненияСложный;
Если СтруктураСложныхКритериев = Неопределено Тогда
СтруктураСложныхКритериев = Новый Структура;
КонецЕсли;
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Источник);
///=> В случае ошибки с Отбором по полю без ОписанияТипа
Попытка
Для Каждого Критерий Из СтруктураКритериев Цикл
НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(Критерий.Ключ);
СтруктураСложныхКритериев.Свойство(Критерий.Ключ, ВидСравненияСложный);
Если ВидСравненияСложный = Неопределено Тогда
НовыйОтбор.Установить(Критерий.Значение);
Иначе
НовыйОтбор.Использование = Истина;
НовыйОтбор.ВидСравнения = ВидСравненияСложный;
НовыйОтбор.Значение = Критерий.Значение;
КонецЕсли;
КонецЦикла;
Исключение
СообщениеПользователю = новый СообщениеПользователю;
СообщениеПользователю.Текст=("<ОтобратьСтрокиПоКритериям(..), для отбора В самой <ТЗ_Источник> для ИмяПоля = "+Критерий.Ключ+", необходимо жестко указать <Новый ОписаниеТипов(..)>> "+ОписаниеОшибки());
СообщениеПользователю.Сообщить();
ВызватьИсключение "<ОтобратьСтрокиПоКритериям(..), для отбора В самой <ТЗ_Источник> для ИмяПоля = "+Критерий.Ключ+", необходимо жестко указать <Новый ОписаниеТипов(..)>> "+ОписаниеОшибки();
КонецПопытки;
///<= В случае ошибки с Отбором по полю без ОписанияТипа
Возврат ПостроительЗапроса.Результат;
КонецФункции // ОтобратьСтрокиПоКритериям()
идея одна: выкинуть хлам на построителе и написать тоже самое на СКД.. вообще зачем этот построитель 1С вовсе не выкинул не понятно, тянет хлам какой-то древний.. хотя построитель не развивался тысячу лет и уже почти официально заброшен
(3) AllexSoft,
сам об об СКД подумывал.. думаеш взлетит? ))
у меня даже где-то функция валялась для конвертации "ВидСравнения" от построителя в "ВидСравнения" от СКД.
(7) sanfoto, да ну) какие сложности то) делаешь свой общий макет с типом макет СКД, конструктором ваяешь туда твой источник-объект, внешнюю таблицу.. далее в твоем модуле получаешь этот макет, вот тебе готовая схема, ничего программно компановать не надо.. все очень просто на самом деле
(9) sanfoto, ну раз структура ТЗ разная и нельзя ее унифицировать то только программно компоновать, как вы правильно заметили в (7) sanfoto, только это уже сложнее)
вот я и написал что СКД не взлетит...для сложного отбора в ПРОИЗВОЛЬНОЙ "ТЗ" ))
-----------------------------------------
эх... до вечерка подожду и крою наверное тему... похоже никто не решал этот вопрос на практике(((
ПС:
Кстати ранее я работал со сложными отборами путем помещения ТЗ в МенеджерВиртуальныхТаблиц и выборка запросом... так вот другой метод через ПОСТРОИТЕЛЬЗАПРОСА значительно быстрей отрабатывает.
(14) AllexSoft,
чет мне кажется это сложноватый путь ПРОГРАММНО создавать запрос))
пример:
//Создание схемы запроса
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросВыбораИзИБ = СхемаЗапроса.ПакетЗапросов[0];
//Установка свойств запроса
ЗапросВыбораИзИБ.ТаблицаДляПомещения = "ТаблицаОбороты";
ЗапросВыбораИзИБ.ВыбиратьРазрешенные = Истина;
//Добавляем операторы выбора первого запроса пакета
ОператорВыбораЗакупок = ЗапросВыбораИзИБ.Операторы[0];
ИсточникНоменклатура = ОператорВыбораЗакупок.Источники.Добавить("Справочник.Номенклатура","Товары");
//Добавляем запрос выбора из регистра закупок
ИсточникЗакупки = ОператорВыбораЗакупок.Источники.Добавить("РегистрНакопления.Закупки.Обороты","Закупки");
ИсточникЗакупки.Источник.Параметры[0].Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ;
ИсточникЗакупки.Источник.Параметры[1].Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ;
ИсточникЗакупки.Источник.Параметры[2].Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ;
//Меняем тип соединения
ИсточникЗакупки.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
//Указываем выбираемые поля
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Товары.Ссылка");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Закупки.Период");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Закупки.СуммаОборот, 0)");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("0");
//Указываем спевдонимы для выбранных полей
ЗапросВыбораИзИБ.Колонки[0].Псевдоним = "Номенклатура";
ЗапросВыбораИзИБ.Колонки[1].Псевдоним = "Период";
ЗапросВыбораИзИБ.Колонки[2].Псевдоним = "СуммаЗакупок";
ЗапросВыбораИзИБ.Колонки[3].Псевдоним = "СуммаПродаж";
//Добавляем отбор
ОператорВыбораЗакупок.Отбор.Добавить("НЕ Товары.ЭтоГруппа");
///////////////////////
//Выбираем данные о продажах
ОператорВыбораПродаж = ЗапросВыбораИзИБ.Операторы.Добавить();
ИсточникНоменклатура = ОператорВыбораПродаж.Источники.Добавить("Справочник.Номенклатура","Товары");
ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("Товары.Ссылка");
//Добавляем источник РН и устанавливаем параметры
ИсточникПродажи =ОператорВыбораПродаж.Источники.Добавить("РегистрНакопления.Продажи.Обороты","Продажи");
ИсточникПродажи.Источник.Параметры[0].Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ;
ИсточникПродажи.Источник.Параметры[1].Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ;
ИсточникПродажи.Источник.Параметры[2].Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ;
ИсточникПродажи.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
//Указываем отбираемые поля и устанавливаем для числовых полей соответствие с полями первого запроса
ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("Продажи.Период");
ВыражениеЗакупки = ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("0");
ВыражениеПродажи = ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Продажи.СуммаОборот, 0)");
ЗапросВыбораИзИБ.Колонки[2].Поля.Установить(1,ВыражениеЗакупки);
ЗапросВыбораИзИБ.Колонки[3].Поля.Установить(1,ВыражениеПродажи);
//Добавляем отбор
ОператорВыбораПродаж.Отбор.Добавить("НЕ Товары.ЭтоГруппа");
//Индексируем данные
ЗапросВыбораИзИБ.Индекс.Добавить(ЗапросВыбораИзИБ.Колонки[0]);
ЗапросВыбораИзИБ.Индекс.Добавить(ЗапросВыбораИзИБ.Колонки[1]);
//Устанавливаем параметры выбора данных
ОператорВыбораПродаж.ВыбиратьРазличные = Истина;
ОператорВыбораПродаж.КоличествоПолучаемыхЗаписей = 100;
////////////////
//Второй пакет запроса
ЗапросВыбораИзВТ = СхемаЗапроса.ПакетЗапросов.Добавить();
ОператорВыбрать = ЗапросВыбораИзВТ.Операторы[0];
//Устанавливаем сформированную в прошлом запросе временную таблицу как источник
Источник = ОператорВыбрать.Источники.Добавить("ТаблицаОбороты","ТаблицаОбороты");
ОператорВыбрать.ВыбираемыеПоля.Добавить("ТаблицаОбороты.Номенклатура");
ОператорВыбрать.ВыбираемыеПоля.Добавить("ТаблицаОбороты.Период");
ОператорВыбрать.ВыбираемыеПоля.Добавить("СУММА(ТаблицаОбороты.СуммаЗакупок)");
ОператорВыбрать.ВыбираемыеПоля.Добавить("СУММА(ТаблицаОбороты.СуммаПродаж)");
//Условие отбора
ОператорВыбрать.Отбор.Добавить("СУММА(ТаблицаОбороты.СуммаЗакупок) > 0");
//Устанавливаем псевдонимы колонок
ЗапросВыбораИзВТ.Колонки[0].Псевдоним = "Номенклатура";
ЗапросВыбораИзВТ.Колонки[1].Псевдоним = "Период";
ЗапросВыбораИзВТ.Колонки[2].Псевдоним = "СуммаЗакупок";
ЗапросВыбораИзВТ.Колонки[3].Псевдоним = "СуммаПродаж";
//Порядок сортировки данных
ЗапросВыбораИзВТ.Порядок.Добавить(ЗапросВыбораИзВТ.Операторы[0].Источники[0].Источник.ДоступныеПоля[0].Поля[6]);
ЗапросВыбораИзВТ.Порядок.Добавить(ЗапросВыбораИзВТ.Колонки[1]);
//Итоги запроса
ИтогНоменклатура = ЗапросВыбораИзВТ.КонтрольныеТочкиИтогов.Добавить(ЗапросВыбораИзВТ.Колонки[0]);
ИтогНоменклатура.ТипКонтрольнойТочки = ТипКонтрольнойТочкиСхемыЗапроса.ТолькоИерархия;
ЗапросВыбораИзВТ.ОбщиеИтоги =Истина;
ЗапросВыбораИзВТ.ВыраженияИтогов.Добавить(ЗапросВыбораИзВТ.Колонки[2]);
ЗапросВыбораИзВТ.ВыраженияИтогов.Добавить(ЗапросВыбораИзВТ.Колонки[3]);
////////////////
//Последний запрос пакета - удаление временной таблицы
ЗапросУничтоженияВТ = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросУничтоженияТаблицыСхемыЗапроса"));
ЗапросУничтоженияВТ.ИмяТаблицы = "ТаблицаОбороты";
Показать
Явно видно, что программное создание гораздо сложнее, чем текстовое.
Возникает вопрос, в чем смылс морочиться с программным создание вместо удобного конструирования.
Если этот запрос больше не изменится, то смысла нет никакого.
Плюшки появляются только в случае, если нам необходимо этот запрос модифицировать дальше в зависимости от настроек.
а вот исходный текстовый созданный Конструктором
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Товары.Ссылка КАК Номенклатура,
Закупки.Период КАК Период,
ЕСТЬNULL(Закупки.СуммаОборот, 0) КАК СуммаЗакупок,
0 КАК СуммаПродаж
ПОМЕСТИТЬ ТаблицаОбороты
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты(&Начало, &Окончание, Месяц) КАК Закупки
ПО Закупки.Номенклатура = Товары.Ссылка
ГДЕ
НЕ Товары.ЭтоГруппа
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100
Товары.Ссылка,
Продажи.Период,
0,
ЕСТЬNULL(Продажи.СуммаОборот, 0)
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&Начало, &Окончание, Месяц) КАК Продажи
ПО Продажи.Номенклатура = Товары.Ссылка
ГДЕ
НЕ Товары.ЭтоГруппа
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
Период
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТаблицаОбороты.Номенклатура КАК Номенклатура,
ТаблицаОбороты.Период КАК Период,
СУММА(ТаблицаОбороты.СуммаЗакупок) КАК СуммаЗакупок,
СУММА(ТаблицаОбороты.СуммаПродаж) КАК СуммаПродаж
ИЗ
ТаблицаОбороты КАК ТаблицаОбороты
СГРУППИРОВАТЬ ПО
ТаблицаОбороты.Номенклатура,
ТаблицаОбороты.Период
ИМЕЮЩИЕ
СУММА(ТаблицаОбороты.СуммаЗакупок) > 0
УПОРЯДОЧИТЬ ПО
ТаблицаОбороты.Номенклатура.Наименование,
Период
ИТОГИ
СУММА(СуммаЗакупок),
СУММА(СуммаПродаж)
ПО
ОБЩИЕ,
Номенклатура ТОЛЬКО ИЕРАРХИЯ
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ТаблицаОбороты
чет мне кажется это сложноватый путь ПРОГРАММНО создавать запрос))
ну это тебе решать сложно или нет) все же зависит от конкретных твоих задач которые знаешь только ты) я тебе просто говорю какие варианты есть ) ну а выбирать как делать тебе
(17) sanfoto, думается, не в ту сторону копаешь. Первоначальная задача в чем состоит?
при использользовании отбора по НЕТИПИЗИРОВАННОЙ колонке - система будет выдовать Ошибку
Возможно, это потому что нетипизированная колонка может содержать любые данные - например ссылку на другую таблицу значений, или саму таблицу значений, или хранилище значений..
(18) Allexe8.1,
это все так ЛЮБЫЕ ДАННЫЕ, но допустим отбор стоит: "Колонка1"=НЕОПРЕДЕЛЕНО .... что мешает его сделать ПЛАТФОРМЕ без ТИПИЗАЦИИ КОЛОНКИ?
(22) sanfoto, с чего ты взял ?) это разные пространства имен и в них разные типы
ПС: http://v8.1c.ru/8.1/data/enterprise/current-config - в этом например описываются объекты текущей конфигурации.. но мы же говорим о типах, а они есть платформенные) к твоим метаданным никак не относящиеся, они вот в других пространствах имен..
(24) sanfoto, вместо этого мог бы просто добавить пространство имен
http://www.w3.org/2001/XMLSchema там все примитивные типы содержатся, в том числе неопределено )
(26) sanfoto, а мне все таки нравится твой вариант из (20), я бы просто создал фабрику XDTO и экспортировал туда пакеты по пространствам имен типа такого:
фабрика = Новый ФабрикаXDTO;
фабрика.ЭкспортСхемыXML("http://v8.1c.ru/8.1/data/core");
в переменной фабрика появилась бы коллекция пакетов, а там в КорневыеСвойства и типы которые включены в пакет) таким образом простым циклом получаем массив наименований свойств в пакетах.. потом еще 1 небольшой цикл чтобы сформировать текст записи XML по аналогии с
тут ты добавляешь только тип AnyRef (ЛюбаяСсылка по 1С-ному) из пакета http://v8.1c.ru/8.1/data/enterprise/current-config , тоже самое просто циклом сделать для всех пакетов из "фабрика" и вуаля! описание всех типов готово и универсально!