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