Как настроить обмен дополнительными реквизитами между 1С:Бухгалтерией и 1С:Управлением торговлей через Конвертацию данных 2.1?

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

При работе с двумя базами 1С, такими как 1С:Бухгалтерия (БП) и 1С:Управление торговлей (УТ), часто возникает необходимость обмениваться не только стандартными данными, но и дополнительными реквизитами, которые были созданы пользователями в режиме "Предприятие" — для этой задачи есть перенос дополнительных реквизитов номенклатуры в 1С. Рассмотрим, как настроить такой обмен для справочника Номенклатура с помощью инструмента "Конвертация данных 2.1" (КД 2.1), чтобы значения нового дополнительного реквизита, например, "ЗаводИзготовитель", корректно попадали из основной базы (БП) в подчиненную (УТ).

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

Шаг 1: Подготовка среды "Конвертации данных 2.1"

  1. Установите "Конвертацию данных 2.1": Если у вас еще не установлена конфигурация "Конвертация данных", загрузите актуальную версию (например, 2.1.8.2) с официального сайта releases.1c.ru и установите ее как новую информационную базу. Для этой задачи также подойдёт готовый инструмент автоматизации обмена данными в 1С.

  2. Выгрузите описания структуры метаданных из обеих баз:

    Из каждой вашей рабочей базы (Бухгалтерия и Управление торговлей) необходимо выгрузить описание структуры метаданных. Для этого:

    1. Запустите базу 1С в режиме "Конфигуратор".
    2. Откройте конфигурацию (Меню "Конфигурация" -> "Открыть конфигурацию").
    3. В меню "Конфигурация" выберите "Сохранить конфигурацию в файл..." и сохраните ее в формате XML. Повторите эту операцию для обеих баз.

    Эти файлы содержат всю информацию о структуре объектов, реквизитов и табличных частей ваших конфигураций.

  3. Загрузите описания метаданных в "Конвертацию данных 2.1":

    В открытой конфигурации "Конвертация данных 2.1":

    1. Перейдите на вкладку "Конфигурации".
    2. Создайте два новых элемента: один для "Бухгалтерии" (источник) и один для "Управления торговлей" (приемник).
    3. Для каждого элемента загрузите соответствующий XML-файл с описанием метаданных, который вы выгрузили на предыдущем шаге. Это позволит КД 2.1 "увидеть" все объекты, реквизиты и табличные части ваших баз.
  4. Загрузите правила обмена:

    В "Конвертацию данных 2.1" из архива с правилами обмена необходимо загрузить файл ExchangeRules.xml (можно взять готовые правила обмена УТ 11.5 - БП 3.0 — здесь помогут правила обмена БП 3.0 - УТ 11.5). Этот файл содержит основные правила конвертации объектов и свойств.

    Для этого в "Конвертации данных" перейдите на вкладку "Правила обмена", создайте новый элемент или откройте существующие правила (например, правила переноса из УПП 1.3 в БП 3.0) и выполните команду "Загрузить правила" или "Загрузить из файла" — для переноса также можно использовать правила переноса БП 3.0 - УТ 11.

Шаг 2: Доработка Правил Конвертации Объектов (ПКО) для Номенклатуры

Поскольку мы обмениваем дополнительным реквизитом справочника Номенклатура, нам потребуется доработать соответствующее Правило Конвертации Объектов (ПКО) для Справочник.Номенклатура.

Принцип работы с дополнительными реквизитами

Дополнительные реквизиты в 1С хранятся не как обычные реквизиты объекта, а в специальных регистрах сведений (например, ДополнительныеРеквизитыИСведения). Для работы с ними в коде используются специализированные менеджеры и функции. Наша задача — в базе-источнике (БП) получить значение дополнительного реквизита и передать его в структуру данных для обмена, а в базе-приемнике (УТ) извлечь это значение и записать его в соответствующий дополнительный реквизит.

Подраздел 2.1: На стороне источника (1С:Бухгалтерия) - Выгрузка данных

Откроем ПКО для Справочник.Номенклатура. Найдем обработчик события "При выгрузке" или "Перед выгрузкой". В этом обработчике мы должны получить значение нашего дополнительного реквизита "ЗаводИзготовитель" и добавить его в коллекцию исходящих данных.

Мы будем использовать объект ОбъектКоллекцииСвойств, который содержит данные выгружаемого элемента номенклатуры, и структуру ПараметрыОбъекта для передачи дополнительных данных между базами. Создадим в ПараметрыОбъекта новый массив для хранения всех необходимых нам дополнительных реквизитов.

Рассмотрим пример кода для обработчика "ПриВыгрузке" в ПКО Номенклатуры:


// Пример кода для обработчика "ПриВыгрузке" в ПКО Номенклатуры (источник - 1С:Бухгалтерия)
// ОбъектКоллекцииСвойств - это выгружаемый объект (элемент справочника Номенклатура)
// ПараметрыОбъекта - структура для передачи дополнительных данных

// Инициализируем массив для дополнительных реквизитов в ПараметрахОбъекта, если он еще не создан
Если ПараметрыОбъекта.ДополнительныеРеквизиты = Неопределено Тогда
    ПараметрыОбъекта.ДополнительныеРеквизиты = Новый Массив;
КонецЕсли;

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

// Проверяем наличие менеджера свойств
Если МенеджерСвойств = Неопределено Тогда
    Возврат; // Не удалось получить менеджер свойств, пропускаем обработку
КонецЕсли;

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

        // Если значение найдено, добавляем его в структуру для передачи
        Если ЗначениеСвойства <> Неопределено Тогда
            СтруктураСвойства = Новый Структура;
            СтруктураСвойства.Вставить("Имя", Свойство.Имя); // Важно: здесь Имя - это имя доп. реквизита, а не "Значение"
            СтруктураСвойства.Вставить("Значение", ЗначениеСвойства);
            ПараметрыОбъекта.ДополнительныеРеквизиты.Добавить(СтруктураСвойства);
        КонецЕсли;
        Прервать; // Если нам нужен только один реквизит, можно выйти из цикла после его обработки
    КонецЕсли;
КонецЦикла;

Обратите внимание: В этом коде мы используем ДополнительныеСведенияИФункции.МенеджерДополнительныхРеквизитов как пример, который может быть адаптирован под вашу конкретную конфигурацию. В более старых версиях или других конфигурациях методы получения дополнительных реквизитов могут отличаться. Вам может потребоваться использовать прямые запросы к регистру сведений или другие стандартные функции 1С для работы с дополнительными реквизитами.

Важный момент из обсуждения: На форуме была замечена ошибка, когда выгружалось значение с Имя="Значение" вместо реального имени дополнительного реквизита. Убедитесь, что в структуре, которую вы добавляете в ПараметрыОбъекта.ДополнительныеРеквизиты, поле, которое идентифицирует реквизит, называется, например, Имя и содержит именно "ЗаводИзготовитель".

Подраздел 2.2: На стороне приемника (1С:Управление Торговлей) - Загрузка данных

Теперь нам нужно настроить прием данных в УТ. Откроем ПКО для Справочник.Номенклатура в "Конвертации данных". Найдем обработчик события "После загрузки" или "Перед записью". В этом обработчике мы извлечем переданные данные из ПараметрыОбъекта и запишем их в соответствующий дополнительный реквизит элемента номенклатуры в базе-приемнике.

Рассмотрим пример кода для обработчика "ПослеЗагрузки" в ПКО Номенклатуры:


// Пример кода для обработчика "ПослеЗагрузки" в ПКО Номенклатуры (приемник - 1С:Управление Торговлей)
// Объект - это загруженный или найденный элемент Номенклатуры в базе-приемнике
// ПараметрыОбъекта - структура, переданная из источника

// Проверяем, были ли переданы дополнительные реквизиты
Если ПараметрыОбъекта.ДополнительныеРеквизиты <> Неопределено Тогда
    Для Каждого СтруктураСвойства Из ПараметрыОбъекта.ДополнительныеРеквизиты Цикл
        ИмяСвойства = СтруктураСвойства.Имя;
        ЗначениеСвойства = СтруктураСвойства.Значение;

        Попытка
            // Получаем менеджер свойств для загружаемого объекта
            МенеджерСвойств = ДополнительныеСведенияИФункции.МенеджерДополнительныхРеквизитов(Объект);
        Исключение
            // Если универсальный метод не подходит, обработайте ошибку или используйте другой подход.
            Продолжить; // Пропускаем текущее свойство и переходим к следующему
        КонецПопытки;

        Если МенеджерСвойств = Неопределено Тогда
            Продолжить; // Не удалось получить менеджер свойств
        КонецЕсли;

        // Проверяем, существует ли дополнительный реквизит с таким именем в приемнике
        Если МенеджерСвойств.ДополнительныеРеквизиты.НайтиПоИмени(ИмяСвойства) <> Неопределено Тогда
            // Устанавливаем значение дополнительного реквизита
            МенеджерСвойств.УстановитьЗначениеДополнительногоРеквизита(ИмяСвойства, ЗначениеСвойства);
        Иначе
            // Сообщаем об ошибке или пропускаем, если реквизита нет в приемнике
            Сообщить("Внимание: Дополнительный реквизит '" + ИмяСвойства + 
                     "' не найден в базе-приемнике для объекта Номенклатура '" + Объект.Наименование + 
                     "'. Значение не было установлено.", СтатусСообщения.Важное);
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Важно: Перед выполнением загрузки в УТ убедитесь, что дополнительный реквизит "ЗаводИзготовитель" с тем же именем и типом уже создан для справочника Номенклатура в режиме "Предприятие" базы УТ. Без этого КД не сможет найти, куда записать значение.

Шаг 3: Фильтрация выгружаемых дополнительных реквизитов

Если вы не хотите выгружать все дополнительные реквизиты, а только конкретные (например, только "ЗаводИзготовитель"), вы можете добавить условие в код обработчика. В приведенном выше примере кода такая фильтрация уже реализована с помощью конструкции Если Свойство.Имя = "ЗаводИзготовитель" Тогда.

Этот подход позволяет гибко управлять, какие именно дополнительные реквизиты будут передаваться при обмене, избегая передачи ненужных данных — для регулярного обмена есть правила синхронизации различных баз 1С.

Шаг 4: Обработка особых случаев

Подраздел 4.1: Обмен реквизитами, добавленными через расширения конфигурации

Критически важная информация: Стандартные механизмы обмена, основанные на "Конвертации данных 2.1" и использующие выгрузку метаданных в XML, могут не "видеть" реквизиты, добавленные через расширения конфигурации. Это происходит потому, что при выгрузке структуры метаданных информация из расширений часто игнорируется.

Если ваш дополнительный реквизит "ЗаводИзготовитель" был добавлен через расширение, то приведенный выше подход может не сработать напрямую. В таком случае у вас есть несколько вариантов:

  1. Перенести реквизит в основную конфигурацию: Если есть такая возможность и это приемлемо с точки зрения поддержки обновлений, это самый простой путь. После этого он станет "видимым" для механизмов КД.

  2. Использовать программную передачу через параметры: Можно вручную извлекать значение реквизита из расширения в обработчике "ПриВыгрузке" (например, через Объект.ДополнительныеСвойства.Получить("ИмяРеквизитаИзРасширения") или специализированные функции работы с расширениями) и помещать его в ПараметрыОбъекта. На стороне приемника аналогично, извлекать из ПараметрыОбъекта и записывать в реквизит расширения.

  3. Создание собственного механизма обмена: В особо сложных случаях, когда стандартные подходы не работают, приходится разрабатывать полностью кастомный обмен данными, который будет напрямую работать с метаданными расширений.

Подраздел 4.2: Сопоставление дополнительного реквизита из источника с обычным реквизитом объекта в приемнике

Возможна ситуация, когда в базе-источнике (БП) "ЗаводИзготовитель" является дополнительным реквизитом, а в базе-приемнике (УТ) вы хотите записать его значение в обычный реквизит элемента справочника Номенклатура, например, в реквизит с именем Завод.

Для реализации этого сценария нам также потребуется доработать обработчик "После загрузки" в ПКО для Справочник.Номенклатура на стороне приемника (УТ). Вместо того чтобы устанавливать дополнительный реквизит, мы присвоим его значение обычному реквизиту объекта.

Рассмотрим пример кода для такого сопоставления:


// Пример кода для обработчика "ПослеЗагрузки" в ПКО Номенклатуры (приемник - 1С:Управление Торговлей)
// Сопоставление дополнительного реквизита "ЗаводИзготовитель" с обычным реквизитом "Завод"

// Проверяем, были ли переданы дополнительные реквизиты
Если ПараметрыОбъекта.ДополнительныеРеквизиты <> Неопределено Тогда
    Для Каждого СтруктураСвойства Из ПараметрыОбъекта.ДополнительныеРеквизиты Цикл
        // Ищем наш дополнительный реквизит "ЗаводИзготовитель"
        Если СтруктураСвойства.Имя = "ЗаводИзготовитель" Тогда
            // Присваиваем значение из переданной структуры обычному реквизиту объекта "Завод"
            // Предполагаем, что у элемента справочника Номенклатура в УТ есть реквизит с именем "Завод"
            Объект.Завод = СтруктураСвойства.Значение;
            
            // Если нам нужен только этот реквизит, можем выйти из цикла
            Прервать; 
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

В этом случае, в базе-приемнике (УТ) поле Объект.Завод получит значение, переданное из дополнительного реквизита "ЗаводИзготовитель".

Заключение

Мы подробно рассмотрели шаги по настройке обмена дополнительными реквизитами между 1С:Бухгалтерией и 1С:Управлением торговлей с использованием "Конвертации данных 2.1". Мы выяснили, как подготовить среду, доработать Правила Конвертации Объектов (ПКО) на стороне источника и приемника, реализовать фильтрацию данных и как действовать в случае, если дополнительные реквизиты добавлены через расширения или требуется сопоставить их с обычными реквизитами.

Важно: После внесения всех изменений в правила обмена, не забудьте выгрузить обновленные правила из "Конвертации данных 2.1" и загрузить их в рабочие базы 1С для применения. Обязательно проведите тщательное тестирование обмена на тестовой базе перед внедрением в продуктивном контуре, чтобы убедиться в корректности переноса данных и отсутствии ошибок.

← На главную