Почему при переносе номенклатуры через COM-соединение не заполняются вид номенклатуры и признак услуги?

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

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

Разберем детально, почему возникает подобное поведение платформы 1С:Предприятие, какие тонкости контекста COM-соединения необходимо учитывать и как правильно программно переносить номенклатуру.

Причины некорректного заполнения реквизитов

Выясним главные факторы, приводящие к ошибкам при программном создании элементов справочника:

  1. Разделение логики формы и логики объекта. В конфигурациях на управляемых формах (включая «1С:Бухгалтерия предприятия 3.0») синхронизация зависимых реквизитов (например, установка признака Услуга при выборе определенного вида номенклатуры) реализована в клиентских обработчиках событий формы (ПриИзменении). При создании объекта через COM-соединение код формы не исполняется, а срабатывают только события модуля объекта и модуля менеджера. Поэтому автоматического заполнения связанных полей не происходит.
  2. Несоответствие контекстов баз данных. Нельзя напрямую присвоить ссылку на справочник из базы-источника в реквизит объекта базы-приемника. Ссылка на ВидНоменклатуры должна быть найдена или создана строго в контексте COM-соединения целевой базы. Если передать чужую ссылку или значение не того типа, реквизит останется пустым или получит значение Неопределено.
  3. Сложная структура реквизитов в конфигурациях. В БП 3.0 за тип сущности отвечают одновременно несколько реквизитов: реквизит Услуга (булево) непосредственно в справочнике Номенклатура, ссылка на справочник ВидыНоменклатуры, а также реквизит ТипНоменклатуры внутри самого вида номенклатуры. Все эти поля должны быть согласованы между собой.

Пошаговое решение: правильное заполнение реквизитов через COM

Рассмотрим правильный алгоритм переноса номенклатуры из конфигурации «Управление торговлей 11» в «Бухгалтерию предприятия 3.0» через COM-соединение.

  1. Подключение и получение контекста базы-приемника. Инициализируем COM-коннектор и устанавливаем соединение с базой БП 3.0.
  2. Поиск или создание вида номенклатуры в базе-приемнике. Ищем элемент справочника ВидыНоменклатуры в целевой базе по наименованию или уникальному идентификатору (GUID).
  3. Явное заполнение всех зависимых реквизитов. Напрямую присваиваем значения реквизитам ВидНоменклатуры и Услуга у создаваемого объекта номенклатуры в приемнике.
  4. Запись объекта. Вызываем метод Записать().

Посмотрим на пример программного кода в базе-источнике (УТ 11):


// Устанавливаем COM-соединение с базой БП
V8Коннектор = Новый COMОбъект("V83.COMConnector");
БазаБП = V8Коннектор.Connect("Srvr=""Server1C"";Ref=""buh_db"";Usr=""Admin"";Pwd=""Password"";");

// Получаем данные номенклатуры из текущей базы (УТ)
ВыборкаУТ = Справочники.Номенклатура.Выбрать();

Пока ВыборкаУТ.Следующий() Цикл
    
    // Пропускаем группы
    Если ВыборкаУТ.ЭтоГруппа Тогда
        Продолжить;
    КонецЕсли;
    
    // Создаем или находим номенклатуру в БП
    НомБПСсылка = БазаБП.Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаУТ.Наименование);
    
    Если НомБПСсылка.Пустая() Тогда
        НомБПОбъект = БазаБП.Справочники.Номенклатура.СоздатьЭлемент();
        НомБПОбъект.Наименование = ВыборкаУТ.Наименование;
        НомБПОбъект.НаименованиеПолное = ВыборкаУТ.НаименованиеПолное;
    Иначе
        НомБПОбъект = НомБПСсылка.ПолучитьОбъект();
    КонецЕсли;
    
    // Ищем соответствующий вид номенклатуры строго в контексте БП
    НаименованиеВида = ВыборкаУТ.ВидНоменклатуры.Наименование;
    ВидНомБП = БазаБП.Справочники.ВидыНоменклатуры.НайтиПоНаименованию(НаименованиеВида);
    
    Если Не ВидНомБП.Пустая() Тогда
        НомБПОбъект.ВидНоменклатуры = ВидНомБП;
    КонецЕсли;
    
    // Явно определяем и проставляем признак услуги в базе-приемнике
    Если ВыборкаУТ.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга Тогда
        НомБПОбъект.Услуга = Истина;
    Иначе
        НомБПОбъект.Услуга = Ложь;
    КонецЕсли;
    
    // Записываем подготовленный объект
    НомБПОбъект.Записать();

КонецЦикла;

Поиск различий через консоль запросов

Проанализируем ситуацию, если после переноса поведение элемента все еще вызывает сомнения. В этом случае полезно воспользоваться консолью запросов в базе-приемнике:

  1. Создаем один эталонный элемент номенклатуры вручную через пользовательский интерфейс 1С:Бухгалтерии.
  2. Создаем второй элемент программно через COM-скрипт.
  3. В консоли запросов выбираем все поля обоих элементов из таблицы Справочник.Номенклатура и детально сравниваем их значения.
  4. Обращаем внимание на скрытые реквизиты, такие как ЕдиницаИзмерения, СтавкаНДС, НоменклатурнаяГруппа и признак Услуга.

Альтернативные способы обмена данными

Работа через прямой COM-коннектор накладывает технические ограничения: требование к совпадению разрядности процессов (32/64 бит) и точной версии платформы. Если перенос номенклатуры требуется выполнять регулярно, рекомендуем рассмотреть альтернативные архитектурные подходы:

  1. Типовая синхронизация данных (EnterpriseData). Встроенные механизмы БСП между УТ 11 и БП 3.0 автоматически обрабатывают сопоставление типов номенклатуры, видов и счетов учета без риска пропустить скрытые реквизиты.
  2. Конвертация данных (КД 2 / КД 3). Настройка правил конвертации объектов позволяет централизованно управлять логикой сопоставления реквизитов.
  3. HTTP-сервисы или REST API (OData). Использование веб-сервисов делает обмен кроссплатформенным и независимым от окружения COM.
← На главную