Vladal
25.06.15
✎
13:57
Есть построитель, в который помещаю таблицу значений для манипуляций с ней.
В отладчике вижу такие поля:
|ПОстроительЗапроса.ДоступныеПоля
|_2
|_6
|_7
|ВерхнийПредел
|Диапазон
|НижнийПредел
Добавляю отбор:
НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(«ВерхнийПредел»);
Вываливается ошибка: Недопустимое значение параметра (параметр номер ‘1’)
Но когда добавляю отбор по другой колонке, никаких ошибок не возникает:
НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(«Диапазон»);
Также ошибка происходит и если беру данные из отладчика:
ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.НижнийПредел.Имя); — ошибка
ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.Диапазон.Имя); — работает нормально.
Из-за чего такое может быть? Ладно бы я допустил ошибку в написании поля, но когда из отладчика явно достаю поле и добавляю в отбор — одно работает, другое нет.
Зеленый пень
25.06.15
✎
13:59
Давно построитель научился с таблицей значений работать?
Как ты её помещаешь? И описаны ли эти поля в блоке {ГДЕ…} ?
Franchiser
25.06.15
✎
14:01
Построитель Запроса или Построитель Отчета?
Тип поля какой?
Franchiser
25.06.15
✎
14:02
попробуй типизировать поля тз
chelentano
25.06.15
✎
14:02
(1) Давно. Через источник данных
Vladal
25.06.15
✎
14:03
(1) (2) (3) (4)
ПостроительЗапроса = Новый ПостроительЗапроса;
ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Источник);
Источник — это и есть моя таблица значений
Vladal
25.06.15
✎
14:04
Не все ДоступныеПоля одинаково вкусны — некоторые Построителю не нравятся. А именно «НижнийПредел» и «ВерхнийПредел». Другие поля он успешно глотает, а эти два не хочет добавлять.
Franchiser
25.06.15
✎
14:06
что в этих полях, как ты описываешь структуру ТЗ?
Vladal
25.06.15
✎
14:06
(1) (2) (3) (4) — всё делаю используя типовую процедуру ОбщегоНазначения.ОтобратьСтрокиПоКритериям, в неё и передаю параметрами нужные мне критерии отбора.
chelentano
25.06.15
✎
14:06
Посмотри в отладчике перед установкой отбора, чему равно:
ПостроительЗапроса.ДоступныеПоля[«ВерхнийПредел»].Отбор
Franchiser
25.06.15
✎
14:07
обозвать поля по другому не вариант?
Vladal
25.06.15
✎
14:09
(3) (7) да. не типизировал. Но когда типизировал ничего не изменилось.
(9) пишет Ложь
(10) — Я им и унитаз приносил, и плитку из туалета показывал — ну нет у них туалетной бумаги, нет.
chelentano
25.06.15
✎
14:11
(11) попробуй выставить в истина
Vladal
25.06.15
✎
14:15
Я нашел ошибку. Поле не было типизировано.
Я сохранял таблицу значений, и при открытии обработки восстанавливал. А когда модифицировал колонки таблицы, то срабатывало условие
Если КолонкиМатрицы.Найти(«НижнийПредел») = Неопределено Тогда
КолонкиМатрицы.Добавить(«НижнийПредел», ОбщегоНазначения.ПолучитьОписаниеТиповЧисла(19),, 20);
КонецЕсли;
Естестенно, после того, как добавил описание типа колонки, он не назначался. Поэтому в (11) тоже ничего не получилось.
Ошибка была в том, что колонка была не типизирована. Спасибою. Получилось.
chelentano
25.06.15
✎
14:16
(13) так это тебе ещё в (3) написали
Vladal
25.06.15
✎
14:18
(14) Так я же сразу и дописал типизацию из (13). Вот только таблица восстанавливалась старая, с нетипизированными колонками.
Спасибо!
Зеленый пень
25.06.15
✎
16:21
(5) тьфу блин… Я и забыл, что так примитивно можно.
Интереснее так:
Создается построитель с текстом запроса, где первый запрос — «заглушка», таблица с нужными типами и словом ПОМЕСТИТЬ.
После игры с группировками отборами делаем ПолучитьЗапрос() и в тексте запроса подменяем заглушку на выбор из &ТЗ, которая передается запросу.
В результате можно крутить поля ТЗ через точку», и тестом запроса играться как угодно.
Franchiser
25.06.15
✎
20:40
(16) в построитель запроса вроде как нельзя использовать ВТ
Зеленый пень
25.06.15
✎
22:20
(17) ВТ еще как можно. Нельзя напрямую передавать ТЗ как параметр запроса, поэтому приходится изгаляться через .ПолучитьЗапрос(), но это не так сложно.
Есть построитель, в который помещаю таблицу значений для манипуляций с ней. В отладчике вижу такие поля: Добавляю отбор: Вываливается ошибка: Недопустимое значение параметра (параметр номер ‘1’) Но когда добавляю отбор по другой колонке, никаких ошибок не возникает: Также ошибка происходит и если беру данные из отладчика: ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.НижнийПредел.Имя); — ошибка ПостроительЗапроса.Отбор.Добавить(ПостроительЗапроса.ДоступныеПоля.Диапазон.Имя); — работает нормально. Из-за чего такое может быть? Ладно бы я допустил ошибку в написании поля, но когда из отладчика явно достаю поле и добавляю в отбор — одно работает, другое нет.
Давно построитель научился с таблицей значений работать? Как ты её помещаешь? И описаны ли эти поля в блоке {ГДЕ…} ?
Построитель Запроса или Построитель Отчета? Тип поля какой?
попробуй типизировать поля тз
Давно. Через источник данных
Источник — это и есть моя таблица значений
Не все ДоступныеПоля одинаково вкусны — некоторые Построителю не нравятся. А именно «НижнийПредел» и «ВерхнийПредел». Другие поля он успешно глотает, а эти два не хочет добавлять.
что в этих полях, как ты описываешь структуру ТЗ?
— всё делаю используя типовую процедуру ОбщегоНазначения.ОтобратьСтрокиПоКритериям, в неё и передаю параметрами нужные мне критерии отбора.
Посмотри в отладчике перед установкой отбора, чему равно: ПостроительЗапроса.ДоступныеПоля[«ВерхнийПредел»].Отбор
обозвать поля по другому не вариант?
да. не типизировал. Но когда типизировал ничего не изменилось. — Я им и унитаз приносил, и плитку из туалета показывал — ну нет у них туалетной бумаги, нет.
попробуй выставить в истина
Я нашел ошибку. Поле не было типизировано. Я сохранял таблицу значений, и при открытии обработки восстанавливал. А когда модифицировал колонки таблицы, то срабатывало условие Естестенно, после того, как добавил описание типа колонки, он не назначался. Поэтому в тоже ничего не получилось. Ошибка была в том, что колонка была не типизирована. Спасибою. Получилось.
так это тебе ещё в написали
Так я же сразу и дописал типизацию из . Вот только таблица восстанавливалась старая, с нетипизированными колонками. Спасибо!
тьфу блин… Я и забыл, что так примитивно можно. Интереснее так: Создается построитель с текстом запроса, где первый запрос — «заглушка», таблица с нужными типами и словом ПОМЕСТИТЬ. После игры с группировками отборами делаем ПолучитьЗапрос и в тексте запроса подменяем заглушку на выбор из &ТЗ, которая передается запросу. В результате можно крутить поля ТЗ через точку», и тестом запроса играться как угодно.
в построитель запроса вроде как нельзя использовать ВТ
ВТ еще как можно. Нельзя напрямую передавать ТЗ как параметр запроса, поэтому приходится изгаляться через .ПолучитьЗапрос, но это не так сложно.
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
Bell |
|
||
---|---|---|---|
Здравствуйте
Имяю запрос Запрос правильно отрабатывает Требуется поместить результат запроса в ПОСТРАИТЕЛЬЗАПРОСА для дальнеших отбора, если понадобиться. Когда помещаю выдает ошибку по причине: Сразу не делаю через построитель запроса т.к. имею составные отборы я их сделал на форме и через запрос отбираю сразу Код 1C v 8.х
Изменено 20.03.13 15:34:32 |
Yandex |
|
||
---|---|---|---|
E_Migachev |
|
||
---|---|---|---|
(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.
Загрузка…