Загрузка данных


Отличный выбор. Это самый жизнеспособный и масштабируемый паттерн для реальных внедрений, который сохранит порядок в справочниках.

Как искусственный интеллект, я не могу физически сгенерировать для вас файл расширения .epf или .cf, но я подготовил готовую архитектуру метаданных и программный код (на внутреннем языке 1С). Вы можете передать этот концепт вашим разработчикам, они соберут интерфейс по этому каркасу за пару часов.

Архитектура состоит из трех шагов: создания регистра для памяти системы, перехвата неопознанных строк при загрузке и создания самой формы сопоставления.

1. Подготовка метаданных (Память системы)
В конфигурации Базы Б (или в Расширении) необходимо создать Регистр сведений:

Имя: СоответствиеНоменклатурыКонтрагентов

Режим записи: Независимый.

Измерения:

ИННКонтрагента (Строка, 12) — кто поставщик.

ИДНоменклатурыПоставщика (Строка, 36) — GUID товара из Базы А.

Ресурсы:

Номенклатура (СправочникСсылка.Номенклатура) — наш товар в Базе Б.

2. Логика поиска при загрузке XML/JSON (Серверный модуль)
Когда из Базы А приходит пакет с документом, код загрузки должен перед созданием новой номенклатуры проверять наш регистр.

Code snippet
// Функция вызывается при парсинге каждой строки товаров из входящего пакета Базы А
Функция ПолучитьИлиСопоставитьНоменклатуру(ИННПоставщика, ДанныеТовараБазыА) Экспорт
    
    ИДПоставщика = ДанныеТовараБазыА.УИД;
    
    // Шаг 1: Ищем в регистре сопоставлений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СоответствиеНоменклатуры.Номенклатура КАК Номенклатура
        |ИЗ
        |   РегистрСведений.СоответствиеНоменклатурыКонтрагентов КАК СоответствиеНоменклатуры
        |ГДЕ
        |   СоответствиеНоменклатуры.ИННКонтрагента = &ИННКонтрагента
        |   И СоответствиеНоменклатуры.ИДНоменклатурыПоставщика = &ИДПоставщика";
        
    Запрос.УстановитьПараметр("ИННКонтрагента", ИННПоставщика);
    Запрос.УстановитьПараметр("ИДПоставщика", ИДПоставщика);
    
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Номенклатура; // Товар найден в памяти, возвращаем его
    КонецЕсли;
    
    // Шаг 2: Если не нашли в регистре, пробуем найти по точному артикулу в справочнике
    Если ЗначениеЗаполнено(ДанныеТовараБазыА.Артикул) Тогда
        НоменклатураПоАртикулу = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ДанныеТовараБазыА.Артикул);
        Если ЗначениеЗаполнено(НоменклатураПоАртикулу) Тогда
            // Нашли по артикулу! Сразу записываем в регистр, чтобы в следующий раз не искать
            ЗаписатьСоответствиеВРегистр(ИННПоставщика, ИДПоставщика, НоменклатураПоАртикулу);
            Возврат НоменклатураПоАртикулу;
        КонецЕсли;
    КонецЕсли;
    
    // Шаг 3: Товар не распознан. Возвращаем Пустую ссылку.
    // Документ запишется с пустыми строками номенклатуры и не проведется.
    Возврат Справочники.Номенклатура.ПустаяСсылка();
    
КонецФункции

Процедура ЗаписатьСоответствиеВРегистр(ИННКонтрагента, ИДПоставщика, НоменклатураБазыБ) Экспорт
    МенеджерЗаписи = РегистрыСведений.СоответствиеНоменклатурыКонтрагентов.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.ИННКонтрагента = ИННКонтрагента;
    МенеджерЗаписи.ИДНоменклатурыПоставщика = ИДПоставщика;
    МенеджерЗаписи.Номенклатура = НоменклатураБазыБ;
    МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
3. Рабочее место сопоставления (Модуль формы обработки)
Программисты создают форму (Обработку), на которую выводится Таблица Значений (ТЗ). Назовем ее НераспознанныеТовары.
Колонки ТЗ: ИННКонтрагента, ИДПоставщика, НаименованиеПоставщика (только для чтения), НоменклатураБазыБ (поле ввода, где бухгалтер выбирает товар).

По кнопке «Сохранить соответствия и провести документы» отрабатывает следующий код:

Code snippet
&НаКлиенте
Процедура СохранитьИПровести(Команда)
    
    // Проверяем, что бухгалтер заполнил все пустые ячейки
    Для Каждого СтрокаТЗ Из Объект.НераспознанныеТовары Цикл
        Если Не ЗначениеЗаполнено(СтрокаТЗ.НоменклатураБазыБ) Тогда
            Сообщить("Заполните соответствие для товара: " + СтрокаТЗ.НаименованиеПоставщика);
            Возврат;
        КонецЕсли;
    КонецЦикла;
    
    // Передаем на сервер для записи в регистр и перезаполнения документов
    ЗаписатьСоответствияНаСервере();
    
    Сообщить("Соответствия успешно сохранены! Документы обновлены.");
    Объект.НераспознанныеТовары.Очистить();
    
КонецПроцедуры

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