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