Ситуация, когда при выборе контрагента в документе (например, в «Поступлении товаров и услуг» или «Реализации») поле Договор остается пустым, хотя в карточке контрагента он заведен и даже отмечен как основной, является классической проблемой после программной загрузки данных. Давайте детально разберем, почему механизмы платформы 1С игнорируют существующие договоры и как это исправить.
В конфигурации «1С:Бухгалтерия 3.0» (БП 3.0) на управляемых формах за подстановку договора отвечает сложный механизм фильтрации. Система не просто берет первый попавшийся договор контрагента. Она проверяет его на соответствие множеству критериев, заданных в метаданных документа через СвязиПараметровВыбора. Если загруженный программно договор не соответствует хотя бы одному «невидимому» критерию, автоподстановка не сработает.
Рассмотрим основные причины по порядку — от простых настроек до технических нюансов программного кода.
Проанализируем реквизит ВидДоговора. В 1С этот реквизит определяет, в каких документах может участвовать договор. Это перечисление, которое жестко фильтруется в зависимости от типа документа:
Если при загрузке данных вы указали вид договора «Прочее» или перепутали направления (покупатель/поставщик), программа «увидит» этот договор в общем списке (если нажать «Показать все»), но никогда не подставит его автоматически, так как он не проходит по фильтру документа.
Выясним, заполнена ли в договоре Организация. В БП 3.0 договор жестко привязан к конкретному юридическому лицу из справочника Организации. Если в шапке документа выбрана «Организация А», а в договоре указана «Организация Б» (или поле в договоре вообще не заполнено), автозаполнение не произойдет.
Также важным фактором является Валюта расчетов. Если в документе установлена валюта «руб.», а в договоре — «USD», система заблокирует выбор такого договора, чтобы избежать ошибок в бухгалтерском учете.
Рассмотрим технический нюанс, который часто упускают программисты при написании обработок загрузки. Существует разница между «Договором, принадлежащим контрагенту» и «Основным договором контрагента».
В справочнике Контрагенты есть специальный реквизит ОсновнойДоговор (тип СправочникСсылка.ДоговорыКонтрагентов). Именно значение этого реквизита система пытается подставить в документ в первую очередь. При программном создании договоров недостаточно просто создать объект договора и указать ему Владельца. Нужно обязательно вернуться в объект контрагента и записать ссылку на созданный договор в поле ОсновнойДоговор.
Пример правильного кода для установки основного договора:
// Создаем договор
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйДоговор.Владелец = СсылкаНаКонтрагента;
НовыйДоговор.Наименование = "Основной договор";
НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком;
НовыйДоговор.Организация = СсылкаНаОрганизацию;
НовыйДоговор.Записать();
// Устанавливаем его основным в карточке контрагента
ОбъектКонтрагент = СсылкаНаКонтрагента.ПолучитьОбъект();
ОбъектКонтрагент.ОсновнойДоговор = НовыйДоговор.Ссылка;
ОбъектКонтрагент.Записать();
Проанализируем ситуацию, описанную в сообщениях темы: при вводе на основании РКО договор попадает, а контрагент — нет. Это явный признак нарушения ссылочной целостности (проблема GUID). При программной загрузке могла возникнуть ситуация, когда в объекте Договор поле Владелец содержит идентификатор, который визуально похож на контрагента (имя совпадает), но внутренне ссылается на несуществующий или дублирующий объект.
В этом случае при выборе контрагента в документе система ищет договоры по реальной ссылке контрагента и не находит их, так как у договоров в базе прописан «другой» владелец (хотя внешне названия одинаковые). Рекомендуется проверить владельца договора через «Консоль запросов» или стандартную обработку «Поиск и замена дублей».
В современных релизах 1С:Бухгалтерии у договоров есть дополнительные параметры, которые влияют на их видимость:
Если вы столкнулись с массовой проблемой после загрузки, выполните следующие шаги:
ДоговорыКонтрагентов, отфильтруйте загруженные записи и убедитесь, что поля Организация, Вид договора и Валюта расчетов заполнены корректно.ОсновнойДоговор в справочнике Контрагенты.Помните, что автоматизация в 1С строится на строгом соблюдении типов данных и связей между ними. Тщательная проверка реквизитов Владелец, Организация и ВидДоговора решает проблему в 99% случаев.