При разработке отчетов по взаиморасчетам и просроченной задолженности разработчики часто сталкиваются с ситуацией, когда суммы в отчете не сходятся с фактическими данными. Например, после проведения реализации и последующего возврата товаров на ту же сумму отчет продолжает показывать наличие просроченного долга. Разберем по шагам, почему возникают такие ошибки в запросах к регистру бухгалтерии и как правильно организовать получение данных.
Рассмотрим исходный вариант запроса, который часто пытаются использовать для вычисления просрочки:
ВЫБРАТЬ
ВЫБОР
КОГДА ХозрасчетныйОстатки.СуммаОстаток - ХозрасчетныйОбороты.СуммаОборотКт > 0
ТОГДА ХозрасчетныйОстатки.СуммаОстаток - ХозрасчетныйОбороты.СуммаОборотКт
ИНАЧЕ 0
КОНЕЦ КАК ПросроченнаяЗадолженность
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата, Счет В ИЕРАРХИИ (&СЧ), , Субконто2 = &Договор) КАК ХозрасчетныйОстатки,
РегистрБухгалтерии.Хозрасчетный.Обороты(&Дата, , , Счет В ИЕРАРХИИ (&СЧ), , Субконто2 = &Договор, , ) КАК ХозрасчетныйОбороты
Проанализируем ключевые методологические и синтаксические проблемы этой конструкции:
ЛЕВОЕ СОЕДИНЕНИЕ или ПОЛНОЕ СОЕДИНЕНИЕ приводит к декартову произведению. Если на указанную дату остаток есть, а оборотов за период не было, виртуальная таблица оборотов вернет пустоту, а весь запрос не вернет ни одной строки.NULL. Если одна из таблиц не содержит записей по договору, при соединении образуются поля со значением NULL. Выражение СуммаОстаток - NULL возвращает NULL, а проверка NULL > 0 дает результат Ложь. Обязательно требуется оборачивать числовые поля в функцию ЕСТЬNULL().СуммаОборотКт), а сторнировочную проводку с отрицательным значением по дебету счета расчетов (СуммаОборотДт < 0). В результате поле СуммаОборотКт остается равным нулю, а операция уменьшения долга через кредит счета просто не фиксируется.В комплексных конфигурациях (например, 1С:УПП или 1С:Комплексная автоматизация) расчет просроченной задолженности не рекомендуется выполнять напрямую по регистру бухгалтерии. Для этих целей предназначены специализированные регистры накопления.
Рассмотрим преимущества работы с регистрами накопления взаиморасчетов:
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов позволяет видеть остаток долга в разрезе конкретных документов возникновения задолженности (накладных, актов).Если расчет необходимо выполнить строго по данным бухгалтерского учета, анализируем третье субконто счета 62 — Документы расчетов с контрагентами. При ведении учета по документам расчетов остаток долга на контрольную дату раскладывается по документам реализации.
Разберем пример запроса, который корректно соединяет остатки по субсчетам и отбирает задолженность, возникшую ранее допустимого срока оплаты:
ВЫБРАТЬ
ОстаткиПоДокументам.Субконто1 КАК Контрагент,
ОстаткиПоДокументам.Субконто2 КАК Договор,
ОстаткиПоДокументам.Субконто3 КАК ДокументРасчетов,
ЕСТЬNULL(ОстаткиПоДокументам.СуммаОстатокДт, 0) КАК СуммаДолга
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&ГраницаПросрочки,
Счет В ИЕРАРХИИ (&СчетРасчетов),
&МассивВидовСубконто,
Субконто1 = &Контрагент И Субконто2 = &Договор
) КАК ОстаткиПоДокументам
ГДЕ
ЕСТЬNULL(ОстаткиПоДокументам.СуммаОстатокДт, 0) > 0
Выясним причину, почему данный подход надежнее:
&ГраницаПросрочки рассчитывается заранее в коде (например, ТекущаяДата() - ДнейОтсрочки * 86400). Все документы, по которым остался дебетовый остаток на эту дату, автоматически считаются просроченными.-1, которые приводят к логическим ошибкам в условиях ветвления ВЫБОР КОГДА ....Чтобы исключить расхождения в отчетах, выполним следующие шаги:
&МассивВидовСубконто), чтобы логика условий Субконто1, Субконто2 не нарушалась при изменении порядка субконто в плане счетов.СуммаОборотДт и СуммаОборотКт, так как возврат товара уменьшает дебет сторнировочной записью.