При переходе на новые версии конфигураций, таких как 1С:Управление торговлей 11.5, 1С:ERP 2.5 или 1С:Комплексная автоматизация 2.5, разработчики часто сталкиваются с трудностями при заполнении реквизитов, связанных с взаиморасчетами. Одной из самых загадочных сущностей является реквизит с типом ОпределяемыйТип.ОбъектРасчетов. В этой статье мы подробно разберем, как работать с этим типом, почему не стоит заполнять его "руками" и как заставить систему делать это автоматически при программном создании документов.
Для начала давайте проанализируем, почему старые методы работы с взаиморасчетами больше не эффективны. В версии 11.5 компания 1С внедрила новую архитектуру под кодовым названием "Взаиморасчеты онлайн". Главным звеном этой системы стал системный справочник ОбъектыРасчетов. Он выступает в роли так называемого "ключа расчетов".
Ранее в регистрах накопления (например, "Расчеты с клиентами") было множество измерений: Заказ, Договор, Накладная. Теперь же вместо этого набора используется одна ссылка на справочник ОбъектыРасчетов. Это позволяет унифицировать запросы и значительно ускорить проведение документов. Чтобы наглядно увидеть, как система группирует данные в новом механизме, полезно использовать анализ продаж и оплат по объектам расчётов, который показывает детальную картину движений по менеджерам и банковским счетам.
Рассмотрим ситуацию: вы создаете новый документ, например, ПоступлениеБезналичныхДенежныхСредств, и пытаетесь присвоить реквизиту ОбъектРасчетов значение типа ДокументСсылка или СправочникСсылка. В отладке вы видите, что реквизит имеет значение Неопределено, а попытка присвоить ему тип метаданных через Метаданные.ОпределяемыеТипы.ОбъектРасчетов.Тип не приносит результата.
Важный момент: Реквизит ОбъектРасчетов ожидает ссылку именно на элемент справочника ОбъектыРасчетов, а не на сам заказ или договор. Однако этот справочник является системным, и его элементы создаются особым образом через механизм хеширования. Если аналитика заполнена неверно, могут возникнуть сложности с распределением сумм. В таких случаях разработчикам часто помогает специальная автоматизация зачета авансов, которая исправляет расхождения по объектам расчетов без ручной корректировки каждого документа.
Давайте выясним, как правильно инициализировать этот реквизит. Если мы загружаем документы из внешнего источника (например, через JSON), нам необходимо убедиться, что все обеспечивающие реквизиты заполнены корректно. Система сама определит и создаст объект расчетов, если ей будет достаточно данных.
Проанализируем шаги, которые необходимо выполнить для корректного заполнения документа:
Организация, Партнер, Контрагент, Валюта.РасшифровкаПлатежа. Именно в ней в новых редакциях кроется ключ к успеху.Рассмотрим пример кода, который подготавливает структуру данных для поиска или создания объекта расчетов:
// Пример использования системного API для получения объекта расчетов
ДанныеОбъекта = Новый Структура;
ДанныеОбъекта.Вставить("Организация", СсылкаНаОрганизацию);
ДанныеОбъекта.Вставить("Партнер", СсылкаНаПартнера);
ДанныеОбъекта.Вставить("Контрагент", СсылкаНаКонтрагента);
ДанныеОбъекта.Вставить("Договор", СсылкаНаДоговор);
ДанныеОбъекта.Вставить("Объект", СсылкаНаЗаказИлиНакладную);
// Вызов функции из серверного модуля
ОбъектРасчетовСсылка = ОбъектыРасчетовСервер.ПолучитьОбъектРасчетов(ДанныеОбъекта);
// Теперь полученную ссылку можно подставить в документ
НовыйДокумент.ОбъектРасчетов = ОбъектРасчетовСсылка;
Если вы работаете с платежными документами (Поступление или Списание безналичных ДС), рекомендуется использовать методы модуля ДенежныеСредстваСервер — для этого есть автоматизация обработки банковской выписки и расшифровки платежа. Рассмотрим подробнее процедуру ЗаполнитьДанныеОбъектаРасчетовРасшифровкиПлатежа. Она анализирует данные строки табличной части и автоматически находит нужный объект в справочнике или помечает, что документу нужно стать объектом расчетов самостоятельно (в случае аванса).
Для контроля правильности отражения таких операций в системе удобно применять анализ безналичных платежей по заказам клиентов. А в тех случаях, когда требуется массово обработать приходные кассовые ордера, эффективным решением станет автоматизация разнесения платежей ПКО по объектам расчетов.
Посмотрим на пример правильного заполнения нового документа при загрузке:
Процедура ЗагрузитьПлатежИзJSON(ДанныеJSON)
ДокОбъект = Документы.ПоступлениеБезналичныхДенежныхСредств.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
// ... заполнение реквизитов шапки ...
НоваяСтрока = ДокОбъект.РасшифровкаПлатежа.Добавить();
НоваяСтрока.Сумма = ДанныеJSON.Сумма;
НоваяСтрока.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.ОплатаОтПокупателя;
// Вместо прямой вставки в ОбъектРасчетов, заполняем Основание
НоваяСтрока.Заказ = ДанныеJSON.СсылкаНаЗаказ;
// Важно: вызываем типовой механизм заполнения
ДенежныеСредстваСервер.ЗаполнитьДанныеОбъектаРасчетовРасшифровкиПлатежа(ДокОбъект);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Эта ошибка — самая частая при программной записи. Давайте разберем по шагам причины ее возникновения:
Заказ или ОбъектРасчетов запихнуть конкретную накладную. Система видит это противоречие и очищает поле.ЭтотОбъект.Ссылка может быть пустой, если запись еще не производилась.РасшифровкаПлатежа сумма или статья ДДС заполнены неверно, типовые алгоритмы проведения могут "спотыкаться".Если ошибки в аналитике привели к некорректным остаткам, которые невозможно исправить простым перепроведением, бухгалтеру может потребоваться групповое создание документов корректировки задолженности для списания неактуальных долгов.
Если вы столкнулись с ситуацией, когда программно созданный документ не проводится, а созданный вручную — проводится, выполните следующие действия:
Во-первых, проверьте движения обоих документов по регистру накопления "Расчеты с клиентами". Сравнить ожидаемые и реальные показатели поможет анализ оплат клиентов по менеджерам и объектам расчётов, который покажет, где именно возникла дебиторская или кредиторская задолженность.
Во-вторых, обратите внимание на общий модуль ОбъектыРасчетовСервер, процедура ЗаполнитьОчиститьОбъектРасчетов. Поставьте там точку останова и проанализируйте содержимое переменной МассивСтруктур — поможет вспомогательный инструмент для отладки программного кода. Там вы увидите, какие поля система считает ключевыми для поиска объекта расчетов и на каком именно поле она "сбоит".
Подводя итог, можно сказать: никогда не пытайтесь создавать элементы справочника "Объекты расчетов" вручную через СоздатьЭлемент(), если не уверены в заполнении всех скрытых реквизитов и хеш-сумм. Всегда используйте ОбъектыРасчетовСервер.ПолучитьОбъектРасчетов() или полагайтесь на процедуры ДенежныеСредстваСервер. Помните, что ОбъектРасчетов — это не просто ссылка на документ, это сложная системная сущность, обеспечивающая целостность ваших взаиморасчетов в 1С.