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