Отбор в списке документов

1. starjevschik 04.05.12 11:20 Сейчас в теме
Есть форма списка документов, она заполняется документами по списку значений неким запросом с кучкой условий. По отобранному списку считается общая итоговая сумма. В списке могут быть установлены пользователем дополнительные отборы штатными средствами - стандартными кнопками "Отбор", "Отбор по значению в текущей колонке". Колонок много, отборы могут быть разными.
Вопрос: как получить итоговую сумму по всем документам, прошедшим все отборы?
По логике вещей надо как-то все отборы из списка на форме скопировать в запрос, но все варианты, которые мне удается придумать, не работают. Выкладываю простейший из них, просто чтобы было понятно, о чем речь. Запрос вызывается при обновлении списка. В попытке всегда (всегда!) вызывается исключение, т.е. так совсем нельзя :). Ошибочная строка
НовыйЭлемент = Построитель.Отбор.Добавить(Элемент.ПутьКДанным), ошибка "Неверный параметр №1"
Пробовал добавлять в выборку все поля, пробовал все поля указывать в разделе запроса "Построитель", результат одинаковый, наверное, нужно что-то принципиально другое.
Помогите идеями, плз.


	ТекстЗапроса = "ВЫБРАТЬ
	               |	СУММА(ЗаявкиНаРасходованиеСредствОбороты.СуммаВзаиморасчетовПриход) КАК Сумма,
	               |	ЗаявкиНаРасходованиеСредствОбороты.ЗаявкаНаРасходование.ВалютаДокумента КАК Валюта
	               |ИЗ
	               |	РегистрНакопления.ЗаявкиНаРасходованиеСредств.Обороты КАК ЗаявкиНаРасходованиеСредствОбороты
	               |ГДЕ
	               |	ЗаявкиНаРасходованиеСредствОбороты.ЗаявкаНаРасходование В(&СписокЗаявок)
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	ЗаявкиНаРасходованиеСредствОбороты.ЗаявкаНаРасходование.ВалютаДокумента
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Валюта";
	Построитель = Новый ПостроительЗапроса(ТекстЗапроса);
	Построитель.ЗаполнитьНастройки();
	Для Каждого Элемент Из ДокументСписок.Отбор Цикл
		Попытка
			НовыйЭлемент = Построитель.Отбор.Добавить(Элемент.ПутьКДанным);
			НовыйЭлемент.ВидСравнения = Элемент.ВидСравнения;
			ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, "Значение, ЗначениеПо, ЗначениеС, Использование");
		Исключение
			Сообщить(Элемент.ПутьКДанным);
		КонецПопытки;
	КонецЦикла;
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
7. shuhard 04.05.12 16:34 Сейчас в теме
(6)
Твой код, увы, не работает.

может стоит книжечки почитать, перед обращением на профессиональный форум ?


ПостроительЗапроса=Новый ПостроительЗапроса;
ПостроительЗапроса.Текст="ВЫБРАТЬ
| ЗаказПокупателя.Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|{ГДЕ
| ЗаказПокупателя.Организация.*,
| ЗаказПокупателя.Ссылка.*,
| ЗаказПокупателя.Номер,
| ЗаказПокупателя.Дата,
| ЗаказПокупателя.Проведен,
| ЗаказПокупателя.ВалютаДокумента.*,
| ЗаказПокупателя.ВидОперации.*,
| ЗаказПокупателя.Контрагент.*,
| ЗаказПокупателя.ДоговорКонтрагента.*}";

Для Каждого СтрокаОтбора из ЭлементыФормы.Список.Значение.Отбор Цикл
ДоступноеПоле=ПостроительЗапроса.ДоступныеПоля.Найти(СтрокаОтбора.Имя);
Если ДоступноеПоле<>Неопределено И ДоступноеПоле.Отбор=Истина Тогда
СтрокаОтбораПостроителя=ПостроительЗапроса.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
КонецЕсли;
КонецЦикла;
ПостроительЗапроса.Выполнить();
ТЗ=ПостроительЗапроса.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("Запрос с отбором");
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. shuhard 04.05.12 13:15 Сейчас в теме
(1)
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, "Значение, ЗначениеПо, ЗначениеС, Использование");


все много проще, вот пример как отбор по ТЧ документа засунуть в построитель запроса:

Построительчик=Новый ПостроительЗапроса;
Построительчик.ИсточникДанных=Новый ОписаниеИсточникаДанных(Товары); // табличная часть документа
// копирование отбора
Для Каждого СтрокаОтбора из ЭлементыФормы.Товары.ОтборСтрок Цикл // цикл по отбору табличной части
СтрокаОтбораПостроителя=Построительчик.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора); // копирование нужных реквизитов отбора одной строкой
КонецЦикла;
Построительчик.Выполнить();
ТЗ=Построительчик.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("ТЧ с отбором");
2. ilya.ilya 04.05.12 13:11 Сейчас в теме
как насчет выгрузить колонку с сылками из Элемента формы "таблица"? Насколько я знаю там хранятся именно отображенные данные.
4. starjevschik 04.05.12 14:24 Сейчас в теме
(2) можно и выгрузить, только как? Таблицы там нет, на форме табличное поле, тип значения = ДокументСписок.

(3) shuhard,
ЭлементыФормы.Товары.ОтборСтрок - нет такого. Это не табличная часть, а список документов, возможно, у них разные свойства.
5. shuhard 04.05.12 16:10 Сейчас в теме
(4)
а список документов, возможно, у них разные свойства.

с чего бы это ?
6. starjevschik 04.05.12 16:17 Сейчас в теме
(5) коллега, если ты можешь привести работающий код, я буду крайне признателен. Твой код, увы, не работает.
А, похоже, я не все важные сведения сказал. Интерфейс неуправляемый! Отбор строк - в управляемом...
7. shuhard 04.05.12 16:34 Сейчас в теме
(6)
Твой код, увы, не работает.

может стоит книжечки почитать, перед обращением на профессиональный форум ?


ПостроительЗапроса=Новый ПостроительЗапроса;
ПостроительЗапроса.Текст="ВЫБРАТЬ
| ЗаказПокупателя.Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|{ГДЕ
| ЗаказПокупателя.Организация.*,
| ЗаказПокупателя.Ссылка.*,
| ЗаказПокупателя.Номер,
| ЗаказПокупателя.Дата,
| ЗаказПокупателя.Проведен,
| ЗаказПокупателя.ВалютаДокумента.*,
| ЗаказПокупателя.ВидОперации.*,
| ЗаказПокупателя.Контрагент.*,
| ЗаказПокупателя.ДоговорКонтрагента.*}";

Для Каждого СтрокаОтбора из ЭлементыФормы.Список.Значение.Отбор Цикл
ДоступноеПоле=ПостроительЗапроса.ДоступныеПоля.Найти(СтрокаОтбора.Имя);
Если ДоступноеПоле<>Неопределено И ДоступноеПоле.Отбор=Истина Тогда
СтрокаОтбораПостроителя=ПостроительЗапроса.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
КонецЕсли;
КонецЦикла;
ПостроительЗапроса.Выполнить();
ТЗ=ПостроительЗапроса.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("Запрос с отбором");
8. starjevschik 04.05.12 18:38 Сейчас в теме
(7) спасибо! правда работает. Это потрясающе :)
Не находит только общие критерии отбора - ДокументыПоКонтрагенту, ДокументыПоДоговоруКонтрагента. Ну да фиг с ними.

А, еще нельзя писать
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);

потому что появляется ошибка при сравнении "В списке" - такое впечатление, что она сначала заполняет значение, а потом вид сравнения, и значение типа СписокЗначений вызывает ошибку, потому что по умолчанию вид сравнения "равно". Поэтому надо все же так:
НовыйЭлемент.ВидСравнения = Элемент.ВидСравнения;
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, "Значение, ЗначениеПо, ЗначениеС, Использование");

Большущее спасибо! Вопрос закрыт.
9. Miromaxv 05.05.12 18:48 Сейчас в теме
10. AntonH851 88 09.08.12 12:02 Сейчас в теме
А можно просто получить Итог по колонке
11. AntonH851 88 09.08.12 13:20 Сейчас в теме
Ой это я не про то подумал.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот