При настройке обменов между базами 1С с использованием конфигурации «Конвертация данных 2.0» специалисты часто сталкиваются с ситуацией, когда стандартный механизм регистрации изменений в плане обмена не подходит для решения бизнес-задачи. Типичный пример: необходимо регулярно передавать актуальные остатки или цены из независимого регистра сведений, даже если сами записи в базе-источнике не менялись. Поскольку стандартный обмен выгружает только то, что «помечено» на узле, возникает вопрос: как заставить систему выгрузить данные принудительно?
В этой статье мы подробно разберем, как обойти ограничение по регистрации изменений, рассмотрим использование произвольных алгоритмов в правилах выгрузки данных (ПВД) и научимся программно «подталкивать» обмен.
Это самый корректный и гибкий способ в рамках работы с XML-правилами конвертации. По умолчанию ПВД работает в режиме Стандартная выборка, который опирается на таблицу изменений плана обмена. Если изменений нет — выгрузки не будет. Мы же перенастроим ПВД на работу по нашему собственному сценарию.
Рассмотрим по шагам, как это реализовать:
Способ выборки установим значение Произвольный алгоритм.Перед выгрузкой данных. Именно здесь мы опишем логику получения записей.Проанализируем пример кода, который необходимо вставить в этот обработчик. Нам нужно сформировать запрос к регистру и передать результат в системную переменную ВыборкаДанных. Система увидит, что переменная заполнена, и проигнорирует отсутствие регистрации на узле.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура КАК Номенклатура,
| ОстаткиТоваров.Количество КАК Количество,
| ОстаткиТоваров.ДатаПоследнейПродажи КАК ДатаПоследнейПродажи
|ИЗ
| РегистрСведений.ОстаткиТоваров КАК ОстаткиТоваров";
// Выполняем запрос и передаем результат в ВыборкаДанных
ВыборкаДанных = Запрос.Выполнить().Выгрузить();
Важный нюанс: при использовании этого метода система выгрузит абсолютно все записи регистра, которые попадут в запрос. Это идеально подходит для небольших справочников или актуальных остатков, но может замедлить обмен, если в регистре миллионы записей. В таком случае в запрос следует добавить фильтры по периоду или конкретным группам товаров.
Если мы хотим оставить способ выборки Стандартный и использовать типовой механизм обмена (через кнопку «Выполнить обмен» или регламентное задание), нам нужно «обмануть» систему, принудительно зарегистрировав изменения для всех записей нужного регистра на конкретном узле.
Выясним причину, почему это иногда удобнее: такой подход позволяет не менять логику самих правил конвертации, оставляя их универсальными. Для регистрации изменений можно создать небольшую внешнюю обработку или добавить код в процедуру перед началом выгрузки.
Посмотрим на пример кода для регистрации всех записей независимого регистра сведений:
// Определяем узел, для которого нужно зарегистрировать данные
УзелОбмена = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("База Приемник");
Если Не УзелОбмена.Пустая() Тогда
// Регистрируем изменения для всего типа (Регистр Сведений)
// Для независимого регистра это пометит все записи для выгрузки
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Метаданные.РегистрыСведений.ОстаткиТоваров);
Сообщить("Данные успешно зарегистрированы для узла: " + УзелОбмена);
КонецЕсли;
После выполнения этого кода стандартная обработка обмена «увидит», что для регистра ОстаткиТоваров есть изменения, и выгрузит их в обычном режиме.
Рассмотрим ситуацию, когда вы используете прямое подключение (COM). В этом случае база-приемник инициирует процесс. Мы можем создать в правилах параметр, например, ПолнаяПеревыгрузкаОстатков (тип Булево).
В ПВД, в обработчике Перед выгрузкой данных, мы можем прописать условие:
Если Параметры.ПолнаяПеревыгрузкаОстатков = Истина Тогда
// Выполняем произвольный запрос, как в Методе 1
Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ РегистрСведений.ОстаткиТоваров");
ВыборкаДанных = Запрос.Выполнить().Выбрать();
Иначе
// Если параметр Ложь, ничего не делаем,
// и система сработает по стандартному механизму (только изменения)
КонецЕсли;
Этот метод позволяет гибко управлять поведением обмена прямо из интерфейса настройки синхронизации, не залезая в конфигуратор каждый раз, когда нужно обновить данные.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), вы можете воспользоваться встроенными инструментами мониторинга и регистрации изменений. В современных типовых решениях (УТ 11, ERP 2, БП 3.0) есть обработка Регистрация изменений для обмена.
Разберем, как действовать в этом случае:
Администрирование — Синхронизация данных.Состав отправляемых данных (иконка с карандашом).Зарегистрировать — Все объекты выбранного типа.Это самый безопасный путь для пользователя, так как он не требует написания кода и изменения правил. Система сама внесет записи в таблицу регистрации изменений, и при следующем сеансе связи данные уйдут в базу-приемник.
Мы проанализировали ситуацию и выяснили, что отсутствие изменений на узле — это не препятствие для выгрузки данных. Выбор конкретного метода зависит от ваших технических условий:
Помните, что принудительная выгрузка больших объемов данных через независимые регистры сведений может создавать значительную нагрузку на каналы связи и увеличивать время выполнения транзакции обмена. Всегда старайтесь ограничивать выборку только теми данными, которые действительно необходимы на стороне приемника.