Каждый разработчик или продвинутый аналитик 1С, открыв схему компоновки данных (СКД) типового отчета «Задолженность клиентов по срокам» в конфигурациях «1С:Управление торговлей 11», «1С:Комплексная автоматизация 2» или «1С:ERP», сталкивается с загадкой. В пользовательском режиме отчет выводит красивые колонки с интервалами просрочки (например, «1–29 дней», «свыше 30 дней»), но в самом запросе СКД нет ни единого упоминания этих интервалов, как нет и обращения к справочнику, где они хранятся.
В этой статье мы подробно разберем внутреннее устройство этого отчета, выясним, какая магия происходит «под капотом» платформы 1С при его формировании, и научимся управлять классификацией задолженности как в режиме конфигуратора, так и непосредственно в пользовательском интерфейсе.
Если мы откроем макет СКД отчета в конфигураторе, то увидим базовый запрос, который выбирает данные о взаиморасчетах, датах отгрузки и плановых датах платежей. Никаких жестко прописанных конструкций ВЫБОР КОГДА... для разбиения по дням просрочки там нет.
Разработчики фирмы «1С» отказались от жесткого кодирования интервалов в тексте запроса. Это сделано для обеспечения гибкости: у каждого предприятия свои требования к оценке дебиторской задолженности. Одному бизнесу достаточно деления на «до месяца» и «более месяца», а другому необходим детальный еженедельный мониторинг (1–7 дней, 8–14 дней и т. д.).
Решение было найдено в виде программной модификации схемы компоновки данных прямо в процессе формирования отчета.
Давайте разберем по шагам, что происходит в момент нажатия кнопки «Сформировать». Для этого нам нужно заглянуть в модуль объекта отчета. Основная логика скрыта в предопределенной процедуре ПриКомпоновкеРезультата.
Проанализируем примерную схему работы этого алгоритма:
ВариантыКлассификацииЗадолженности.Для каждого интервала из справочника программно создается новое Вычисляемое поле. Выражение этого поля формируется по следующему шаблону:
ВЫБОР
КОГДА ПросроченоДней >= [НижняяГраница] И ПросроченоДней <= [ВерхняяГраница]
ТОГДА СуммаДолга
ИНАЧЕ 0
КОНЕЦ
После создания вычисляемых полей алгоритм добавляет их в ресурсы схемы, чтобы система могла корректно рассчитывать итоги по группировкам, и выводит новые поля в структуру колонок макета компоновки. В результате на выходе мы получаем отчет с актуальной и динамически перестроенной структурой колонок.
Хотя сами колонки создаются динамически, исходные числовые данные для них подготавливает именно запрос СКД. Давайте выясним, как рассчитывается ключевой показатель — количество дней просрочки (ПросроченоДней).
Запрос обращается к регистрам накопления взаиморасчетов. В зависимости от выбранной в системе архитектуры расчетов (онлайн или офлайн взаиморасчеты) источником данных служат регистры:
РегистрНакопления.РасчетыСКлиентамиРегистрНакопления.РасчетыСКлиентамиПоДокументамПри расчете просрочки система опирается на две важные даты:
РеализацияТоваровУслуг).Показатель ПросроченоДней рассчитывается как разность между текущей датой (на которую формируется отчет) и плановой датой платежа. Если плановая дата еще не наступила, долг считается плановым (непросроченным). Если дата прошла, разница в днях передается в динамические формулы вычисляемых полей, которые мы рассмотрели на предыдущем шаге.
Перед тем как выполнить запрос и построить отчет, система выполняет критически важное действие. Поскольку в ERP-решениях 1С используется механизм отложенного проведения и распределения расчетов, данные в регистрах на текущий момент времени могут быть неактуальными. Например, клиент мог оплатить долг час назад, но регламентное задание по распределению платежей еще не запустилось.
Чтобы пользователь не увидел в отчете ложную информацию о долгах, в процедуре ПриКомпоновкеРезультата перед расчетом СКД программно вызывается метод распределения взаиморасчетов:
ВзаиморасчетыСервер.ВыполнитьПроведениеДокументовПоРасчетамСКлиентами();
Это гарантирует, что все платежи будут сопоставлены с накладными непосредственно перед выводом цифр на экран. Имейте это в виду, если отчет на крупных базах формируется с некоторой задержкой — система выполняет сложные математические расчеты в фоновом режиме для актуализации данных.
Теперь рассмотрим, как изменить существующие интервалы или добавить новые без программирования и изменения конфигурации. Для этого нам понадобится включить соответствующую опцию в настройках системы.
Выполним следующие шаги по настройке системы:
После этого откроем отчет «Задолженность клиентов по срокам». В шапке отчета появится активное поле «Классификация». Нам достаточно выбрать созданный нами вариант и нажать кнопку «Сформировать». Отчет мгновенно перестроится под новые интервалы, а программный код СКД автоматически сгенерирует нужные вычисляемые поля под новые границы дней.
Мы выяснили, почему в отчете по задолженности клиентов нет жестко заданных интервалов в конфигураторе. Такой подход разработчиков 1С избавляет нас от необходимости переписывать код и запросы при малейшем изменении бизнес-требований. Программная генерация вычисляемых полей СКД на основе справочника ВариантыКлассификацииЗадолженности — это отличный пример гибкой архитектуры, сочетающей высокую производительность платформы и удобство для конечного пользователя.