Как реализовать выборочный перенос документов между базами 1С без использования штатных обменов?

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

Зачастую перед разработчиками встает задача переноса определенных документов (например, Чек ККМ) из одной базы 1С в другую (например, Бухгалтерия 3.0) без настройки сложных правил конвертации. Рассмотрим, как создать гибкую и наглядную систему выгрузки с использованием формата JSON.

Реализация выгрузки данных через сериализацию в JSON

Для начала разберем, как подготовить данные документа. Мы будем использовать СериализаторXDTO, который позволяет удобно преобразовывать объекты 1С в структуру JSON. Это решение обеспечивает высокую скорость и простоту чтения файлов на стороне приемника.

Рассмотрим код для формирования массива данных из табличной части документа:


Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл(ПутьКФайлу);
Данные = Новый Массив;

Для каждого стр Из ТаблицаДокументовВыгрузка Цикл
    ДанныеДокумента = Новый Массив;
    ЧекККМ = стр.СсылкаНаДокумент;

    Для каждого СтрокаТабличнойЧасти Из ЧекККМ.Товары Цикл
        СтрокаДокумента = Новый Структура("Номенклатура, Количество, Цена, Сумма, НоменклатураМетаданные");
        ЗаполнитьЗначенияСвойств(СтрокаДокумента, СтрокаТабличнойЧасти);
        
        // Получаем метаданные для последующей обработки ссылочных типов
        МетаданныеЗначения = СтрокаТабличнойЧасти.Номенклатура.Метаданные();
        ЗначениеСтруктурой = Новый Структура;
        Значение = СтрокаТабличнойЧасти.Номенклатура;

        Для каждого Реквизит Из МетаданныеЗначения.Реквизиты Цикл
            Если ЗначениеЗаполнено(Значение[Реквизит.Имя]) Тогда
                ЗначениеСтруктурой.Вставить(Реквизит.Имя, Значение[Реквизит.Имя]);
            КонецЕсли;
        КонецЦикла;
        
        СтрокаДокумента.НоменклатураМетаданные = ЗначениеСтруктурой;
        ДанныеДокумента.Добавить(СтрокаДокумента);
    КонецЦикла;

    Если ДанныеДокумента.Количество() > 0 Тогда
        Данные.Добавить(ДанныеДокумента);
    КонецЕсли;
КонецЦикла;

СериализаторXDTO.ЗаписатьJSON(Запись, Данные);
Запись.Закрыть();

Проверка ссылочной целостности в базе-приемнике

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


// Проверяет физическое наличие записи в информационной базе
Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт
    ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ [ИмяТаблицы] ГДЕ Ссылка = &Ссылка";
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицыПоСсылке(ЛюбаяСсылка));
    
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка);
    Возврат НЕ Запрос.Выполнить().Пустой();
КонецФункции

// Возвращает полное имя объекта метаданных
Функция ИмяТаблицыПоСсылке(Ссылка) Экспорт
    Возврат Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).ПолноеИмя();
КонецФункции

Рекомендации по развитию системы

  1. Создание объектов при отсутствии ссылок: Если при десериализации вы обнаружили, что объект не найден, используйте данные из НоменклатураМетаданные, которые мы упаковали в JSON. Вы можете программно создать новый элемент справочника, используя метод СоздатьЭлемент().
  2. Рекурсивная обработка: Помните, что если у создаваемого объекта (например, Номенклатура) есть свои ссылочные реквизиты (Вид номенклатуры, Единица измерения), их также потребуется проверять или создавать, двигаясь вглубь структуры.
  3. Интерфейс: Для обеспечения «наглядности», о которой просил клиент, реализуйте обработку с табличной частью на форме. Добавьте колонку Пометка (булево) и статусы выгрузки, чтобы пользователь мог самостоятельно выбирать нужные документы перед нажатием кнопки Выгрузить.
  4. Масштабируемость: Если объем обменов будет расти, рассмотрите возможность использования Конвертации данных 3.0. Она позволит управлять соответствиями реквизитов через правила, а не через жестко закодированные структуры, что упростит поддержку системы при изменении конфигураций.

Используя этот подход, вы создадите надежный и понятный инструмент, который позволит гибко переносить документы между любыми базами данных, сохраняя контроль над процессом на каждом этапе.

← На главную