Как принудительно выгрузить данные независимого регистра сведений без регистрации изменений

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

При настройке обменов между базами 1С с использованием конфигурации «Конвертация данных 2.0» специалисты часто сталкиваются с ситуацией, когда стандартный механизм регистрации изменений в плане обмена не подходит для решения бизнес-задачи. Типичный пример: необходимо регулярно передавать актуальные остатки или цены из независимого регистра сведений, даже если сами записи в базе-источнике не менялись. Поскольку стандартный обмен выгружает только то, что «помечено» на узле, возникает вопрос: как заставить систему выгрузить данные принудительно?

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

Метод 1. Использование произвольного алгоритма в ПВД

Это самый корректный и гибкий способ в рамках работы с XML-правилами конвертации. По умолчанию ПВД работает в режиме Стандартная выборка, который опирается на таблицу изменений плана обмена. Если изменений нет — выгрузки не будет. Мы же перенастроим ПВД на работу по нашему собственному сценарию.

Рассмотрим по шагам, как это реализовать:

  1. Откроем правила обмена в конфигурации «Конвертация данных 2.0».
  2. Перейдем в раздел «Правила выгрузки данных» и найдем нужное правило для нашего регистра сведений.
  3. В поле Способ выборки установим значение Произвольный алгоритм.
  4. Перейдем к обработчику Перед выгрузкой данных. Именно здесь мы опишем логику получения записей.

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ОстаткиТоваров.Номенклатура КАК Номенклатура,
    |   ОстаткиТоваров.Количество КАК Количество,
    |   ОстаткиТоваров.ДатаПоследнейПродажи КАК ДатаПоследнейПродажи
    |ИЗ
    |   РегистрСведений.ОстаткиТоваров КАК ОстаткиТоваров";

// Выполняем запрос и передаем результат в ВыборкаДанных
ВыборкаДанных = Запрос.Выполнить().Выгрузить();

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

Метод 2. Программная регистрация изменений перед началом обмена

Если мы хотим оставить способ выборки Стандартный и использовать типовой механизм обмена (через кнопку «Выполнить обмен» или регламентное задание), нам нужно «обмануть» систему, принудительно зарегистрировав изменения для всех записей нужного регистра на конкретном узле.

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

Посмотрим на пример кода для регистрации всех записей независимого регистра сведений:


// Определяем узел, для которого нужно зарегистрировать данные
УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("База Приемник");

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

После выполнения этого кода стандартная обработка обмена «увидит», что для регистра ОстаткиТоваров есть изменения, и выгрузит их в обычном режиме.

Метод 3. Использование глобальных параметров конвертации

Рассмотрим ситуацию, когда вы используете прямое подключение (COM). В этом случае база-приемник инициирует процесс. Мы можем создать в правилах параметр, например, ПолнаяПеревыгрузкаОстатков (тип Булево).

В ПВД, в обработчике Перед выгрузкой данных, мы можем прописать условие:


Если Параметры.ПолнаяПеревыгрузкаОстатков = Истина Тогда
    // Выполняем произвольный запрос, как в Методе 1
    Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ РегистрСведений.ОстаткиТоваров");
    ВыборкаДанных = Запрос.Выполнить().Выбрать();
Иначе
    // Если параметр Ложь, ничего не делаем, 
    // и система сработает по стандартному механизму (только изменения)
КонецЕсли;

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

Метод 4. Функционал БСП «Состав отправляемых данных»

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), вы можете воспользоваться встроенными инструментами мониторинга и регистрации изменений. В современных типовых решениях (УТ 11, ERP 2, БП 3.0) есть обработка Регистрация изменений для обмена.

Разберем, как действовать в этом случае:

  1. Перейдите в раздел Администрирование — Синхронизация данных.
  2. Выберите нужную настройку обмена и нажмите кнопку Состав отправляемых данных (иконка с карандашом).
  3. В открывшемся окне найдите ваш независимый регистр сведений.
  4. Нажмите Зарегистрировать — Все объекты выбранного типа.

Это самый безопасный путь для пользователя, так как он не требует написания кода и изменения правил. Система сама внесет записи в таблицу регистрации изменений, и при следующем сеансе связи данные уйдут в базу-приемник.

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

Мы проанализировали ситуацию и выяснили, что отсутствие изменений на узле — это не препятствие для выгрузки данных. Выбор конкретного метода зависит от ваших технических условий:

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

← На главную