Как настроить выбор и сопоставление номенклатуры из закрытой базы 1С:Розница в 1С:Управление торговлей без доработки конфигурации?

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

При интеграции систем часто возникает ситуация, когда базу-источник данных нельзя дорабатывать: конфигурация находится на поддержке, либо информационная база представляет собой подчиненный узел распределенной информационной базы (РИБ) сторонней торговой сети. Если каталог номенклатуры содержит сотни тысяч позиций, классическая периодическая выгрузка через универсальный обмен в формате XML занимает часы, что блокирует оперативную работу менеджеров по оформлению приходных документов.

Разберем, как организовать интерактивный поиск и перенос нужных позиций из «1С:Розница 2» в «1С:Управление торговлей 10.3» напрямую по запросу пользователя, а также рассмотрим технические нюансы оптимизации такого обмена.

Архитектурные ограничения подчиненного узла РИБ

Прежде чем приступать к коду, проанализируем ограничения целевой базы «1С:Розница 2»:

  1. Запрет изменений в конфигураторе: Нельзя добавить новые планы обмена, веб-сервисы или изменить модули объектов.
  2. Блокировка создания узлов РИБ: Платформа 1С в подчиненном узле распределенной базы блокирует ручное и программное добавление новых узлов для основного плана обмена.
  3. Регистрация изменений: Любые данные, которые мы программно запишем в подчиненный узел «Розницы» (например, документ ПоступлениеТоваров), автоматически зарегистрируются на узел обмена с центральной базой и уедут в главную систему сети при штатной синхронизации. Это накладывает строгие требования к корректности заполнения реквизитов.

Способ 1. Динамический подбор через COM-соединение с фильтрацией на лету

Вместо тяжелой фоновой выгрузки всего каталога реализуем в «1С:Управление торговлей 10.3» форму подбора или поле ввода с поиском. Запрос к базе «Розницы» выполняется только тогда, когда пользователь вводит фрагмент наименования или артикул (не менее 3–4 символов).

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

Рассмотрим пример кода внешней обработки или модуля формы в УТ 10.3, выполняющий безопасный поиск с ограничением выборки:


Функция НайтиНоменклатуруВРознице(СтрокаПоиска, ПараметрыПодключения) Экспорт
    
    Результат = Новый Массив;
    
    Попытка
        COMСоединитель = Новый COMОбъект("V83.COMConnector");
        СтрокаСоединения = "Srvr=""" + ПараметрыПодключения.Сервер + """;" +
                           "Ref=""" + ПараметрыПодключения.База + """;" +
                           "Usr=""" + ПараметрыПодключения.Пользователь + """;" +
                           "Pwd=""" + ПараметрыПодключения.Пароль + """;";
        ВнешнееПодключение = COMСоединитель.Connect(СтрокаСоединения);
    Исключение
        Сообщить("Не удалось подключиться к базе Розницы: " + ОписаниеОшибки());
        Возврат Результат;
    КонецПопытки;
    
    Запрос = ВнешнееПодключение.NewObject("Запрос");
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 20
        |	Номенклатура.Ссылка КАК Ссылка,
        |	Номенклатура.Наименование КАК Наименование,
        |	Номенклатура.Артикул КАК Артикул,
        |	Номенклатура.ЕдиницаИзмерения.Наименование КАК БазоваяЕдиница
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |	НЕ Номенклатура.ЭтоГруппа
        |	И (Номенклатура.Наименование ПОДОБНО &ТекстПоиска
        |		ИЛИ Номенклатура.Артикул ПОДОБНО &ТекстПоиска)
        |УПОРЯДОЧИТЬ ПО
        |	Номенклатура.Наименование";
    
    Запрос.УстановитьПараметр("ТекстПоиска", "%" + СтрокаПоиска + "%");
    ТЗ = Запрос.Выполнить().Выгрузить();
    
    // Преобразуем COM-таблицу значений в массив локальных структур УТ
    Для Каждого СтрCOM Из ТЗ Цикл
        СтрокаДанных = Новый Структура;
        СтрокаДанных.Вставить("GUID", Строка(ВнешнееПодключение.String(СтрCOM.Ссылка.УникальныйИдентификатор())));
        СтрокаДанных.Вставить("Наименование", Строка(СтрCOM.Наименование));
        СтрокаДанных.Вставить("Артикул", Строка(СтрCOM.Артикул));
        СтрокаДанных.Вставить("Единица", Строка(СтрCOM.БазоваяЕдиница));
        Результат.Добавить(СтрокаДанных);
    КонецЦикла;
    
    ВнешнееПодключение = Неопределено;
    COMСоединитель = Неопределено;
    
    Возврат Результат;
КонецФункции

Пользователю выводится список из найденных 15–20 позиций. При выборе строки УТ получает строковый УникальныйИдентификатор (GUID). Если сопоставление еще не создано, в УТ создается элемент номенклатуры и записывается в локальный регистр соответствий.

Способ 2. Получение данных по известному GUID без перебора

Когда соответствие между базами зафиксировано (в УТ сохранен строковый GUID элемента «Розницы»), повторный поиск по наименованию не требуется. Чтобы мгновенно получить актуальную ссылку объекта в «Рознице» через COM для записи документа, используем следующий подход:


GUIDОбъекта = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаВРознице = ВнешнееПодключение.Справочники.Номенклатура.ПолучитьСсылку(GUIDОбъекта);

Метод ПолучитьСсылку() не делает запроса к базе данных и отрабатывает моментально, что критически важно при формировании табличной части документа поступления с десятками строк.

Способ 3. Отслеживание новых позиций через регистры «Розницы» без ее доработки

Если требуется регламентно обновлять только измененную номенклатуру, а не искать позиции вручную, выясним, как определить свежие элементы без добавления планов обмена:

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

Технические нюансы и рекомендации при работе через COM

Разберем неочевидные проблемы, с которыми сталкиваются разработчики при интеграции УТ 10.3 и Розницы:

  1. Разрядность компонентов (x86 vs x64): Если клиентская или серверная часть УТ 10.3 работает на 64-битной платформе, а коннектор зарегистрирован как 32-битный (или наоборот), возникнет ошибка инициализации COM-объекта. В среде Windows для согласования разрядностей настраивается суррогатное приложение COM+ (через утилиту dcomcnfg), запускающее библиотеку comcntr.dll в отдельном процессе dllhost.exe.
  2. Расход клиентских лицензий: Каждое новое COM-соединение открывает полноценный пользовательский сеанс в подключаемой базе и занимает клиентскую лицензию 1С. Не открывайте COM-соединение на каждое нажатие клавиши. Оптимально либо выгружать запросы пакетно, либо держать открытое соединение в переменной модуля на время работы формы подбора, закрывая его при выходе (ВнешнееПодключение = Неопределено).
  3. Альтернатива без COM — стандартный интерфейс OData: Если прямое COM-подключение невозможно из-за сетевой инфраструктуры или политик безопасности, можно использовать встроенный REST API платформы (OData). База «Розницы» публикуется на веб-сервере, а состав открытых метаданных настраивается программно без конфигуратора через вызов СтандартныйИнтерфейсOData.УстановитьСостав() во внешней обработке. В таком случае УТ 10.3 сможет выполнять HTTP-запросы с серверной фильтрацией $filter и пейджингом $top, получая готовый компактный ответ в формате JSON.
← На главную