Почему в документах 1С не заполняется поле Договор при выборе контрагента

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

Ситуация, когда при выборе контрагента в документе (например, в «Поступлении товаров и услуг» или «Реализации») поле Договор остается пустым, хотя в карточке контрагента он заведен и даже отмечен как основной, является классической проблемой после программной загрузки данных. Давайте детально разберем, почему механизмы платформы 1С игнорируют существующие договоры и как это исправить.

Разберем логику автоматического подбора договора

В конфигурации «1С:Бухгалтерия 3.0» (БП 3.0) на управляемых формах за подстановку договора отвечает сложный механизм фильтрации. Система не просто берет первый попавшийся договор контрагента. Она проверяет его на соответствие множеству критериев, заданных в метаданных документа через СвязиПараметровВыбора. Если загруженный программно договор не соответствует хотя бы одному «невидимому» критерию, автоподстановка не сработает.

Рассмотрим основные причины по порядку — от простых настроек до технических нюансов программного кода.

1. Проверка соответствия Вида договора

Проанализируем реквизит ВидДоговора. В 1С этот реквизит определяет, в каких документах может участвовать договор. Это перечисление, которое жестко фильтруется в зависимости от типа документа:

Если при загрузке данных вы указали вид договора «Прочее» или перепутали направления (покупатель/поставщик), программа «увидит» этот договор в общем списке (если нажать «Показать все»), но никогда не подставит его автоматически, так как он не проходит по фильтру документа.

2. Соответствие Организации и Валюты

Выясним, заполнена ли в договоре Организация. В БП 3.0 договор жестко привязан к конкретному юридическому лицу из справочника Организации. Если в шапке документа выбрана «Организация А», а в договоре указана «Организация Б» (или поле в договоре вообще не заполнено), автозаполнение не произойдет.

Также важным фактором является Валюта расчетов. Если в документе установлена валюта «руб.», а в договоре — «USD», система заблокирует выбор такого договора, чтобы избежать ошибок в бухгалтерском учете.

3. Техническая ошибка: Реквизит ОсновнойДоговор в карточке Контрагента

Рассмотрим технический нюанс, который часто упускают программисты при написании обработок загрузки. Существует разница между «Договором, принадлежащим контрагенту» и «Основным договором контрагента».

В справочнике Контрагенты есть специальный реквизит ОсновнойДоговор (тип СправочникСсылка.ДоговорыКонтрагентов). Именно значение этого реквизита система пытается подставить в документ в первую очередь. При программном создании договоров недостаточно просто создать объект договора и указать ему Владельца. Нужно обязательно вернуться в объект контрагента и записать ссылку на созданный договор в поле ОсновнойДоговор.

Пример правильного кода для установки основного договора:


// Создаем договор
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйДоговор.Владелец = СсылкаНаКонтрагента;
НовыйДоговор.Наименование = "Основной договор";
НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком;
НовыйДоговор.Организация = СсылкаНаОрганизацию;
НовыйДоговор.Записать();

// Устанавливаем его основным в карточке контрагента
ОбъектКонтрагент = СсылкаНаКонтрагента.ПолучитьОбъект();
ОбъектКонтрагент.ОсновнойДоговор = НовыйДоговор.Ссылка;
ОбъектКонтрагент.Записать();

4. Проблема «битых» ссылок и GUID

Проанализируем ситуацию, описанную в сообщениях темы: при вводе на основании РКО договор попадает, а контрагент — нет. Это явный признак нарушения ссылочной целостности (проблема GUID). При программной загрузке могла возникнуть ситуация, когда в объекте Договор поле Владелец содержит идентификатор, который визуально похож на контрагента (имя совпадает), но внутренне ссылается на несуществующий или дублирующий объект.

В этом случае при выборе контрагента в документе система ищет договоры по реальной ссылке контрагента и не находит их, так как у договоров в базе прописан «другой» владелец (хотя внешне названия одинаковые). Рекомендуется проверить владельца договора через «Консоль запросов» или стандартную обработку «Поиск и замена дублей».

5. Флаги активности и скрытые реквизиты

В современных релизах 1С:Бухгалтерии у договоров есть дополнительные параметры, которые влияют на их видимость:

  1. Статус договора: Проверьте, что в договоре не установлен статус «Закрыт» или «Расторгнут» (если такая функциональность включена в настройках учета).
  2. Пометка удаления: Если сам договор или его владелец-контрагент помечены на удаление, механизмы автоподстановки их игнорируют.
  3. Группы доступа (RLS): Если в базе настроены ограничения прав доступа по организациям или контрагентам, пользователь может видеть контрагента, но не иметь прав на чтение связанных с ним договоров.

Рекомендации по исправлению проблемы

Если вы столкнулись с массовой проблемой после загрузки, выполните следующие шаги:

  1. Групповое изменение реквизитов: Воспользуйтесь стандартной обработкой «Групповое изменение реквизитов». Выберите справочник ДоговорыКонтрагентов, отфильтруйте загруженные записи и убедитесь, что поля Организация, Вид договора и Валюта расчетов заполнены корректно.
  2. Перезапись основного договора: Если реквизиты договора верны, попробуйте для одного контрагента вручную перевыбрать основной договор в его карточке. Если после этого автоподстановка в документах заработала — значит, проблема была в пустом реквизите ОсновнойДоговор в справочнике Контрагенты.
  3. Тестирование и исправление: Запустите в конфигураторе процедуру «Тестирование и исправление информационной базы» с включенными опциями «Проверка ссылочной целостности» и «Реиндексация таблиц». Это поможет выявить «битые» ссылки, возникшие при некорректной программной записи объектов.

Помните, что автоматизация в 1С строится на строгом соблюдении типов данных и связей между ними. Тщательная проверка реквизитов Владелец, Организация и ВидДоговора решает проблему в 99% случаев.

← На главную