Загрузка данных
Отличный выбор. Это самый жизнеспособный и масштабируемый паттерн для реальных внедрений, который сохранит порядок в справочниках.
Как искусственный интеллект, я не могу физически сгенерировать для вас файл расширения .epf или .cf, но я подготовил готовую архитектуру метаданных и программный код (на внутреннем языке 1С). Вы можете передать этот концепт вашим разработчикам, они соберут интерфейс по этому каркасу за пару часов.
Архитектура состоит из трех шагов: создания регистра для памяти системы, перехвата неопознанных строк при загрузке и создания самой формы сопоставления.
1. Подготовка метаданных (Память системы)
В конфигурации Базы Б (или в Расширении) необходимо создать Регистр сведений:
Имя: СоответствиеНоменклатурыКонтрагентов
Режим записи: Независимый.
Измерения:
ИННКонтрагента (Строка, 12) — кто поставщик.
ИДНоменклатурыПоставщика (Строка, 36) — GUID товара из Базы А.
Ресурсы:
Номенклатура (СправочникСсылка.Номенклатура) — наш товар в Базе Б.
2. Логика поиска при загрузке XML/JSON (Серверный модуль)
Когда из Базы А приходит пакет с документом, код загрузки должен перед созданием новой номенклатуры проверять наш регистр.
Code snippet
// Функция вызывается при парсинге каждой строки товаров из входящего пакета Базы А
Функция ПолучитьИлиСопоставитьНоменклатуру(ИННПоставщика, ДанныеТовараБазыА) Экспорт
ИДПоставщика = ДанныеТовараБазыА.УИД;
// Шаг 1: Ищем в регистре сопоставлений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СоответствиеНоменклатуры.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.СоответствиеНоменклатурыКонтрагентов КАК СоответствиеНоменклатуры
|ГДЕ
| СоответствиеНоменклатуры.ИННКонтрагента = &ИННКонтрагента
| И СоответствиеНоменклатуры.ИДНоменклатурыПоставщика = &ИДПоставщика";
Запрос.УстановитьПараметр("ИННКонтрагента", ИННПоставщика);
Запрос.УстановитьПараметр("ИДПоставщика", ИДПоставщика);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Возврат Выборка.Номенклатура; // Товар найден в памяти, возвращаем его
КонецЕсли;
// Шаг 2: Если не нашли в регистре, пробуем найти по точному артикулу в справочнике
Если ЗначениеЗаполнено(ДанныеТовараБазыА.Артикул) Тогда
НоменклатураПоАртикулу = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ДанныеТовараБазыА.Артикул);
Если ЗначениеЗаполнено(НоменклатураПоАртикулу) Тогда
// Нашли по артикулу! Сразу записываем в регистр, чтобы в следующий раз не искать
ЗаписатьСоответствиеВРегистр(ИННПоставщика, ИДПоставщика, НоменклатураПоАртикулу);
Возврат НоменклатураПоАртикулу;
КонецЕсли;
КонецЕсли;
// Шаг 3: Товар не распознан. Возвращаем Пустую ссылку.
// Документ запишется с пустыми строками номенклатуры и не проведется.
Возврат Справочники.Номенклатура.ПустаяСсылка();
КонецФункции
Процедура ЗаписатьСоответствиеВРегистр(ИННКонтрагента, ИДПоставщика, НоменклатураБазыБ) Экспорт
МенеджерЗаписи = РегистрыСведений.СоответствиеНоменклатурыКонтрагентов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИННКонтрагента = ИННКонтрагента;
МенеджерЗаписи.ИДНоменклатурыПоставщика = ИДПоставщика;
МенеджерЗаписи.Номенклатура = НоменклатураБазыБ;
МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
3. Рабочее место сопоставления (Модуль формы обработки)
Программисты создают форму (Обработку), на которую выводится Таблица Значений (ТЗ). Назовем ее НераспознанныеТовары.
Колонки ТЗ: ИННКонтрагента, ИДПоставщика, НаименованиеПоставщика (только для чтения), НоменклатураБазыБ (поле ввода, где бухгалтер выбирает товар).
По кнопке «Сохранить соответствия и провести документы» отрабатывает следующий код:
Code snippet
&НаКлиенте
Процедура СохранитьИПровести(Команда)
// Проверяем, что бухгалтер заполнил все пустые ячейки
Для Каждого СтрокаТЗ Из Объект.НераспознанныеТовары Цикл
Если Не ЗначениеЗаполнено(СтрокаТЗ.НоменклатураБазыБ) Тогда
Сообщить("Заполните соответствие для товара: " + СтрокаТЗ.НаименованиеПоставщика);
Возврат;
КонецЕсли;
КонецЦикла;
// Передаем на сервер для записи в регистр и перезаполнения документов
ЗаписатьСоответствияНаСервере();
Сообщить("Соответствия успешно сохранены! Документы обновлены.");
Объект.НераспознанныеТовары.Очистить();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьСоответствияНаСервере()
Для Каждого СтрокаТЗ Из Объект.НераспознанныеТовары Цикл
// 1. Записываем связь в регистр (теперь система "запомнила" этот товар)
МенеджерЗаписи = РегистрыСведений.СоответствиеНоменклатурыКонтрагентов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ИННКонтрагента = СтрокаТЗ.ИННКонтрагента;
МенеджерЗаписи.ИДНоменклатурыПоставщика = СтрокаТЗ.ИДПоставщика;
МенеджерЗаписи.Номенклатура = СтрокаТЗ.НоменклатураБазыБ;
МенеджерЗаписи.Записать(Истина);
// 2. Здесь же можно написать код, который найдет непроведенный документ Поступления,
// подставит в него выбранную СтрокаТЗ.НоменклатураБазыБ и попытается его провести.
// ОбновитьДокументПоступления(СтрокаТЗ);
КонецЦикла;
КонецПроцедуры
Рекомендация по интерфейсу: В таблице НераспознанныеТовары обязательно сделайте для бухгалтера кнопку «Создать номенклатуру по данным поставщика». Если товара действительно нет в Базе Б, бухгалтер нажимает эту кнопку, система программно создает новую карточку товара в справочнике, переносит туда наименование и артикул из Базы А, и сразу подставляет созданную ссылку в колонку НоменклатураБазыБ. Это сильно сэкономит время пользователям.