Как программно создать договор контрагента в УТ 10.3 при переносе данных?

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

При автоматизации загрузки данных в конфигурацию «Управление торговлей 10.3», особенно при миграции из «Торговля и Склад 7.7», одной из самых частых задач является программное создание договоров контрагентов. Несмотря на кажущуюся простоту справочника ДоговорыКонтрагентов, он обладает рядом жестких проверок и обязательных реквизитов, без которых объект либо не запишется, либо не будет функционировать корректно в документах. Рассмотрим детально, как правильно инициализировать и заполнять этот объект программно.

Обязательные реквизиты для заполнения

Проанализируем структуру объекта СправочникОбъект.ДоговорыКонтрагентов. Для того чтобы система позволила записать договор и в дальнейшем использовать его в торговых операциях, необходимо заполнить следующий минимум полей:

  1. Владелец: ссылка на контрагента. Договор в УТ 10.3 является подчиненным справочником.
  2. Организация: в отличие от версии 7.7, в 10.3 договор жестко привязан к конкретному юридическому лицу вашей компании.
  3. Наименование: текстовое представление. Рекомендуется формировать его по шаблону, например: «Основной договор (руб.)».
  4. ВалютаВзаиморасчетов: ссылка на справочник Валюты. Помните, что после проведения первого документа по договору изменить валюту будет невозможно.
  5. ВидДоговора: значение перечисления ВидыДоговоровКонтрагентов (например, СПоставщиком, СПокупателем).
  6. ВедениеВзаиморасчетов: значение перечисления ВедениеВзаиморасчетовПоДоговорам. Это критически важное поле, определяющее детализацию расчетов (по договору в целом, по заказам или по счетам).

Посмотрим на пример базовой инициализации объекта:


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

Логика выбора вида договора и флаги контрагента

Разберем ситуацию, когда программа требует соответствия вида договора и настроек самого контрагента. В карточке контрагента в УТ 10.3 есть два важных флага: Покупатель и Поставщик. Если вы создаете договор с видом СПокупателем, а у контрагента не установлен флаг Покупатель, стандартная процедура записи может выдать ошибку или предупреждение.

Выясним причину: это необходимо для фильтрации договоров в формах выбора документов. Чтобы избежать конфликтов при программном создании, рекомендуется сначала актуализировать флаги в объекте контрагента:


КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
Если ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем Тогда
    КонтрагентОбъект.Покупатель = Истина;
ИначеЕсли ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПоставщиком Тогда
    КонтрагентОбъект.Поставщик = Истина;
КонецЕсли;
КонтрагентОбъект.Записать();

Как обойти стандартные проверки при записи

Если вы выполняете массовый перенос данных и хотите форсировать запись договора, игнорируя логику в процедурах ПередЗаписью или ПриЗаписи (например, если вы планируете заполнить связанные данные контрагента позже), используйте свойство ОбменДанными.Загрузка. Установка этого флага в значение Истина отключает большинство прикладных проверок конфигурации.


НовыйДоговор.ОбменДанными.Загрузка = Истина;
НовыйДоговор.Записать();

Особенности переноса из 1С:Торговля и Склад 7.7

Проанализируем ситуацию миграции из версии 7.7. В старой системе структура учета была гибче, но менее строгой. В 7.7 один договор мог использоваться одновременно и для закупок, и для продаж. В УТ 10.3 такая схема недопустима.

Рассмотрим решение для разделения договоров:
Если в 7.7 контрагент выступал и поставщиком, и покупателем по одному договору, в УТ 10.3 нам придется создать два отдельных договора. Чтобы определить правильный вид при переносе, не стоит полагаться только на папки в справочнике (хотя это самый простой путь). Более надежный способ — проанализировать обороты по регистрам взаиморасчетов в исходной базе 7.7. Если были движения по поставкам — создаем договор «С поставщиком», если по отгрузкам — «С покупателем». Для раздельной проверки сальдо по таким соглашениям подойдёт печатная форма акта сверки с группировкой по договорам.

Также обратите внимание на специфические виды договоров:

Назначение основного договора

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


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

Таким образом, программное создание договора требует не только заполнения полей самого объекта, но и синхронизации с данными владельца-контрагента. Использование свойства ОбменДанными.Загрузка поможет избежать лишних блокировок на этапе первоначального наполнения базы, но не отменяет необходимости корректного заполнения Вида договора для последующей работы пользователей. Для контроля движений и остатков по созданным договорам можно использовать отчет по взаиморасчетам с контрагентами на СКД.

← На главную