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