Передача удаления записей независимого регистра сведений через типовой обмен

29.11.23

Интеграция - Перенос данных 1C

Возникла задача передавать независимый непериодический регистр сведений из одной базы в другую, чтобы регистры были идентичны. Используется обработка обмена данными по КД2 из БСП. Передача только в одну сторону из источника в приемник. Возникли трудности с передачей удаленных записей источника в приемник, т.к. обработка УниверсальныйОбменДаннымиXML из состава БСП и обмена КД2 на такое не рассчитана.

Как работает платформа

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

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

МетаданныеРегистра1 = Метаданные.РегистрыСведений.РегистрСведений1;

Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерОтправляемогоСообщения, МетаданныеРегистра1);

Пока Выборка.Следующий() Цикл
    Объект = Выборка.Получить();
    // Объектом будет НаборЗаписей, с установленными отборами по значениям таблицы изменений и уже отобранными записями
    ...
КонецЦикла;

 

Как работает обработка УниверсальныйОбменДаннымиXML из БСП

Если просто настроить передачу регистра в правиле КД2, то передаваться будут только существующие в источнике записи, а из приемника старые записи удаляться не будут.

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

Фрагмент модуля объекта обработки, где происходит обход набора записей из выборки изменений.

Если ВыгружаетсяРегистр Тогда
                    
    Для Каждого СтрокаРегистра Из ОбъектДляПравилВыгрузки Цикл
        ВыгрузкаОбъектаВыборки(СтрокаРегистра, ТекущаяСтрокаПравилаВыгрузки, , ИсходящиеДанные);
    КонецЦикла;
...

 

Здесь `ОбъектДляПравилВыгрузки` как раз тот самый набор записей полученный из `Выборка.Получить()`

Попытка обойти это использованием произвольного алгоритма в правиле выгрузки вместо стандартной выборки оказалось не успешной, т.к. при этом не присваивается номер сообщения.

 

Реализация

Из кода обработки обмена видно, что при "стандартной выборке" в ПВД все равно выполняется событие ПередОбработкой.

Передать из него в ПКО какие-то данные нельзя, Исходящие и ВходящиеДанные затираются.

После выполнения ПередОбработкой, если это регистр, происходит итерирование переменной ОбъектДляПравилВыгрузки, содержащей набор записей из выборки изменений.

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

(!) Переменная ОбъектДляПравилВыгрузки не упоминается в справке КД2, и может быть изменена в будущих версиях.

Используем полученные из анализа кода обработки знания для написания правил ПВД и ПКО регистра.

Правило выгрузки обычное, "Стандартная выборка". Только задаем обработчик "ПередОбработкой", где анализируем, была ли удалена запись.

// Недокументированные возможности обработки обмена
// ОбъектДляПравилВыгрузки - это набор записей регистра сведений полученный из выборки изменений узла.
// Он потом итератором обходится и выгружается по правилу конвертации

ЗаписьУдалена = (ОбъектДляПравилВыгрузки.Количество() = 0);

Если ЗаписьУдалена Тогда
    Запись = Новый Структура;
    Запись.Вставить("Измерение1", ОбъектДляПравилВыгрузки.Отбор.Измерение1.Значение);
    Запись.Вставить("Измерение2", ОбъектДляПравилВыгрузки.Отбор.Измерение2.Значение);
    Запись.Вставить("Измерение3", ОбъектДляПравилВыгрузки.Отбор.Измерение3.Значение);
    Запись.Вставить("Ресурс1", ""); // Значение неизвестно и не важно
    Запись.Вставить("ЗаписьУдалена", ЗаписьУдалена); // Признак удаления

    Записи = Новый Массив;
    Записи.Добавить(Запись);
    
    ОбъектДляПравилВыгрузки = Записи; // Подмена
КонецЕсли;

 

Соответственно в ПКО приходит либо ЗаписьРегистра, если запись существует и обрабатывается как обычно. Или приходит структура, тогда это удаление.

Правило ПКО обычное, сопоставлены поля один в один.

Только дополнительно создаем поле "ЗаписьУдалена" для передачи в приемник в качестве параметра ("передавать в параметр").
Определяем его значение в обработчике ПКС "ПередВыгрузкой"

ЗаписьУдалена = Неопределено;
Если ТипЗнч(Источник) = Тип("Структура") И Источник.Свойство("ЗаписьУдалена", ЗаписьУдалена) Тогда
    Значение = ЗаписьУдалена;
Иначе
    Значение = Ложь;
КонецЕсли;

В общем случае, наверное, достаточно, что мы получили структуру, и это уже признак того, что запись удалена. Но как так сложилось.

Далее в приемнике нужно удалить запись, если установлен параметр "ЗаписьУдалена" и отменить запись.

Обработчик ПКО "ПослеЗагрузки"

Если ПараметрыОбъекта <> Неопределено
    И ПараметрыОбъекта["ЗаписьУдалена"] <> Неопределено И ПараметрыОбъекта["ЗаписьУдалена"] Тогда
    
    Запись = РегистрыСведений.РегистрСведений1.СоздатьМенеджерЗаписи();
    
    ЗаполнитьЗначенияСвойств(Запись, Объект);
    
    Запись.Удалить();
    
    Отказ = Истина;
КонецЕсли;

Этого достаточно для передачи удаленных записей регистра.

Дополнительно проводил эксперименты, снимал галку основной отбор у измерений и смотрел на состав индекса и возможность отбора в наборе записей. Индекс не изменился, в него также входили все измерения регистра. И отбор в наборе записей также работал и для измерений без основного отбора. Наверное, подробнее об этой галке написано в какой-нибудь книге от 1С.

КД2 обмены обмен данными

См. также

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    148424    864    302    

455

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.21.x).

35000 руб.

23.07.2020    58753    284    75    

224

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.246.x) и БП 3.0 (3.0.175.x). Правила подходят для версии ПРОФ и КОРП.

35000 руб.

15.12.2021    27834    198    58    

152

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С v8.3 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

16260 руб.

18.02.2016    191170    625    536    

545

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    175091    318    267    

388

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Перенос данных из КА 1.1 в КА 2 | из КА 1.1 в УТ 11 | Воспользовались более 367 компаний! | Переносятся все возможные виды документов, начальных остатков и вся справочная информация из "1С:КА 1.1" в "1С:КА 2.х" / "1С:УТ 11" | Разработан в формате КД 2 (правила конвертации данных) | Фильтр по организациям при выгрузке | Выбор разных алгоритмов выгрузки начальных остатков | Можно проверить перенос до покупки!

55778 50200 руб.

04.12.2015    194197    254    351    

409

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    39701    112    73    

106

Рабочее место Производство готовой продукции (работ, услуг) Перенос данных 1C Пользователь 1С v8.3 1С:Управление производственным предприятием 1С:Документооборот 1С:Комплексная автоматизация 2.х 1С:КА 1С:ДО Платные (руб)

Продукт "Интеграция с 1С:Документооборот" позволяет использовать функции программы "1С:Документооборот 8" напрямую из учетной системы (1С:УПП; 1С:КА, 1С:УТ 10.3, 1С:БГУ 1.0, 1С:ЗБУ 1.0, 1С:УПП для Казахстана и отраслевых решений, разработанных на их основе) на платформе "1С:Предприятие 8": выполнять и ставить задачи, просматривать документы, скан-копии и прочие файлы, штрих-кодировать документы отправлять письма, вести учет рабочего времени - не входя в "1С:Документооборот 8", работая в одной программе, что значительно сокращает время и делает работу более комфортной и эффективной. Продукт прошел сертификацию 1С-Совместимо

110400 руб.

11.06.2015    59174    38    20    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VKuser2513456 01.03.24 17:03 Сейчас в теме
Большое спасибо за статью. Информация о том что измерения удаленной записи регистра хранятся в изменениях узла оказалась очень полезной.

Но к сожалению не получилось воспользоваться переменной ОбъектДляПравилВыгрузки

Конфигурация:
Зарплата и управление персоналом, редакция 3.1 (3.1.27.151)
журнал при обмене показывает ошибку:
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]
по причине:
{<Неизвестный модуль>(4,18)}: Переменная не определена (ОбъектДляПравилВыгрузки)


А также сделаю небольшое уточнение:
Передать из правил выгрузки данных (ПВД) в правила конвертации объектов (ПКО) данные вполне можно.
Конвертация данных 2. Использование исходящих и входящих данных. Свойство "Получить из входящих данных"
PetrovAnton; +1 Ответить
3. VKuser2513456 05.03.24 10:04 Сейчас в теме
Проблема удаления записей регистра во второй базе при удалении данной записи в первой базе в моем случае решился так:

В правило конвертации объекта (ПКО) данного регистра в обработчик события 'После загрузки' добавил текст.

	Если Не Объект.Количество() Тогда 
		
		Запись = РегистрыСведений.РегистрСведений1.СоздатьМенеджерЗаписи();			    
		ЗаполнитьЗначенияСвойств(Запись, Объект.Отбор);			    
		Запись.Удалить();
		
	КонецЕсли;


Принцип работы механизма:
Информация о удаленной записи в регистре, при использовании типового механизма, в файле выгрузки присутствует. Но в данной информации присутствует только отбор набора записей. То есть во вторую базу данных передается пустой набор записей с заполненным отбором. Находим во второй базе по переданному отбору запись в регистре и удаляем её.
user785234; +1 Ответить
4. partizand 140 08.03.24 14:12 Сейчас в теме
(3)Спасибо за информацию.
Наверное у меня старая обработка. Смотрел файл обмена, там вроде не было пустого набора.
6. VKuser2513456 11.03.24 08:24 Сейчас в теме
Пока не доделал задачу до конца, поэтому не дописал и комментарий недоделанный остался. В моем случае пустой набор регистра регистрируется специальной обработкой события перед его записью. Т.е. мы перед изменением (удалением) набора регистрируем его, а в момент отправки данных программа ничего кроме отбора в наборе не видит и отправляет
только отбор.
// Процедура-обработчик события "ПередЗаписью" регистров для механизма регистрации объектов на узлах.
//
// Параметры:
//  ИмяПланаОбмена - Строка - имя плана обмена, для которого выполняется механизм регистрации.
//  Источник       - НаборЗаписейРегистра - источник события.
//  Отказ          - Булево - флаг отказа от выполнения обработчика.
//  Замещение      - Булево - признак замещения существующего набора записей.
// 
Процедура ОбменПередЗаписьюРегистра(Источник, Отказ, Замещение) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);

	ОбменДаннымиСобытия.МеханизмРегистрацииОбъектовПередЗаписьюРегистра("ИмяПланаОбмена", Источник, Отказ, Замещение);
		
	УстановитьПривилегированныйРежим(Истина);
	
КонецПроцедуры
Показать
7. romulanin 05.06.24 14:57 Сейчас в теме
(6) в каком событии это происходит ?
2. PetrovAnton 16 04.03.24 16:09 Сейчас в теме
Переменная ОбъектДляПравилВыгрузки не определена
5. partizand 140 08.03.24 14:13 Сейчас в теме
(2)Видимо у меня старая обработка.
8. AntonDr 31.07.24 17:28 Сейчас в теме
После первой выгрузки удаленные записи регистра сведений удаляются из таблицы изменений, соответственно если загрузка в получателе не прошла то в следующую выгрузку они уже не выгрузятся. Кто-нибудь сталкивался? Есть какое-то решение?
Оставьте свое сообщение