Как настроить автоматическую загрузку данных в БП 3.0 из БП 2.0 по правилам КД 2.1 и решить проблемы с проведением документов?

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

Переход или регулярный обмен данными между устаревшей конфигурацией «Бухгалтерия предприятия 2.0» и современной «Бухгалтерия предприятия 3.0» — классическая задача для разработчика 1С. Особенно часто сложности возникают, когда историческая база БП 2.0 сильно доработана, правила обмена написаны на классической «Конвертации данных 2.1» (КД 2.1), а в БП 3.0 стандартный интерфейс синхронизации предлагает только современный формат EnterpriseData.

В этой статье мы подробно разберем, как автоматизировать процесс загрузки данных в БП 3.0 по расписанию без снятия конфигурации-приемника с поддержки, как настроить обратную квитанцию для снятия регистрации изменений в БП 2.0, а также выясним причины распространенной проблемы, когда документы загружаются, но не проводятся, а справочники «теряются».

---

Почему при автоматическом обмене документы не проводятся, а справочники пропадают?

Сначала проанализируем ситуацию, с которой часто сталкиваются программисты при запуске автоматического обмена. При ручном использовании обработки УниверсальныйОбменДаннымиXML все работает прекрасно: документы проводятся, аналитика заполняется. Но стоит запустить процесс через План обмена в автоматическом режиме, как документы остаются просто записанными (непроведенными), а в реквизитах справочников (номенклатура, договоры, контрагенты) появляются пустые значения.

Разберем детально физику этого процесса в Библиотеке стандартных подсистем (БСП) конфигурации БП 3.0:

  1. Режим записи объектов (свойство ОбменДанными.Загрузка = Истина): При автоматическом обмене через БСП запись всех XML-данных происходит с установленным признаком Загрузка = Истина. Это штатное поведение платформы «1С:Предприятие», предназначенное для того, чтобы избежать коллизий при переносе данных. В этом режиме отключаются стандартные платформенные проверки, подписки на события ПередЗаписью и ПриЗаписи, а также полностью блокируется автоматическое проведение документов при записи. Система считает, что данные переносятся «как есть» из другой базы, где они уже были проверены.
  2. Механизм отложенного проведения БСП: Чтобы процесс загрузки больших файлов обмена не вызывал зависания системы, БСП разделяет процесс загрузки и процесс проведения. При чтении файла документы записываются непроведенными, но регистрируются в специальном регистре сведений Отложенные движения документов.

    Для того чтобы эти документы в итоге провелись, в БП 3.0 должно быть активно и корректно настроено типовое регламентное задание «Выполнение отложенных движений документов». Если оно выключено, зависло или выполняется под пользователем с недостаточными правами, документы так и останутся лежать в базе мертвым грузом без проводок.

  3. Неполный состав Плана обмена: Если вы решили создать новый План обмена в БП 3.0 (например, через расширение конфигурации), критически важно проверить его вкладку «Состав» в конфигураторе. Если в состав плана обмена не включены переносимые справочники (такие как Номенклатура, Контрагенты, ДоговорыКонтрагентов и т.д.), то при чтении XML-сообщения БСП может просто проигнорировать эти типы данных или записать их некорректно.
  4. Настройки правил конвертации объектов (ПКО) в КД 2.1: Проверьте флаг «Не создавать новый объект в приемнике, если он не найден» в настройках ПКО для справочников. При ручной загрузке, если объекты уже физически существовали в базе БП 3.0, они сопоставились успешно. При автоматической выгрузке новых позиций это правило запретит системе создавать новые элементы справочников в приемнике, из-за чего реквизиты в документах окажутся незаполненными.

---

Вариант решения №1. Создание собственного Плана обмена в БП 3.0 через Расширение

Для реализации полноценного двустороннего обмена с формированием файлов-квитанций (ответов) нам потребуется План обмена на стороне БП 3.0. Чтобы сохранить базу на поддержке и не усложнять последующие обновления конфигурации, добавим этот план обмена через механизм расширения конфигурации.

Выполним этот процесс по шагам:

Шаг 1. Создание расширения и добавление Плана обмена

Откроем конфигуратор БП 3.0, перейдем в меню Конфигурация -> Расширения конфигурации, добавим новое расширение. В расширении создадим новый объект типа План обмена. Назовем его, например, _ДемоОбменБП2БП3.

В свойствах созданного плана обмена обязательно настроим:

Шаг 2. Настройка узлов и правил обмена

В режиме «1С:Предприятие» в БП 3.0 создадим узлы для нашего нового плана обмена. Нам понадобятся два узла:

  1. Этот узел — предопределенный узел, символизирующий нашу базу БП 3.0.
  2. Узел БП 2.0 — узел для обмена с базой-источником. Код этого узла должен строго совпадать с кодом узла-приемника, настроенным в БП 2.0.

Шаг 3. Загрузка правил конвертации в План обмена

Поскольку мы используем КД 2.1, нам необходимо загрузить правила обмена (файл Rules.xml) в созданный план обмена. Обычно в типовых планах обмена для этого используется регистр сведений ПравилаДляОбменаДанными. Нам нужно прописать регистрацию нашего нового плана обмена в общих модулях БСП, отвечающих за обмен данными, либо воспользоваться стандартной обработкой по загрузке правил конвертации для нашего узла.

После настройки обмена через расширение запуск загрузки будет происходить по расписанию через стандартные регламентные задания БСП. При этом система автоматически сформирует файл ответа с номером принятого сообщения, который при следующей итерации в БП 2.0 снимет с регистрации успешно перенесенные объекты.

---

Вариант решения №2. Автоматизация обмена без изменения конфигурации (Регламентная внешняя обработка)

Если вы принципиально не хотите использовать расширения и добавлять новые планы обмена в структуру базы данных БП 3.0, существует изящное альтернативное решение. Мы можем полностью автоматизировать процесс загрузки XML-файла и отправки подтверждения с помощью внешней обработки, запускаемой по расписанию через встроенный механизм БСП.

В БП 3.0 предусмотрена возможность выполнения кода внешних обработок на сервере по расписанию (раздел Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки).

Рассмотрим по шагам, как реализовать такую обработку.

Шаг 1. Написание модуля внешней обработки

Создадим в конфигураторе новую внешнюю обработку. В модуле объекта нашей обработки напишем программный код, который будет использовать стандартный объект Обработки.УниверсальныйОбменДаннымиXML, уже встроенный в БП 3.0.

Ниже представлен готовый к использованию шаблон кода серверного метода внешней обработки:


Процедура ВыполнитьЗагрузкуДанныхПоРасписанию() Экспорт
    
    // Определяем пути к файлам на сервере
    ПутьКФайлуИмпорта = "C:\Exchange\from_BP2.xml";
    ПутьКФайлуКвитанции = "C:\Exchange\to_BP2.xml";
    
    ФайлОбмена = Новый Файл(ПутьКФайлуИмпорта);
    Если Не ФайлОбмена.Существует() Тогда
        ЗаписьЖурналаРегистрации("Обмен данными БП 2.0 - БП 3.0",
            УровеньЖурналаРегистрации.Предупреждение, , ,
            "Файл загрузки не найден по пути: " + ПутьКФайлуИмпорта);
        Возврат;
    КонецЕсли;

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

КонецПроцедуры

Шаг 2. Реализация формирования файла-ответа (квитанции)

Для того чтобы БП 2.0 поняла, что сообщение принято, и очистила таблицу зарегистрированных изменений для узла обмена, нам нужно создать ответный XML-файл определенной структуры. Проанализируем пример кода, считывающий номер сообщения из входящего файла и записывающий квитанцию:


Процедура СформироватьФайлПодтверждения(Знач ПутьКВходящемуФайлу, Знач ПутьКФайлуОтвета)
    
    НомерПринятогоСообщения = 0;
    КодОтправителя = "";
    КодПолучателя = "";
    
    // Читаем заголовок входящего файла, чтобы узнать номер сообщения
    ЧтениеXML = Новый ЧтениеXML;
    Попытка
        ЧтениеXML.ОткрытьФайл(ПутьКВходящемуФайлу);
        Пока ЧтениеXML.Прочитать() Цикл
            Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "MessageHeader" Тогда
                // Здесь парсим атрибуты заголовка сообщения КД 2.1
                // Обычно структура содержит НомерСообщения, Отправитель, Получатель
                НомерПринятогоСообщения = ЧтениеXML.ПолучитьАтрибут("MessageNo");
                КодОтправителя = ЧтениеXML.ПолучитьАтрибут("Sender");
                КодПолучателя = ЧтениеXML.ПолучитьАтрибут("Recipient");
                Прервать;
            КонецЕсли;
        КонецЦикла;
        ЧтениеXML.Закрыть();
    Исключение
        // Если прочитать заголовок не удалось, запишем дефолтные значения
        НомерПринятогоСообщения = 1; 
        ЧтениеXML.Закрыть();
    КонецПопытки;
    
    Если ЗначениеЗаполнено(НомерПринятогоСообщения) Тогда
        // Формируем XML-файл подтверждения
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.ОткрытьФайл(ПутьКФайлуОтвета, "UTF-8");
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        
        // Формируем корневой элемент квитанции, понятный для БСП и планов обмена БП 2.0
        ЗаписьXML.ЗаписатьНачалоЭлемента("v8msg:Response");
        ЗаписьXML.ЗаписатьСоответствиеГраницПространствИмен("v8msg", "http://v8.1c.ru/messages");
        
        ЗаписьXML.ЗаписатьНачалоЭлемента("Header");
        ЗаписьXML.ЗаписатьЭлемент("To", КодОтправителя); // Адресат - отправитель исходного файла
        ЗаписьXML.ЗаписатьЭлемент("From", КодПолучателя); // Отправитель квитанции - наша БП 3.0
        ЗаписьXML.ЗаписатьЭлемент("ReceivedNo", СокрЛП(НомерПринятогоСообщения)); // Номер подтверждаемого сообщения
        ЗаписьXML.ЗаписатьКонецЭлемента(); // Header
        
        ЗаписьXML.ЗаписатьКонецЭлемента(); // v8msg:Response
        ЗаписьXML.Закрыть();
    КонецЕсли;

КонецПроцедуры

Шаг 3. Регистрация внешней обработки в БП 3.0

Для интеграции нашей обработки в справочник дополнительных обработок БСП необходимо добавить в модуль объекта стандартную функцию описания:


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработкеКонфигурации("2.2.2.1");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Наименование = "Автоматическая загрузка данных из БП 2.0 (КД 2.1)";
    ПараметрыРегистрации.Информация = "Регулярная загрузка данных по расписанию с формированием квитанции";
    ПараметрыРегистрации.БезопасныйРежим = Ложь; // Требуется Ложь для работы с файловой системой сервера
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Запустить загрузку данных из БП 2.0";
    НоваяКоманда.Идентификатор = "ВыполнитьЗагрузкуДанныхПоРасписанию";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Сохраните обработку как внешний файл .epf, перейдите в БП 3.0 в меню Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки, нажмите кнопку «Добавить из файла» и выберите сохраненный файл. После этого во вкладке команд настройте необходимое расписание запуска (например, каждые 15 минут или раз в сутки ночью).

---

Резюме и рекомендации

Мы рассмотрели два надежных и кардинально отличающихся подхода к автоматизации обмена между конфигурациями БП 2.0 и БП 3.0 по правилам КД 2.1:

  1. Использование расширения конфигурации с созданием плана обмена. Данный метод идеален, если вам нужен полноценный интерактивный контроль за регистрацией изменений с обеих сторон и вы хотите использовать стандартные мониторы обмена БСП. При этом конфигурация остается полностью на поддержке.
  2. Использование внешней обработки по расписанию. Наиболее простой и безопасный способ автоматизации. Он вообще не затрагивает метаданные конфигурации, работает исключительно через внешнюю обработку и программно эмулирует как загрузку данных через КД 2.1, так и формирование стандартной квитанции для очистки регистрации изменений в базе-источнике БП 2.0.

Выбирайте подходящий вам метод исходя из требований к архитектуре вашей системы и наслаждайтесь стабильным и автоматизированным обменом данными без рутинных ручных операций!

← На главную