При настройке и сопровождении синхронизации данных между конфигурациями «1С:Управление торговлей 11.4» (УТ) и «1С:Бухгалтерия предприятия» (БП) разработчики часто сталкиваются с необходимостью программно контролировать состав выгружаемых данных. Для оптимизации процессов интеграции важно понимать, по каким правилам платформа регистрирует изменения объектов, где физически хранятся эти сведения и какими методами их можно быстро извлечь. В этой статье мы подробно разберем внутреннее устройство регистрации изменений в среде 1С:Предприятие 8.3 и изучим различные способы получения этой информации.
Прежде чем переходить к написанию программного кода, рассмотрим, как быстро оценить масштаб зарегистрированных изменений интерактивными средствами. В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), к которым относится и УТ 11.4, встроена специализированная обработка. Чтобы открыть ее, выполним следующие шаги:
Эта обработка визуализирует дерево объектов метаданных, для которых зарегистрированы изменения в разрезе выбранного узла плана обмена. Отсюда можно не только просматривать списки конкретных документов и справочников, готовых к отправке, но и вручную регистрировать новые объекты либо удалять ошибочно зарегистрированные записи.
Для понимания архитектуры системы проанализируем, как информация о регистрации изменений хранится на уровне СУБД (MS SQL Server, PostgreSQL и др.). Для каждого объекта конфигурации (справочника, документа, регистра), который включен в состав хотя бы одного плана обмена, платформа 1С автоматически создает отдельную служебную таблицу регистрации изменений.
Имена этих таблиц в базе данных формируются по строгому шаблону:
_ReferenceChngR<n>_DocumentChngR<n>_InfoRgChngR<n>_AccumRgChngR<n>Здесь параметр <n> обозначает внутренний идентификатор объекта метаданных. Структура этих таблиц проста и оптимизирована для быстрого поиска:
binary).NULL)._IDRRef (уникальный идентификатор самого измененного объекта). Для регистров это набор измерений, однозначно определяющих запись.Самым эффективным способом программного получения списка зарегистрированных изменений является использование механизма запросов к специальным виртуальным таблицам. Платформа 1С предоставляет к ним доступ непосредственно через язык запросов.
Имя виртуальной таблицы образуется путем добавления суффикса .Изменения к полному имени объекта метаданных. Например, для справочника договоров это будет Справочник.Договоры.Изменения.
Рассмотрим подробнее пример запроса, который выбирает все зарегистрированные изменения для справочника номенклатуры по конкретному узлу обмена:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураИзменения.Ссылка КАК Ссылка,
| НоменклатураИзменения.НомерСообщения КАК НомерСообщения
|ИЗ
| Справочник.Номенклатура.Изменения КАК НоменклатураИзменения
|ГДЕ
| НоменклатураИзменения.Узел = &УзелОбмена";
Запрос.УстановитьПараметр("УзелОбмена", СсылкаНаУзелПланаОбмена);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка полученной ссылки
Сообщить("Зарегистрирован элемент: " + Выборка.Ссылка);
КонецЦикла;
Важная деталь для разработчиков: При составлении запроса в Конструкторе запросов таблицы изменений по умолчанию скрыты из общего дерева доступных таблиц. Чтобы отобразить их, необходимо нажать на специальную кнопку на панели инструментов конструктора — «Отображать таблицы изменений» (она выглядит как зеленый кружок с двумя стрелками).
Платформа 1С предоставляет встроенный объектный метод для работы с регистрацией — ПланыОбмена.ВыбратьИзменения(). Этот способ традиционно применяется непосредственно в процедурах выгрузки данных, когда изменения нужно не просто прочитать, но и сразу поместить в XML-файл сообщения обмена с присвоением номера сообщения.
Разберем по шагам классический пример использования этого механизма:
// Шаг 1. Инициализируем запись XML в память или файл
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Шаг 2. Находим нужный узел плана обмена
Узел = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("БП01");
Если ЗначениеЗаполнено(Узел) Тогда
// Шаг 3. Создаем объект записи сообщения обмена
ЗапСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗапСообщения.НачатьЗапись(ЗаписьXML, Узел);
// Шаг 4. Выбираем зарегистрированные изменения
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗапСообщения.НомерСообщения);
Пока Выборка.Следующий() Цикл
Данные = Выборка.Получить();
// Производим необходимые действия с объектом данных
Сообщить("Обрабатываем: " + Данные);
КонецЦикла;
// Шаг 5. Завершаем или прерываем запись в зависимости от логики алгоритма
ЗапСообщения.ПрерватьЗапись();
Стр = ЗаписьXML.Закрыть();
КонецЕсли;
Необходимо учитывать важную особенность: метод ПланыОбмена.ВыбратьИзменения() при обходе выборки последовательно считывает из базы данных и инициализирует в оперативной памяти полноценные объекты (документы, справочники целиком). Если в базе зарегистрированы сотни тысяч изменений, этот метод может вызвать существенные задержки и повышенное потребление ресурсов сервера. Именно поэтому для простого анализа и получения списка ссылок всегда предпочтительнее использовать механизм запросов к виртуальным таблицам изменений.
Поскольку «Управление торговлей 11.4» разработана с применением БСП, стандартные платформенные механизмы регистрации здесь дополнены и оптимизированы на программном уровне. На практике в планах обмена БСП автоматическая регистрация изменений средствами платформы для многих объектов часто отключена (в свойствах состава плана обмена для метаданных установлено «Запретить»).
Вместо этого регистрация управляется программно через общие подписки на события (например, при записи объектов). Это позволяет разработчикам БСП реализовывать сложные правила фильтрации данных «на лету» (например, отсекать документы по определенным организациям или датам до того, как они попадут в таблицу изменений).
Для программной работы в среде БСП рекомендуется использовать интерфейсные функции общих модулей:
ОбменДаннымиСлужебный.ИзмененияЗарегистрированы(Получатель) — позволяет быстро проверить, есть ли вообще какие-либо зарегистрированные изменения для указанного узла обмена, не прибегая к написанию сложных запросов вручную.ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных(Получатель, Данные) — корректно регистрирует изменения для переданного объекта или массива объектов с учетом всех правил и фильтров, настроенных в системе обмена.Таким образом, выбор конкретного метода зависит от вашей конечной задачи. Если вам необходимо оперативно проверить и вывести список изменений на экран или в отчет — используйте прямые запросы к виртуальным таблицам изменений .Изменения. Если же вы реализуете собственный уникальный механизм выгрузки данных во внешнюю систему — применяйте связку методов ПланыОбмена.ВыбратьИзменения() и объектов записи сообщений.