Построительзапроса отбор добавить ошибка

[Решено] Ошибка при добавлении поля отбора построителя ☑ 0

Vladal

25.06.15

13:57

Есть построитель, в который помещаю таблицу значений для манипуляций с ней.

В отладчике вижу такие поля:

|ПОстроительЗапроса.ДоступныеПоля

|_2

|_6

|_7

|ВерхнийПредел

|Диапазон

|НижнийПредел

Добавляю отбор:

НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(«ВерхнийПредел»);

Вываливается ошибка: Недопустимое значение параметра (параметр номер ‘1’)

Но когда добавляю отбор по другой колонке, никаких ошибок не возникает:

НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(«Диапазон»);

Также ошибка происходит и если беру данные из отладчика:

ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.НижнийПредел.Имя); — ошибка

ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.Диапазон.Имя); — работает нормально.

Из-за чего такое может быть? Ладно бы я допустил ошибку в написании поля, но когда из отладчика явно достаю поле и добавляю в отбор — одно работает, другое нет.

1

Зеленый пень

25.06.15

13:59

Давно построитель научился с таблицей значений работать?

Как ты её помещаешь? И описаны ли эти поля в блоке {ГДЕ…} ?

2

Franchiser

25.06.15

14:01

Построитель Запроса или Построитель Отчета?

Тип поля какой?

3

Franchiser

25.06.15

14:02

попробуй типизировать поля тз

4

chelentano

25.06.15

14:02

(1) Давно. Через источник данных

5

Vladal

25.06.15

14:03

(1) (2) (3) (4)

ПостроительЗапроса = Новый ПостроительЗапроса;

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

Источник — это и есть моя таблица значений

6

Vladal

25.06.15

14:04

Не все ДоступныеПоля одинаково вкусны — некоторые Построителю не нравятся. А именно «НижнийПредел» и «ВерхнийПредел». Другие поля он успешно глотает, а эти два не хочет добавлять.

7

Franchiser

25.06.15

14:06

что в этих полях, как ты описываешь структуру ТЗ?

8

Vladal

25.06.15

14:06

(1) (2) (3) (4) — всё делаю используя типовую процедуру ОбщегоНазначения.ОтобратьСтрокиПоКритериям, в неё и передаю параметрами нужные мне критерии отбора.

9

chelentano

25.06.15

14:06

Посмотри в отладчике перед установкой отбора, чему равно:

ПостроительЗапроса.ДоступныеПоля[«ВерхнийПредел»].Отбор

10

Franchiser

25.06.15

14:07

обозвать поля по другому не вариант?

11

Vladal

25.06.15

14:09

(3) (7) да. не типизировал. Но когда типизировал ничего не изменилось.

(9) пишет Ложь

(10) — Я им и унитаз приносил, и плитку из туалета показывал — ну нет у них туалетной бумаги, нет.

12

chelentano

25.06.15

14:11

(11) попробуй выставить в истина

13

Vladal

25.06.15

14:15

Я нашел ошибку. Поле не было типизировано.

Я сохранял таблицу значений, и при открытии обработки восстанавливал. А когда модифицировал колонки таблицы, то срабатывало условие

Если КолонкиМатрицы.Найти(«НижнийПредел») = Неопределено Тогда

    КолонкиМатрицы.Добавить(«НижнийПредел», ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(19),, 20);

КонецЕсли;

Естестенно, после того, как добавил описание типа колонки, он не назначался. Поэтому в (11) тоже ничего не получилось.

Ошибка была в том, что колонка была не типизирована. Спасибою. Получилось.

14

chelentano

25.06.15

14:16

(13) так это тебе ещё в (3) написали

15

Vladal

25.06.15

14:18

(14) Так я же сразу и дописал типизацию из (13). Вот только таблица восстанавливалась старая, с нетипизированными колонками.

Спасибо!

16

Зеленый пень

25.06.15

16:21

(5) тьфу блин… :) Я и забыл, что так примитивно можно.

Интереснее так:

Создается построитель с текстом запроса, где первый запрос — «заглушка», таблица  с нужными типами и словом ПОМЕСТИТЬ.

После игры с группировками отборами делаем ПолучитьЗапрос() и в тексте запроса подменяем заглушку на выбор из &ТЗ, которая передается запросу.

В результате можно крутить поля ТЗ через точку», и тестом запроса играться как угодно.

17

Franchiser

25.06.15

20:40

(16) в построитель запроса вроде как нельзя использовать ВТ

18

Зеленый пень

25.06.15

22:20

(17) ВТ еще как можно. Нельзя напрямую передавать ТЗ как параметр запроса, поэтому приходится изгаляться через .ПолучитьЗапрос(), но это не так сложно.

Есть построитель, в который помещаю таблицу значений для манипуляций с ней. В отладчике вижу такие поля: Добавляю отбор: Вываливается ошибка: Недопустимое значение параметра (параметр номер ‘1’) Но когда добавляю отбор по другой колонке, никаких ошибок не возникает: Также ошибка происходит и если беру данные из отладчика: ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.НижнийПредел.Имя); — ошибка ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.Диапазон.Имя); — работает нормально. Из-за чего такое может быть? Ладно бы я допустил ошибку в написании поля, но когда из отладчика явно достаю поле и добавляю в отбор — одно работает, другое нет.

Давно построитель научился с таблицей значений работать? Как ты её помещаешь? И описаны ли эти поля в блоке {ГДЕ…} ?

Построитель Запроса или Построитель Отчета? Тип поля какой?

попробуй типизировать поля тз

Давно. Через источник данных

Источник — это и есть моя таблица значений

Не все ДоступныеПоля одинаково вкусны — некоторые Построителю не нравятся. А именно «НижнийПредел» и «ВерхнийПредел». Другие поля он успешно глотает, а эти два не хочет добавлять.

что в этих полях, как ты описываешь структуру ТЗ?

— всё делаю используя типовую процедуру ОбщегоНазначения.ОтобратьСтрокиПоКритериям, в неё и передаю параметрами нужные мне критерии отбора.

Посмотри в отладчике перед установкой отбора, чему равно: ПостроительЗапроса.ДоступныеПоля[«ВерхнийПредел»].Отбор

обозвать поля по другому не вариант?

да. не типизировал. Но когда типизировал ничего не изменилось. — Я им и унитаз приносил, и плитку из туалета показывал — ну нет у них туалетной бумаги, нет.

попробуй выставить в истина

Я нашел ошибку. Поле не было типизировано. Я сохранял таблицу значений, и при открытии обработки восстанавливал. А когда модифицировал колонки таблицы, то срабатывало условие Естестенно, после того, как добавил описание типа колонки, он не назначался. Поэтому в тоже ничего не получилось. Ошибка была в том, что колонка была не типизирована. Спасибою. Получилось.

так это тебе ещё в написали

Так я же сразу и дописал типизацию из . Вот только таблица восстанавливалась старая, с нетипизированными колонками. Спасибо!

тьфу блин… :) Я и забыл, что так примитивно можно. Интереснее так: Создается построитель с текстом запроса, где первый запрос — «заглушка», таблица  с нужными типами и словом ПОМЕСТИТЬ. После игры с группировками отборами делаем ПолучитьЗапрос и в тексте запроса подменяем заглушку на выбор из &ТЗ, которая передается запросу. В результате можно крутить поля ТЗ через точку», и тестом запроса играться как угодно.

в построитель запроса вроде как нельзя использовать ВТ

ВТ еще как можно. Нельзя напрямую передавать ТЗ как параметр запроса, поэтому приходится изгаляться через .ПолучитьЗапрос, но это не так сложно.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Bell
20.03.2013 15:33 Прочитано: 16954

Здравствуйте
Имяю запрос
Запрос правильно отрабатывает
Требуется поместить результат запроса в ПОСТРАИТЕЛЬЗАПРОСА для дальнеших отбора, если понадобиться.
Когда помещаю выдает ошибку

по причине:
{(1, 1)}: Ожидается выражение «ВЫБРАТЬ»

Сразу не делаю через построитель запроса т.к. имею составные отборы я их сделал на форме и через запрос отбираю сразу

Код 1C v 8.х

 Процедура МойЗапрос()

Здесь мой запрос

//-----
// Рузультат запроса
Результат = Запрос.Выполнить();

ПостроительЗапроса = Новый ПостроительЗапроса (????);// поместить запрос сюда
ПостроительЗапроса.Параметры.Вставить("ДатаНачало", НачалоДня(ДатаНачало));
ПостроительЗапроса.Параметры.Вставить("ДатаКонец", КонецДня(ДатаКонец));
Отбор = ПостроительЗапроса.Отбор;
Отбор.УстановитьДоступныеПоля( ПостроительЗапросаОтбор.ПолучитьДоступныеПоля());

Для каждого СтрокаОтбора из ПостроительЗапросаОтбор Цикл

ОТБ = Отбор.Добавить(СтрокаОтбора.Представление);
ОТБ.Использование = СтрокаОтбора.Использование;
ОТБ.ВидСравнения = СтрокаОтбора.ВидСравнения;
ОТБ.Значение = СтрокаОтбора.Значение;
ОТБ.ЗначениеС = СтрокаОтбора.ЗначениеС;
ОТБ.ЗначениеПО = СтрокаОтбора.ЗначениеПо;

КонецЦикла;
//ПостроительЗапроса.ЗаполнитьНастройки();
ПостроительЗапроса.Выполнить();
//ВыбранныеДокументы = ПостроительЗапроса.Результат.Выгрузить() ;

КонецПроцедуры


Изменено 20.03.13 15:34:32

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
20.03.2013 15:57 Ответ № 1

(0) Bell, зачем эти заморочки с построителем? Сделай на СКД и не мучайся )

Подсказка: Вы можете приложить к ответу файл или изображение щелкнув по значку или в редакторе.

Иногда возникают ситуации, когда нужно сделать отбор в таблице значений используя нечеткое условие, к примеру: больше, меньше, содержит и т.д. Можно, конечно же, использовать перебор в цикле и там уже делать проверку на нечеткие условия, можно использовать метод НайтиСтроки(), вот только отбор, передаваемые туда как параметр, всегда будут иметь вид сравнения — равно.
Что же делать, если нам нужно найти строки в ТЧ и при этом использовать нечеткое условие и не использовать цикл?
Все просто: можно воспользоваться построителем запроса.
Построитель запроса — это объект встроенного языка, с помощью которого мы можем получать необходимые данные, используя отборы.


Пример:
Есть таблица значений ПродукцияТЗ, которая содержит исходные данные. Нужно найти строки, где сумма больше нуля и равна нулю.


Построитель = Новый ПостроительЗапроса;

Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ПродукцияТЗ);// 1. отбор для выбора строк больших нуля
СтрокаОтбора = Построитель.Отбор.Добавить(«Сумма»);
СтрокаОтбора.ВидСравнения = ВидСравнения.Больше;
СтрокаОтбора.Значение = 0;
СтрокаОтбора.Использование = Истина;Построитель.Выполнить();
ОплаченныеЗапчастиТЗ = Построитель.Результат.Выгрузить();// 2. переопределяем отбор для выбора нулевых строк
СтрокаОтбора = Построитель.Отбор[«Сумма»];
СтрокаОтбора.ВидСравнения = ВидСравнения.Равно;Построитель.Выполнить();
БесплатныеЗапчасти = Построитель.Результат.Выгрузить();

Существует несколько способов сделать отбор в таблице значений.

Первый — он же самый простой и, на мой взгляд неправильный — это просто пройти по таблице значений в цикле и отобрать нужные строки.

Второй — использовать метод таблицы значений «НайтиСтроки». Методу передается структура в которой ключ — это название колонки, а значение — это нужное нам значение отбора. Этот метод неплох, но у него есть два серьезных недостатка. Во-первых, функция вернет массив строк таблицы значений (т.е. возможно потребуются дополнительные действия). А во-вторых, единственный допустимый вид сравнения — это равенство.

И, наконец, третий способ — использование объекта «ПостроительЗапроса».

Код выглядит примерно так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

&НаСервере

Процедура ОтборНаСервере()

Построитель = Новый ПостроительЗапроса;

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

тОтбор = Построитель.Отбор.Добавить(«Колонка1»);

тОтбор.ВидСравнения = ВидСравнения.БольшеИлиРавно;

тОтбор.Значение = 10;

тОтбор.Использование = Истина;

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

ТабРезультат = Построитель.Результат.Выгрузить();

тОтбор = Построитель.Отбор[«Колонка1»];

тОтбор.ВидСравнения = ВидСравнения.Равно;

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

ТабРезультат = Построитель.Результат.Выгрузить();

КонецПроцедуры

Как видно из кода, мы создаем построить запросов и загружаем в него таблицу значений, после этого добавляется отбор, запрос выполняется и удовлетворяющие условию отбора строки выгружаются в другую таблицу значений. После этого отбор меняется (его уже не нужно добавлять) и результат выгружается вновь.

Этот способ лишен недостатков, которыми обладают предыдущие способы.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка…

Понравилась статья? Поделить с друзьями:
  • Посудомоечная машина ariston ошибка a10
  • Постоянно работая над ошибками доводишь их до совершенства
  • Построение мо может сопровождаться типичными ошибками
  • Постоянно повторяющаяся ошибка
  • Постоянно пишет ошибка часов