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