Вывод табличного списка с ограничением по сумме
Добрый день. Пытаюсь написать отчет для отображения списка должников. Заранее скажу, что в области программирования в 1С я ультра новичок. На данный момент реализовано:
- Отображение задолженностей по лицевым счетам на конкретную дату.
Что я безуспешно пытаюсь сделать:
- Вывод списка задолженностей, где общая сумма всех задолженностей будет <= какой-либо сумме (сама сумма должна задаваться вручную через соответствующее поле "Ограничение").
Пример отображения отчета прикрепляю.
Нашла тему с разбором примерно такой задачи, попыталась сделать по подобию... В общем, помогите, пожалуйста, я уже весь мозг сломала.
Буду благодарна за любые советы. Еще раз напомню, что я совсем-совсем новичок. Теги и метки нормально ставить не умею.
Конфигурация: 1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК (2.0.57.4)
1С:Предприятие 8.2 (8.2.19.90)
- Отображение задолженностей по лицевым счетам на конкретную дату.
Что я безуспешно пытаюсь сделать:
- Вывод списка задолженностей, где общая сумма всех задолженностей будет <= какой-либо сумме (сама сумма должна задаваться вручную через соответствующее поле "Ограничение").
Пример отображения отчета прикрепляю.
Нашла тему с разбором примерно такой задачи, попыталась сделать по подобию... В общем, помогите, пожалуйста, я уже весь мозг сломала.
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Форма = ЭтотОбъект.ПолучитьФорму("ФормаОтчета");
ПараметрЗдания = Новый Массив;
ПараметрЛС = Новый Массив;
Запрос = Новый Запрос;
Если Форма.ЭлементыФормы.ПоЗданиям.Значение = 0 Тогда
ПараметрЗдания = Форма.ЭлементыФормы.Здания.Значение.ВыгрузитьЗначения();
УсловиеНаАдреса = " ЛицевойСчет.Адрес.Владелец В ИЕРАРХИИ (&Владелец) ";
Запрос.УстановитьПараметр("Владелец", ПараметрЗдания);
Иначе
ПараметрЛС = Форма.ЭлементыФормы.ЛицевыеСчета.Значение.ВыгрузитьЗначения();
УсловиеНаАдреса = " ЛицевойСчет В (&Владелец) ";
Запрос.УстановитьПараметр("Владелец", ПараметрЛС);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Форма.ЭлементыФормы.НаДату.Значение) Тогда
ПараметрДата = ТекущаяДата();
Иначе
ПараметрДата = КонецДня(Форма.ЭлементыФормы.НаДату.Значение);
КонецЕсли;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец КАК Здание,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес КАК Помещение,
| УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ОтветственныйВладелец,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток КАК Задолженность
|ИЗ
| РегистрНакопления.КВП_ВзаиморасчетыПоЛицевымСчетам.Остатки(&Дата, ) КАК КВП_ВзаиморасчетыПоЛицевымСчетамОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчета.СрезПоследних(&Дата, ) КАК УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних
| ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ЛицевойСчет
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ЛицевыеСчета.СрезПоследних(
| &Дата,
| Действует
| И (Регистратор ССЫЛКА Документ.КВП_ОткрытиеЛицевогоСчета
| ИЛИ Регистратор ССЫЛКА Документ.КВП_ЗакрытиеЛицевогоСчета)) КАК КВП_ЛицевыеСчетаСрезПоследних
| ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет
|ГДЕ
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток > 0
| И УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ОтветственныйВладелец.ЮрФизЛицо = &ЮрФизЛицо
|
|СГРУППИРОВАТЬ ПО
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес,
| УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ОтветственныйВладелец,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток
|
|УПОРЯДОЧИТЬ ПО
| Здание
|ИТОГИ
| СУММА(Задолженность)
|ПО
| ОБЩИЕ
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Дата", ПараметрДата);
Запрос.УстановитьПараметр("ЮрФизЛицо", Перечисления.ЮрФизЛицо.ФизЛицо);
Результат = Запрос.Выполнить();
ТаблицаДолжников = Результат.Выгрузить();
//Что я пыталась сделать по подобию:
МассивТЧ = Новый Массив;
ПределПоСумме = Форма.ЭлементыФормы.МаксимумСумма.Значение;
СуммаПоТекущейТЧ = 0;
ТекущаяТЧ = Неопределено;
Для Каждого СтрокаТаблицы Из ТаблицаДолжников Цикл
Если СуммаПоТекущейТЧ + СтрокаТаблицы.Задолженность <= ПределПоСумме ИЛИ ТекущаяТЧ = Неопределено Тогда
ТекущаяТЧ = Новый ТаблицаЗначений;
ТекущаяТЧ.Колонки.Добавить("ЛицевойСчет");
ТекущаяТЧ.Колонки.Добавить("ОтветственныйВладелец");
ТекущаяТЧ.Колонки.Добавить("Здание");
ТекущаяТЧ.Колонки.Добавить("Помещение");
ТекущаяТЧ.Колонки.Добавить("Задолженность");
МассивТЧ.Добавить(ТекущаяТЧ);
СуммаПоТекущейТЧ = 0;
КонецЕсли;
СтрокаТЧ = ТекущаяТЧ.Добавить();
СтрокаТЧ.ЛицевойСчет = СтрокаТаблицы.ЛицевойСчет;
СтрокаТЧ.ОтветственныйВладелец = СтрокаТаблицы.ОтветственныйВладелец;
СтрокаТЧ.Здание = СтрокаТаблицы.Здание;
СтрокаТЧ.Помещение = СтрокаТаблицы.Помещение;
СтрокаТЧ.Задолженность = СтрокаТаблицы.Задолженность;
СуммаПоТекущейТЧ = СуммаПоТекущейТЧ + СтрокаТаблицы.Задолженность;
КонецЦикла;
ПоказатьБуду благодарна за любые советы. Еще раз напомню, что я совсем-совсем новичок. Теги и метки нормально ставить не умею.
Конфигурация: 1С:Учет в управляющих компаниях ЖКХ, ТСЖ и ЖСК (2.0.57.4)
1С:Предприятие 8.2 (8.2.19.90)
Прикрепленные файлы:
По теме из базы знаний
- Всякие полезности
- 1С УНФ: настройка прав пользователей и ограничений
- Как работают управляемые формы и тонкий клиент 1С – взгляд "из-под капота"
- Загрузка чеков в 1С из ФНС в документы БП, УНФ, ERP, КА и УТ
- Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений
Найденные решения
Всем спасибо за советы, попробовали разными способами решить задачу, в итоге пришли к такому решению:
Упростили код, вывели все в макет. Возможно, кому-нибудь понадобится.
//Считаем лимит из базы
ЛимитДолгов = Константы.ЛимитДолга.Получить();
//Объявим переменную, которая будет накапливать остаток долга
НакапливаемаяСумма = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НакапливаемаяСумма = НакапливаемаяСумма + ВыборкаДетальныеЗаписи.СуммаНачисленияОстаток;
//Если сумма долга по текущему лицевому счету в общей сумме превышает лимит, прервем вывод
Если НакапливаемаяСумма > ЛимитДолгов Тогда
Прервать;
КонецЕсли;
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
ПоказатьУпростили код, вывели все в макет. Возможно, кому-нибудь понадобится.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
думаю тут нужно использовать в запросе директиву "Имеющие" к полю задолженности.
Вывод списка задолженностей, где общая сумма всех задолженностей будет <= какой-либо сумме (сама сумма должна задаваться вручную через соответствующее поле "Ограничение")
думаю тут нужно использовать в запросе директиву "Имеющие" к полю задолженности.
Имеющие
Сумма(ПолеЗадолженность) <= &КакаяЛибоСумма
обход группировок тоже в модуле не используется, поэтому запрос можно и проще написать, сгруппировать все лицевые по сумме задолженности
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет КАК ЛицевойСчет,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец КАК Здание,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес КАК Помещение,
| УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ОтветственныйВладелец КАК ОтветственныйВладелец,
| СУММА(КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток) КАК Задолженность
|ИЗ
| РегистрНакопления.КВП_ВзаиморасчетыПоЛицевымСчетам.Остатки(&Дата, ) КАК КВП_ВзаиморасчетыПоЛицевымСчетамОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчета.СрезПоследних(&Дата, ) КАК УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних
| ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ЛицевойСчет
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КВП_ЛицевыеСчета.СрезПоследних(
| &Дата,
| Действует
| И (Регистратор ССЫЛКА Документ.КВП_ОткрытиеЛицевогоСчета
| ИЛИ Регистратор ССЫЛКА Документ.КВП_ЗакрытиеЛицевогоСчета)) КАК КВП_ЛицевыеСчетаСрезПоследних
| ПО КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет = КВП_ЛицевыеСчетаСрезПоследних.ЛицевойСчет
|ГДЕ
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.СуммаНачисленияОстаток > 0
| И УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ОтветственныйВладелец.ЮрФизЛицо = &ЮрФизЛицо
|
|СГРУППИРОВАТЬ ПО
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес.Владелец,
| КВП_ВзаиморасчетыПоЛицевымСчетамОстатки.ЛицевойСчет.Адрес,
| УПЖКХ_ОтветственныйСобственникНанимательЛицевогоСчетаСрезПос ледних.ОтветственныйВладелец
|
|УПОРЯДОЧИТЬ ПО
| Здание";
Показать
(3) То есть итоги не нужны? Я изначально пыталась вывести их в подвал таблицы, но потом не смогла, расстроилась и удалила все к чертям :(
Не совсем поняла (2) ответ, то есть мне нужно добавлять строки внутри условия, а не после него? Я думала, что нужно сначала объявить условие, а сами строки в цикле объявлять
Не совсем поняла (2) ответ, то есть мне нужно добавлять строки внутри условия, а не после него? Я думала, что нужно сначала объявить условие, а сами строки в цикле объявлять
(4) Итоги в запросе нужны для обхода результата запроса, а итоги по всем долгам можно просчитать и в цикле.
ПределПоСумме = Форма.ЭлементыФормы.МаксимумСумма.Значение;
Итого = 0;
Для Каждого СтрокаТаблицы Из ТаблицаДолжников Цикл
Если СтрокаТаблицы.Задолженность <= ПределПоСумме Тогда
СтрокаТЧ = ТекущаяТЧ.Добавить();
СтрокаТЧ.ЛицевойСчет = СтрокаТаблицы.ЛицевойСчет;
СтрокаТЧ.ОтветственныйВладелец = СтрокаТаблицы.ОтветственныйВладелец;
СтрокаТЧ.Здание = СтрокаТаблицы.Здание;
СтрокаТЧ.Помещение = СтрокаТаблицы.Помещение;
СтрокаТЧ.Задолженность = СтрокаТаблицы.Задолженность;
Итого = Итого+СтрокаТаблицы.Задолженность;
КонецЕсли;
КонецЦикла;
Показать
Всем спасибо за советы, попробовали разными способами решить задачу, в итоге пришли к такому решению:
Упростили код, вывели все в макет. Возможно, кому-нибудь понадобится.
//Считаем лимит из базы
ЛимитДолгов = Константы.ЛимитДолга.Получить();
//Объявим переменную, которая будет накапливать остаток долга
НакапливаемаяСумма = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НакапливаемаяСумма = НакапливаемаяСумма + ВыборкаДетальныеЗаписи.СуммаНачисленияОстаток;
//Если сумма долга по текущему лицевому счету в общей сумме превышает лимит, прервем вывод
Если НакапливаемаяСумма > ЛимитДолгов Тогда
Прервать;
КонецЕсли;
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
ПоказатьУпростили код, вывели все в макет. Возможно, кому-нибудь понадобится.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот