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