Как программно установить основной договор контрагента при его создании в 1С

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

В процессе автоматизации загрузки данных или создания новых контрагентов в 1С часто возникает задача не просто создать объект справочника ДоговорыКонтрагентов, но и сразу назначить его «Основным». Это критически важно для корректной работы системы, так как именно основной договор автоматически подставляется в документы реализации, поступления или платежные поручения, сокращая время работы пользователя и минимизируя ошибки ввода.

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

Почему прямая запись в справочник не работает?

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

Рассмотрим структуру такого регистра (можно увидеть, что он обычно называется ОсновныеДоговорыКонтрагента):

  1. Измерения: Организация и Контрагент. Это ключи, по которым система находит нужную запись.
  2. Ресурсы: Договор. Здесь хранится ссылка на конкретный элемент справочника ДоговорыКонтрагентов.

Пошаговый алгоритм программной установки договора

Чтобы успешно установить договор основным, мы должны выполнить последовательность действий, включающую создание самого объекта и последующую запись в регистр сведений. Проанализируем по шагам процесс реализации этой задачи.

Шаг 1. Создание и запись нового договора

Прежде чем назначать договор основным, его необходимо физически записать в базу данных, чтобы получить уникальную ссылку. Без ссылки (пока объект существует только в оперативной памяти) запись в регистр сведений невозможна.

Посмотрим на пример кода для создания договора (быстрее написать каркас поможет Консоль кода + ИИ-помощник):


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

// Важно! Сначала записываем объект
НовыйДоговор.Записать();
СсылкаНаНовыйДоговор = НовыйДоговор.Ссылка;

Шаг 2. Запись данных в регистр сведений

Теперь, когда у нас есть СсылкаНаНовыйДоговор, мы можем обратиться к регистру сведений ОсновныеДоговорыКонтрагента. Для этого удобнее всего использовать МенеджерЗаписи, который позволяет быстро обновить существующую запись или создать новую, если ее еще не было для данной пары «Организация + Контрагент».

Проанализируем программный код установки договора основным:


МенеджерЗаписи = РегистрыСведений.ОсновныеДоговорыКонтрагента.СоздатьМенеджерЗаписи();

// Устанавливаем ключевые поля (отборы)
МенеджерЗаписи.Организация = СсылкаНаОрганизацию;
МенеджерЗаписи.Контрагент = СсылкаНаКонтрагента;

// Читаем текущую запись из базы, если она есть
МенеджерЗаписи.Прочитать();

// Устанавливаем или перезаписываем ресурс
МенеджерЗаписи.Договор = СсылкаНаНовыйДоговор;

// Сохраняем изменения в базе данных
Попытка
    МенеджерЗаписи.Записать();
Исключение
    Сообщить("Не удалось установить основной договор: " + ОписаниеОшибки());
КонецПопытки;

Использование типовых механизмов (БСП)

В современных конфигурациях разработчики 1С часто предусматривают готовые экспортные процедуры в общих модулях. Это позволяет не писать работу с регистрами вручную, а использовать стандартные функции, которые гарантируют корректность данных и выполнение всех необходимых проверок.

Рекомендуется проверить наличие методов в общих модулях, таких как РаботаСДоговорамиКонтрагентов или ОбщегоНазначенияБП. Часто процедура называется УстановитьОсновнойДоговор. Вызов такой процедуры выглядит значительно короче и безопаснее:


// Пример использования типового метода (если он есть в вашей конфигурации)
ОбщегоНазначенияБП.УстановитьОсновнойДоговор(СсылкаНаНовыйДоговор, СсылкаНаОрганизацию);

Важные рекомендации при работе с основным договором

Рассмотрим несколько нюансов, которые помогут избежать ошибок в учете:

  1. Проверка на существующий договор: Перед тем как принудительно устанавливать новый договор основным, стоит проверить, нет ли у контрагента уже назначенного договора. Если вы выполняете автоматическую загрузку, возможно, стоит оставить старый основной договор без изменений, чтобы не нарушать логику пользователя.
  2. Соответствие видов договоров: При установке основного договора важно учитывать его ВидДоговора (С поставщиком, С покупателем и т.д.). В документах покупки система будет искать основной договор именно с видом «С поставщиком». Если вы назначите основным договор с видом «С покупателем», автоподстановка в документах поступления может не сработать.
  3. Права доступа: Работа с регистрами сведений требует соответствующих прав. Если ваш код выполняется в контексте пользователя с ограниченными правами, убедитесь, что у него есть право на запись в регистр ОсновныеДоговорыКонтрагента, иначе возникнет ошибка доступа при вызове метода Записать().

Резюме: Основной договор в современных решениях 1С — это не свойство самого договора, а связь между организацией и контрагентом, хранящаяся в специальном регистре. Используйте МенеджерЗаписи для управления этой связью, и всегда проверяйте, что сам объект договора успешно записан перед выполнением манипуляций с регистром.

← На главную