При разработке отчетов или встроенных обработок в 1С часто возникает задача получить взаиморасчеты по счету 62 «Расчеты с покупателями и заказчиками» не по одному конкретному контрагенту, а суммарно по всей группе (папке) справочника. В этой статье мы разберем, как правильно составить текст запроса к виртуальной таблице остатков регистра бухгалтерии, как избавиться от детализации по отдельным элементам и как верно обработать результат в коде 1С.
Проанализируем типичную ошибку при попытке задать иерархический отбор. Начинающие разработчики иногда пишут условие вида Субконто1 = Контрагент В ИЕРАРХИИ (&ГрупКонтр), что приводит к синтаксической ошибке при компиляции запроса.
Для корректного отбора всех элементов, входящих в группу (включая вложенные подгруппы), в параметрах виртуальной таблицы РегистрБухгалтерии.Хозрасчетный.Остатки используется оператор В ИЕРАРХИИ непосредственно после поля субконто.
Рассмотрим пример запроса, который выбирает остатки с детализацией по каждому контрагенту из папки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Период,
| Счет В ИЕРАРХИИ (&Счет),
| ,
| Субконто1 В ИЕРАРХИИ (&ГрупКонтр)
| ) КАК ХозрасчетныйОстатки";
Если цель задачи — получить единый итоговый остаток долга по всей группе без разбивки по контрагентам, из секции ВЫБРАТЬ необходимо полностью исключить поле Субконто1.
Разберем по шагам, как это работает: виртуальная таблица регистра бухгалтерии автоматически группирует итоги по тем измерениям и субконто, которые указаны в предложении ВЫБРАТЬ. Если указан только ресурс СуммаОстаток, система вернет ровно одну строку с суммарным остатком по всем контрагентам, удовлетворяющим условию отбора.
Текст запроса для получения свернутой суммы выглядит следующей формой:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Период,
| Счет В ИЕРАРХИИ (&Счет),
| ,
| Субконто1 В ИЕРАРХИИ (&ГрупКонтр)
| ) КАК ХозрасчетныйОстатки";
Запрос.УстановитьПараметр("Период", НачДата);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками);
Запрос.УстановитьПараметр("ГрупКонтр", ГруппаПокупателей);
Выясним причину, почему при корректном запросе разработчики иногда получают незаполненные данные. Распространенная ошибка заключается в том, что после вызова метода Запрос.Выполнить().Выбрать() сразу пытаются обратиться к полям результата без перехода на первую строку.
Объект ВыборкаИзРезультатаЗапроса требует позиционирования на записи с помощью метода Следующий(), даже если запрос возвращает всего одну итоговую строку.
Посмотрим на пример правильного получения итоговой суммы в коде:
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Записи = Результат.Выбрать();
// Переходим к первой (и единственной) строке выборки
Если Записи.Следующий() Тогда
ОбщийОстаток = Записи.СуммаОстаток;
Сообщить("Остаток долга по группе на дату " + Формат(НачДата, "ДФ=dd.MM.yyyy") + ": " + ОбщийОстаток + " руб.");
КонецЕсли;
Иначе
Сообщить("Остатки по выбранной группе контрагентов отсутствуют.");
КонецЕсли;
При работе с остатками по счету 62 рекомендуем учитывать следующие практические нюансы:
СуммаОстаток возвращает свернутое сальдо. Если вам требуется отдельно дебиторская задолженность и полученные авансы, вместо СуммаОстаток следует выбирать поля СуммаОстатокДт и СуммаОстатокКт.Субконто1. Обращение работает по порядковому номеру субконто на счете. Для повышения надежности рекомендуется явно передавать вид субконто в третий параметр виртуальной таблицы: ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты.