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