Как передать признак Освобожден от НДС и программно заполнить форму контрагента в УПП через COM-соединение

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

При интеграции различных систем на платформе 1С, например, при выгрузке данных из Альфа-Авто в 1С:Управление производственным предприятием (УПП) или 1С:Комплексная автоматизация (КА) 1.1, разработчики часто сталкиваются с различиями в архитектуре справочников. Рассмотрим подробнее, как решить проблему отсутствующих реквизитов и обойти ограничения программного заполнения экранных форм через COM-соединение.

Проблема 1: Отсутствие реквизита Освобожден от НДС в УПП

В конфигурации «Альфа-Авто» у контрагентов предусмотрен флаг ОсвобожденОтНДС. Проанализируем структуру УПП и КА: в этих типовых решениях прямого аналога данного реквизита в справочнике Контрагенты нет. Логика работы с НДС здесь строится иначе:

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

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

Проблема 2: Перезаполнение реквизитов при открытии формы

Часто при создании контрагента через COM-соединение разработчики используют метод ПолучитьФорму(), заполняют реквизиты формы и открывают её пользователю для дозаполнения. Выясним причину, по которой флаги Покупатель и Поставщик могут «сбрасываться» даже после их программной установки.

В типовых конфигурациях на обычных формах (УПП, КА) в процедуре ПриОткрытии() модуля формы справочника Контрагенты содержится код, который при создании нового объекта принудительно устанавливает значения этих флагов на основании настроек текущего пользователя:


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

Этот код выполняется после того, как вы присвоили значения реквизитам через COM, что приводит к их перезаписи.

Варианты решения проблемы заполнения через COM

Рассмотрим несколько способов гарантированного заполнения реквизитов Покупатель и Поставщик при интерактивном создании контрагента.

Способ 1: Временное изменение настроек пользователя

Перед открытием формы через COM-соединение можно программно изменить настройки пользователя в базе-приемнике (УПП). Для этого необходимо обратиться к регистру сведений НастройкиПользователей или изменить значения в Плане видов характеристик НастройкиПользователей для текущего сеанса. Это позволит процедуре ПриОткрытии() подхватить нужные вам значения флагов.

Способ 2: Предварительное создание объекта

Вместо заполнения формы нового объекта, сначала создадим сам объект в базе, запишем его, а затем откроем его форму для пользователя. В этом случае условие Если ЭтоНовый() не сработает, и ваши данные останутся неизменными. Разберем пример кода:


// Создаем объект контрагента напрямую, не через форму
НовыйКонтрагент = ОбъектCOM.Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = СсылкаАльфа.Наименование;
НовыйКонтрагент.ИНН = СсылкаАльфа.ИНН;
НовыйContragent.Покупатель = Истина;
НовыйContragent.Поставщик = Истина;

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

// Теперь получаем форму уже существующего (записанного) объекта
СсылкаНаОбъект = НовыйКонтрагент.Ссылка;
Форма = ОбъектCOM.Справочники.Контрагенты.ПолучитьФорму("ФормаЭлемента", СсылкаНаОбъект);
Форма.Открыть();

Способ 3: Использование параметров заполнения

Если версия платформы позволяет, можно использовать структуру ЗначенияЗаполнения. При получении формы нового объекта передайте структуру параметров, которая будет обработана в событии ОбработкаЗаполнения на стороне объекта. Однако стоит учитывать, что в старых версиях УПП на обычных формах логика ПриОткрытии всё равно может иметь приоритет над значениями, переданными при создании.

Особенности модального открытия через COM

Использование метода ОткрытьМодально() через COM-соединение требует осторожности. Проанализируем риски:

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

← На главную