Как изменить правила обмена в 1С:Фреш через расширение, если стандартная замена макетов не работает

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← На главную

При работе в облачном сервисе 1С:Фреш (1C:Fresh) разработчики часто сталкиваются с ситуацией, когда типовые правила обмена (например, между «1С:Бухгалтерия государственного учреждения» и «1С:Комбинат питания») устаревают, а стандартные механизмы их обновления через расширение не приносят результата. Попытка заменить макеты ПравилаОбмена, ПравилаОбменаКорреспондента и ПравилаРегистрации в расширении часто игнорируется системой, даже если расширение успешно прошло аудит. Рассмотрим подробно, почему это происходит и какими способами можно решить эту задачу.

Почему 1С:Фреш игнорирует макеты правил в расширении?

Для начала проанализируем ситуацию и выясним причину такого поведения платформы. В современных конфигурациях, построенных на Библиотеке стандартных подсистем (БСП), механизм загрузки правил обмена работает по определенному приоритету. Система ищет правила в следующем порядке:

  1. Регистр сведений «Правила для обмена данными»: если в этом регистре есть запись для конкретного плана обмена, система возьмет правила именно оттуда.
  2. Макеты основной конфигурации: если в регистре правил нет, используются встроенные в конфигурацию XML-макеты.

В облаке 1С:Фреш регистр правил обмена часто является неразделенным. Это означает, что данные в нем общие для всех областей (арендаторов) в рамках одного информационного узла. Обычный пользователь или администратор области не может перезаписать данные в таком регистре, так как это затронуло бы всех остальных пользователей облака. Кроме того, программный код в модулях типа ОбменДаннымиСервер может быть написан таким образом, что он обращается напрямую к метаданным основной конфигурации, игнорируя объекты, добавленные или измененные через расширение в режиме «Дополнение».

Решение 1: Программная подмена правил через аннотацию &Вместо

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

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

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


&Вместо("ПолучитьПравилаИзМакэта")
Функция Расш1_ПолучитьПравилаИзМакэта(ИмяПланаОбмена, ИмяМакет)
    
    // Если это наш план обмена, подсовываем макет из расширения
    Если ИмяПланаОбмена = "ОбменПитаниеБГУВерсия2" Тогда
        Возвратить УправлениеСвойствами.ПолучитьМакетРасширения("Расш1_НовыеПравилаОбмена");
    КонецЕсли;
    
    // В остальных случаях вызываем стандартную логику
    Возврат ПродолжитьВызов(ИмяПланаОбмена, ИмяМакет);
    
КонецФункции

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

Решение 2: Создание собственного плана обмена в расширении

Если типовой план обмена ОбменПитаниеБГУВерсия2 слишком жестко завязан на неразделенные ресурсы, проанализируем возможность создания его копии внутри расширения. Это радикальный, но надежный путь для Фреша.

  1. Создадим в расширении новый план обмена, скопировав структуру типового.
  2. Добавим в него необходимые макеты правил из поставки разработчика (ZIP-архив с правилами).
  3. Переопределим в расширении все вызовы в общих модулях, которые ссылаются на старый план обмена, заменив их на наш новый объект.

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

Решение 3: Использование внешней обработки с ручным управлением регистрацией

Рассмотрим ситуацию, когда API и планы обмена кажутся слишком сложными. Можно использовать адаптированную версию обработки «Универсальный обмен данными в формате XML». Во Фреше она должна быть загружена как дополнительная обработка и пройти аудит.

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


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

Используя этот подход, мы сохраняем все преимущества штатного механизма регистрации (объекты попадают в обмен при записи), но саму выгрузку делаем по своим правилам, хранящимся внутри обработки или расширения в виде двоичных данных.

Решение 4: Синхронизация через Автономное рабочее место (АРМ)

Если прямой обмен между БГУ во Фреше и локальным «Комбинатом питания» настроить не удается из-за специфических правил конвертации 2.0, проанализируем вариант с промежуточным звеном.

Создадим локальную информационную базу БГУ (АРМ), которая будет синхронизироваться с облаком Фреш стандартными средствами (EnterpriseData). Поскольку локальная база находится под вашим полным контролем, в ней можно без ограничений настроить обмен с «Комбинатом питания» по любым правилам конвертации. АРМ будет выступать в роли «шлюза», передавая данные из локального софта в облако. При необходимости можно воспользоваться расширением для возврата возможности загрузки комплектов правил обмена XML в локальной базе.

Важные рекомендации по аудиту

При реализации любого из этих решений для 1С:Фреш, помните о правилах безопасности сервиса. Рассмотрим основные ограничения:

Подводя итог, наиболее перспективным методом для Фреша является программный перехват функции получения правил в модулях БСП через расширение. Это позволяет оставить инфраструктуру обмена типовой, но подменить «содержимое» правил на актуальное из вашего расширения.

← На главную