Вывод табличного списка с ограничением по сумме

1. Chan1C 08.10.21 07:36 Сейчас в теме
Добрый день. Пытаюсь написать отчет для отображения списка должников. Заранее скажу, что в области программирования в 1С я ультра новичок. На данный момент реализовано:
- Отображение задолженностей по лицевым счетам на конкретную дату.
Что я безуспешно пытаюсь сделать:
- Вывод списка задолженностей, где общая сумма всех задолженностей будет <= какой-либо сумме (сама сумма должна задаваться вручную через соответствующее поле "Ограничение").
Пример отображения отчета прикрепляю.
Нашла тему с разбором примерно такой задачи, попыталась сделать по подобию... В общем, помогите, пожалуйста, я уже весь мозг сломала.

        СтандартнаяОбработка = Ложь; 
	Настройки = КомпоновщикНастроек.ПолучитьНастройки(); 
	Форма = ЭтотОбъект.ПолучитьФорму("ФормаОтчета");
	ПараметрЗдания = Новый Массив;
	ПараметрЛС = Новый Массив;  
	Запрос = Новый Запрос;
	Если Форма.ЭлементыФормы.ПоЗданиям.Значение = 0 Тогда
		ПараметрЗдания = Форма.ЭлементыФормы.Здания.Значение.ВыгрузитьЗначения();
		УсловиеНаАдреса = " ЛицевойСчет.Адрес.Владелец В ИЕРАРХИИ (&Владелец) ";
		Запрос.УстановитьПараметр("Владелец", ПараметрЗдания);
	Иначе
		ПараметрЛС = Форма.ЭлементыФормы.ЛицевыеСчета.Значение.ВыгрузитьЗначения();
		УсловиеНаАдреса = " ЛицевойСчет В (&Владелец) ";
		Запрос.УстановитьПараметр("Владелец", ПараметрЛС);
	КонецЕсли;

	Если  НЕ ЗначениеЗаполнено(Форма.ЭлементыФормы.НаДату.Значение) Тогда
		ПараметрДата = ТекущаяДата();
	Иначе
		ПараметрДата = КонецДня(Форма.ЭлементыФормы.НаДату.Значение);
	КонецЕсли;


           Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет,
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец КАК Здание,
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес КАК Помещение,
	               |	УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ОтветственныйВладелец,
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток КАК Задолженность
	               |ИЗ
	               |	РегистрНакопления.КВП_ВзаиморасчетыПоЛицевымСчетам.Остатки(&Дата, ) КАК КВП_ВзаиморасчетыПоЛицевымСчетамОстатки
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчета.СрезПоследних(&Дата, ) КАК УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних
	               |		ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ЛицевойСчет
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ЛицевыеСчета.СрезПоследних(
	               |				&Дата,
	               |				Действует
	               |					И (Регистратор ССЫЛКА Документ.КВП_ОткрытиеЛицевогоСчета
	               |						ИЛИ Регистратор ССЫЛКА Документ.КВП_ЗакрытиеЛицевогоСчета)) КАК КВП_ЛицевыеСчетаСрезПоследних
	               |		ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет
	               |ГДЕ
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток > 0
	               |	И УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ОтветственныйВладелец.ЮрФизЛицо = &ЮрФизЛицо
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет,
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец,
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес,
	               |	УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ОтветственныйВладелец,
	               |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Здание
	               |ИТОГИ
	               |	СУММА(Задолженность)
	               |ПО
	               |	ОБЩИЕ
	               |АВТОУПОРЯДОЧИВАНИЕ";
				   
	Запрос.УстановитьПараметр("Дата", ПараметрДата);
	Запрос.УстановитьПараметр("ЮрФизЛицо", Перечисления.ЮрФизЛицо.ФизЛицо);	 
	Результат = Запрос.Выполнить();
	ТаблицаДолжников = Результат.Выгрузить();

        //Что я пыталась сделать по подобию:
       
        МассивТЧ = Новый Массив;
	ПределПоСумме =  Форма.ЭлементыФормы.МаксимумСумма.Значение;
	СуммаПоТекущейТЧ = 0;
	ТекущаяТЧ = Неопределено;
	Для Каждого СтрокаТаблицы Из ТаблицаДолжников Цикл
		Если СуммаПоТекущейТЧ + СтрокаТаблицы.Задолженность <= ПределПоСумме ИЛИ ТекущаяТЧ = Неопределено Тогда
			ТекущаяТЧ = Новый ТаблицаЗначений;
			ТекущаяТЧ.Колонки.Добавить("ЛицевойСчет");
			ТекущаяТЧ.Колонки.Добавить("ОтветственныйВладелец");
			ТекущаяТЧ.Колонки.Добавить("Здание");
			ТекущаяТЧ.Колонки.Добавить("Помещение");
			ТекущаяТЧ.Колонки.Добавить("Задолженность");
			МассивТЧ.Добавить(ТекущаяТЧ);
			СуммаПоТекущейТЧ = 0;
		КонецЕсли;
		СтрокаТЧ = ТекущаяТЧ.Добавить();
		СтрокаТЧ.ЛицевойСчет = СтрокаТаблицы.ЛицевойСчет;
		СтрокаТЧ.ОтветственныйВладелец = СтрокаТаблицы.ОтветственныйВладелец;
		СтрокаТЧ.Здание = СтрокаТаблицы.Здание;
		СтрокаТЧ.Помещение = СтрокаТаблицы.Помещение;
		СтрокаТЧ.Задолженность = СтрокаТаблицы.Задолженность;
		СуммаПоТекущейТЧ = СуммаПоТекущейТЧ + СтрокаТаблицы.Задолженность;
	КонецЦикла;	

Показать


Буду благодарна за любые советы. Еще раз напомню, что я совсем-совсем новичок. Теги и метки нормально ставить не умею.
Конфигурация: 1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК (2.0.57.4)
1С:Предприятие 8.2 (8.2.19.90)
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
13. Chan1C 11.10.21 04:53 Сейчас в теме
Всем спасибо за советы, попробовали разными способами решить задачу, в итоге пришли к такому решению:

//Считаем лимит из базы
	ЛимитДолгов =  Константы.ЛимитДолга.Получить();
	
	//Объявим переменную, которая будет накапливать остаток долга
	НакапливаемаяСумма = 0;
	                          
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		НакапливаемаяСумма = НакапливаемаяСумма + ВыборкаДетальныеЗаписи.СуммаНачисленияОстаток;
		//Если сумма долга по текущему лицевому счету в общей сумме превышает лимит, прервем вывод
		Если НакапливаемаяСумма > ЛимитДолгов Тогда 
			Прервать;
		КонецЕсли;
		
		ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
		ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
	КонецЦикла;
Показать


Упростили код, вывели все в макет. Возможно, кому-нибудь понадобится.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. DJ_Codebase 08.10.21 11:18 Сейчас в теме
(1)
Вывод списка задолженностей, где общая сумма всех задолженностей будет <= какой-либо сумме (сама сумма должна задаваться вручную через соответствующее поле "Ограничение")

думаю тут нужно использовать в запросе директиву "Имеющие" к полю задолженности.
Имеющие 
Сумма(ПолеЗадолженность) <= &КакаяЛибоСумма
2. shira84 226 08.10.21 09:06 Сейчас в теме
Ну как минимум выйдут все строки, потому что добавление строк в табличную часть находится не в условии.
3. shira84 226 08.10.21 09:19 Сейчас в теме
обход группировок тоже в модуле не используется, поэтому запрос можно и проще написать, сгруппировать все лицевые по сумме задолженности

  Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100
                         |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет КАК ЛицевойСчет,
                         |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец КАК Здание,
                         |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес КАК Помещение,
                         |	УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ОтветственныйВладелец КАК ОтветственныйВладелец,
                         |	СУММА(КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток) КАК Задолженность
                         |ИЗ
                         |	РегистрНакопления.КВП_ВзаиморасчетыПоЛицевымСчетам.Остатки(&Дата, ) КАК КВП_ВзаиморасчетыПоЛицевымСчетамОстатки
                         |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчета.СрезПоследних(&Дата, ) КАК УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних
                         |		ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ЛицевойСчет
                         |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ЛицевыеСчета.СрезПоследних(
                         |				&Дата,
                         |				Действует
                         |					И (Регистратор ССЫЛКА Документ.КВП_ОткрытиеЛицевогоСчета
                         |						ИЛИ Регистратор ССЫЛКА Документ.КВП_ЗакрытиеЛицевогоСчета)) КАК КВП_ЛицевыеСчетаСрезПоследних
                         |		ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет
                         |ГДЕ
                         |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток > 0
                         |	И УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ОтветственныйВладелец.ЮрФизЛицо = &ЮрФизЛицо
                         |
                         |СГРУППИРОВАТЬ ПО
                         |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет,
                         |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец,
                         |	КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес,
                         |	УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос­ледних.ОтветственныйВладелец
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |	Здание";
Показать
4. Chan1C 08.10.21 09:43 Сейчас в теме
(3) То есть итоги не нужны? Я изначально пыталась вывести их в подвал таблицы, но потом не смогла, расстроилась и удалила все к чертям :(

Не совсем поняла (2) ответ, то есть мне нужно добавлять строки внутри условия, а не после него? Я думала, что нужно сначала объявить условие, а сами строки в цикле объявлять
5. shira84 226 08.10.21 09:57 Сейчас в теме
(4) Итоги в запросе нужны для обхода результата запроса, а итоги по всем долгам можно просчитать и в цикле.

    ПределПоСумме =  Форма.ЭлементыФормы.МаксимумСумма.Значение;
    Итого = 0;
    Для Каждого СтрокаТаблицы Из ТаблицаДолжников Цикл
        Если СтрокаТаблицы.Задолженность <= ПределПоСумме Тогда
	        СтрокаТЧ = ТекущаяТЧ.Добавить();
	        СтрокаТЧ.ЛицевойСчет = СтрокаТаблицы.ЛицевойСчет;
	        СтрокаТЧ.ОтветственныйВладелец = СтрокаТаблицы.ОтветственныйВладелец;
	        СтрокаТЧ.Здание = СтрокаТаблицы.Здание;
	        СтрокаТЧ.Помещение = СтрокаТаблицы.Помещение;
	        СтрокаТЧ.Задолженность = СтрокаТаблицы.Задолженность;
	        Итого = Итого+СтрокаТаблицы.Задолженность;
        КонецЕсли;
    КонецЦикла; 
Показать
7. Chan1C 08.10.21 10:06 Сейчас в теме
(5) К сожалению, как бы я не писала цикл, он его просто напросто пропускает и из строчки Для каждого сразу прыгает на результат, похоже где-то напутала в названиях переменных
6. shira84 226 08.10.21 10:04 Сейчас в теме
а ну и считать итог не обязательно, достаточно установить для табличной части формы "Отображать итоги в подвале"
8. Chan1C 08.10.21 10:09 Сейчас в теме
(6) оооооо, вот оно, самое интересное, нет у меня такой галочки :)
Прикрепленные файлы:
9. shira84 226 08.10.21 10:18 Сейчас в теме
(8) это характеристика колонки
10. Chan1C 08.10.21 10:22 Сейчас в теме
(9)
Прикрепленные файлы:
11. shira84 226 08.10.21 10:45 Сейчас в теме
(10) все мимо, не поле ввода, надо нажать на заголовок самой колонки, и в свойствах в характеристиках, если тип число, то будет этот пункт
13. Chan1C 11.10.21 04:53 Сейчас в теме
Всем спасибо за советы, попробовали разными способами решить задачу, в итоге пришли к такому решению:

//Считаем лимит из базы
	ЛимитДолгов =  Константы.ЛимитДолга.Получить();
	
	//Объявим переменную, которая будет накапливать остаток долга
	НакапливаемаяСумма = 0;
	                          
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		НакапливаемаяСумма = НакапливаемаяСумма + ВыборкаДетальныеЗаписи.СуммаНачисленияОстаток;
		//Если сумма долга по текущему лицевому счету в общей сумме превышает лимит, прервем вывод
		Если НакапливаемаяСумма > ЛимитДолгов Тогда 
			Прервать;
		КонецЕсли;
		
		ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
		ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
	КонецЦикла;
Показать


Упростили код, вывели все в макет. Возможно, кому-нибудь понадобится.
Оставьте свое сообщение

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