При интеграции систем часто возникает ситуация, когда базу-источник данных нельзя дорабатывать: конфигурация находится на поддержке, либо информационная база представляет собой подчиненный узел распределенной информационной базы (РИБ) сторонней торговой сети. Если каталог номенклатуры содержит сотни тысяч позиций, классическая периодическая выгрузка через универсальный обмен в формате XML занимает часы, что блокирует оперативную работу менеджеров по оформлению приходных документов.
Разберем, как организовать интерактивный поиск и перенос нужных позиций из «1С:Розница 2» в «1С:Управление торговлей 10.3» напрямую по запросу пользователя, а также рассмотрим технические нюансы оптимизации такого обмена.
Прежде чем приступать к коду, проанализируем ограничения целевой базы «1С:Розница 2»:
ПоступлениеТоваров), автоматически зарегистрируются на узел обмена с центральной базой и уедут в главную систему сети при штатной синхронизации. Это накладывает строгие требования к корректности заполнения реквизитов.Вместо тяжелой фоновой выгрузки всего каталога реализуем в «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). Если сопоставление еще не создано, в УТ создается элемент номенклатуры и записывается в локальный регистр соответствий.
Когда соответствие между базами зафиксировано (в УТ сохранен строковый GUID элемента «Розницы»), повторный поиск по наименованию не требуется. Чтобы мгновенно получить актуальную ссылку объекта в «Рознице» через COM для записи документа, используем следующий подход:
GUIDОбъекта = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаВРознице = ВнешнееПодключение.Справочники.Номенклатура.ПолучитьСсылку(GUIDОбъекта);
Метод ПолучитьСсылку() не делает запроса к базе данных и отрабатывает моментально, что критически важно при формировании табличной части документа поступления с десятками строк.
Если требуется регламентно обновлять только измененную номенклатуру, а не искать позиции вручную, выясним, как определить свежие элементы без добавления планов обмена:
ВерсииОбъектов. Внешней системе через COM или регламентное задание достаточно выбирать записи регистра с датой больше даты предыдущего сеанса синхронизации.ПланыОбмена.ВыбратьИзменения() для существующего узла РИБ, прочитать идентификаторы измененной номенклатуры, не вызывая метод УдалитьРегистрациюИзменений(), чтобы не нарушить штатный обмен торговой точки с центром сети.Разберем неочевидные проблемы, с которыми сталкиваются разработчики при интеграции УТ 10.3 и Розницы:
dcomcnfg), запускающее библиотеку comcntr.dll в отдельном процессе dllhost.exe.ВнешнееПодключение = Неопределено).СтандартныйИнтерфейсOData.УстановитьСостав() во внешней обработке. В таком случае УТ 10.3 сможет выполнять HTTP-запросы с серверной фильтрацией $filter и пейджингом $top, получая готовый компактный ответ в формате JSON.