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