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