Есть форма списка документов, она заполняется документами по списку значений неким запросом с кучкой условий. По отобранному списку считается общая итоговая сумма. В списке могут быть установлены пользователем дополнительные отборы штатными средствами - стандартными кнопками "Отбор", "Отбор по значению в текущей колонке". Колонок много, отборы могут быть разными.
Вопрос: как получить итоговую сумму по всем документам, прошедшим все отборы?
По логике вещей надо как-то все отборы из списка на форме скопировать в запрос, но все варианты, которые мне удается придумать, не работают. Выкладываю простейший из них, просто чтобы было понятно, о чем речь. Запрос вызывается при обновлении списка. В попытке всегда (всегда!) вызывается исключение, т.е. так совсем нельзя :). Ошибочная строка
НовыйЭлемент = Построитель.Отбор.Добавить(Элемент.ПутьКДанным), ошибка "Неверный параметр №1"
Пробовал добавлять в выборку все поля, пробовал все поля указывать в разделе запроса "Построитель", результат одинаковый, наверное, нужно что-то принципиально другое.
Помогите идеями, плз.
Вопрос: как получить итоговую сумму по всем документам, прошедшим все отборы?
По логике вещей надо как-то все отборы из списка на форме скопировать в запрос, но все варианты, которые мне удается придумать, не работают. Выкладываю простейший из них, просто чтобы было понятно, о чем речь. Запрос вызывается при обновлении списка. В попытке всегда (всегда!) вызывается исключение, т.е. так совсем нельзя :). Ошибочная строка
НовыйЭлемент = Построитель.Отбор.Добавить(Элемент.ПутьКДанным), ошибка "Неверный параметр №1"
Пробовал добавлять в выборку все поля, пробовал все поля указывать в разделе запроса "Построитель", результат одинаковый, наверное, нужно что-то принципиально другое.
Помогите идеями, плз.
ТекстЗапроса = "ВЫБРАТЬ
| СУММА(ЗаявкиНаРасходованиеСредствОбороты.СуммаВзаиморасчетовПриход) КАК Сумма,
| ЗаявкиНаРасходованиеСредствОбороты.ЗаявкаНаРасходование.ВалютаДокумента КАК Валюта
|ИЗ
| РегистрНакопления.ЗаявкиНаРасходованиеСредств.Обороты КАК ЗаявкиНаРасходованиеСредствОбороты
|ГДЕ
| ЗаявкиНаРасходованиеСредствОбороты.ЗаявкаНаРасходование В(&СписокЗаявок)
|
|СГРУППИРОВАТЬ ПО
| ЗаявкиНаРасходованиеСредствОбороты.ЗаявкаНаРасходование.ВалютаДокумента
|
|УПОРЯДОЧИТЬ ПО
| Валюта";
Построитель = Новый ПостроительЗапроса(ТекстЗапроса);
Построитель.ЗаполнитьНастройки();
Для Каждого Элемент Из ДокументСписок.Отбор Цикл
Попытка
НовыйЭлемент = Построитель.Отбор.Добавить(Элемент.ПутьКДанным);
НовыйЭлемент.ВидСравнения = Элемент.ВидСравнения;
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, "Значение, ЗначениеПо, ЗначениеС, Использование");
Исключение
Сообщить(Элемент.ПутьКДанным);
КонецПопытки;
КонецЦикла;
ПоказатьПо теме из базы знаний
Найденные решения
(6)
может стоит книжечки почитать, перед обращением на профессиональный форум ?
ПостроительЗапроса=Новый ПостроительЗапроса;
ПостроительЗапроса.Текст="ВЫБРАТЬ
| ЗаказПокупателя.Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|{ГДЕ
| ЗаказПокупателя.Организация.*,
| ЗаказПокупателя.Ссылка.*,
| ЗаказПокупателя.Номер,
| ЗаказПокупателя.Дата,
| ЗаказПокупателя.Проведен,
| ЗаказПокупателя.ВалютаДокумента.*,
| ЗаказПокупателя.ВидОперации.*,
| ЗаказПокупателя.Контрагент.*,
| ЗаказПокупателя.ДоговорКонтрагента.*}";
Для Каждого СтрокаОтбора из ЭлементыФормы.Список.Значение.Отбор Цикл
ДоступноеПоле=ПостроительЗапроса.ДоступныеПоля.Найти(СтрокаОтбора.Имя);
Если ДоступноеПоле<>Неопределено И ДоступноеПоле.Отбор=Истина Тогда
СтрокаОтбораПостроителя=ПостроительЗапроса.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
КонецЕсли;
КонецЦикла;
ПостроительЗапроса.Выполнить();
ТЗ=ПостроительЗапроса.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("Запрос с отбором");
Твой код, увы, не работает.
может стоит книжечки почитать, перед обращением на профессиональный форум ?
ПостроительЗапроса=Новый ПостроительЗапроса;
ПостроительЗапроса.Текст="ВЫБРАТЬ
| ЗаказПокупателя.Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|{ГДЕ
| ЗаказПокупателя.Организация.*,
| ЗаказПокупателя.Ссылка.*,
| ЗаказПокупателя.Номер,
| ЗаказПокупателя.Дата,
| ЗаказПокупателя.Проведен,
| ЗаказПокупателя.ВалютаДокумента.*,
| ЗаказПокупателя.ВидОперации.*,
| ЗаказПокупателя.Контрагент.*,
| ЗаказПокупателя.ДоговорКонтрагента.*}";
Для Каждого СтрокаОтбора из ЭлементыФормы.Список.Значение.Отбор Цикл
ДоступноеПоле=ПостроительЗапроса.ДоступныеПоля.Найти(СтрокаОтбора.Имя);
Если ДоступноеПоле<>Неопределено И ДоступноеПоле.Отбор=Истина Тогда
СтрокаОтбораПостроителя=ПостроительЗапроса.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
КонецЕсли;
КонецЦикла;
ПостроительЗапроса.Выполнить();
ТЗ=ПостроительЗапроса.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("Запрос с отбором");
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
все много проще, вот пример как отбор по ТЧ документа засунуть в построитель запроса:
Построительчик=Новый ПостроительЗапроса;
Построительчик.ИсточникДанных=Новый ОписаниеИсточникаДанных(Товары); // табличная часть документа
// копирование отбора
Для Каждого СтрокаОтбора из ЭлементыФормы.Товары.ОтборСтрок Цикл // цикл по отбору табличной части
СтрокаОтбораПостроителя=Построительчик.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора); // копирование нужных реквизитов отбора одной строкой
КонецЦикла;
Построительчик.Выполнить();
ТЗ=Построительчик.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("ТЧ с отбором");
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, "Значение, ЗначениеПо, ЗначениеС, Использование");
все много проще, вот пример как отбор по ТЧ документа засунуть в построитель запроса:
Построительчик=Новый ПостроительЗапроса;
Построительчик.ИсточникДанных=Новый ОписаниеИсточникаДанных(Товары); // табличная часть документа
// копирование отбора
Для Каждого СтрокаОтбора из ЭлементыФормы.Товары.ОтборСтрок Цикл // цикл по отбору табличной части
СтрокаОтбораПостроителя=Построительчик.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора); // копирование нужных реквизитов отбора одной строкой
КонецЦикла;
Построительчик.Выполнить();
ТЗ=Построительчик.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("ТЧ с отбором");
(6)
может стоит книжечки почитать, перед обращением на профессиональный форум ?
ПостроительЗапроса=Новый ПостроительЗапроса;
ПостроительЗапроса.Текст="ВЫБРАТЬ
| ЗаказПокупателя.Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|{ГДЕ
| ЗаказПокупателя.Организация.*,
| ЗаказПокупателя.Ссылка.*,
| ЗаказПокупателя.Номер,
| ЗаказПокупателя.Дата,
| ЗаказПокупателя.Проведен,
| ЗаказПокупателя.ВалютаДокумента.*,
| ЗаказПокупателя.ВидОперации.*,
| ЗаказПокупателя.Контрагент.*,
| ЗаказПокупателя.ДоговорКонтрагента.*}";
Для Каждого СтрокаОтбора из ЭлементыФормы.Список.Значение.Отбор Цикл
ДоступноеПоле=ПостроительЗапроса.ДоступныеПоля.Найти(СтрокаОтбора.Имя);
Если ДоступноеПоле<>Неопределено И ДоступноеПоле.Отбор=Истина Тогда
СтрокаОтбораПостроителя=ПостроительЗапроса.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
КонецЕсли;
КонецЦикла;
ПостроительЗапроса.Выполнить();
ТЗ=ПостроительЗапроса.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("Запрос с отбором");
Твой код, увы, не работает.
может стоит книжечки почитать, перед обращением на профессиональный форум ?
ПостроительЗапроса=Новый ПостроительЗапроса;
ПостроительЗапроса.Текст="ВЫБРАТЬ
| ЗаказПокупателя.Ссылка
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|{ГДЕ
| ЗаказПокупателя.Организация.*,
| ЗаказПокупателя.Ссылка.*,
| ЗаказПокупателя.Номер,
| ЗаказПокупателя.Дата,
| ЗаказПокупателя.Проведен,
| ЗаказПокупателя.ВалютаДокумента.*,
| ЗаказПокупателя.ВидОперации.*,
| ЗаказПокупателя.Контрагент.*,
| ЗаказПокупателя.ДоговорКонтрагента.*}";
Для Каждого СтрокаОтбора из ЭлементыФормы.Список.Значение.Отбор Цикл
ДоступноеПоле=ПостроительЗапроса.ДоступныеПоля.Найти(СтрокаОтбора.Имя);
Если ДоступноеПоле<>Неопределено И ДоступноеПоле.Отбор=Истина Тогда
СтрокаОтбораПостроителя=ПостроительЗапроса.Отбор.Добавить(СтрокаОтбора.Имя);
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
КонецЕсли;
КонецЦикла;
ПостроительЗапроса.Выполнить();
ТЗ=ПостроительЗапроса.Результат.Выгрузить();
ТЗ.ВыбратьСтроку("Запрос с отбором");
(7) спасибо! правда работает. Это потрясающе :)
Не находит только общие критерии отбора - ДокументыПоКонтрагенту, ДокументыПоДоговоруКонтрагента. Ну да фиг с ними.
А, еще нельзя писать
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
потому что появляется ошибка при сравнении "В списке" - такое впечатление, что она сначала заполняет значение, а потом вид сравнения, и значение типа СписокЗначений вызывает ошибку, потому что по умолчанию вид сравнения "равно". Поэтому надо все же так:
НовыйЭлемент.ВидСравнения = Элемент.ВидСравнения;
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, "Значение, ЗначениеПо, ЗначениеС, Использование");
Большущее спасибо! Вопрос закрыт.
Не находит только общие критерии отбора - ДокументыПоКонтрагенту, ДокументыПоДоговоруКонтрагента. Ну да фиг с ними.
А, еще нельзя писать
ЗаполнитьЗначенияСвойств(СтрокаОтбораПостроителя, СтрокаОтбора);
потому что появляется ошибка при сравнении "В списке" - такое впечатление, что она сначала заполняет значение, а потом вид сравнения, и значение типа СписокЗначений вызывает ошибку, потому что по умолчанию вид сравнения "равно". Поэтому надо все же так:
НовыйЭлемент.ВидСравнения = Элемент.ВидСравнения;
ЗаполнитьЗначенияСвойств(НовыйЭлемент, Элемент, "Значение, ЗначениеПо, ЗначениеС, Использование");
Большущее спасибо! Вопрос закрыт.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот