Фиксация изменений объекта
Нужно было фиксировать изменения объекта, чтобы измененные объекты повторно выгружать в файл обмена с Bitrix.
Использовал план обмена Полный, т.к. там есть все документы, которые мне нужно.
Пришлось делать видимым поле «Код», оно невидимо, а без него узел не создается. Люблю 1С.
Столкнулся с тем, что 1С при перезаписи обмена регистрирует его в плане обмена.
Походил отладчиком, походил, нашел, что изменения завязаны на ПКС, в общем, все как всегда у 1С — сложно.
Тогда покопал в сторону правил регистрации. Впервые их настраивал, если честно, но ничего, не боги горшки обжигают.
Сохранил правила регистрации из конфигурации:
Открыл из в КД, добавил ветку Документы и туда — нужный мне документ:
К сожалению, в БП 3.0 не нашел функции, которая бы сравнивала текущий записываемый объект с его слепком в базе. Пришлось набросать самому, причем максимально внимательно, т.к. прогоны делал выгружая правила регистрации в рабочую базу:
Сообщения сначала были раскомментированы, я записывал документ и смотрел на сообщения. Потом проверил, что в случае отказа документ действительно не регистрируется на плане обмена (по кнопочке Параметры синхронизации данных — Состав отправляемых данных).
Код придется скопировать во все документы, спасибо, их у меня всего три.
Чтобы другие документы не регистрировались, по идее нужно создать на каждый из них правило или банально проигнорировать. Можно в конце выгрузки на сайт сделать очистку плана от лишних данных, как вариант.
Вот код текстом, коллеги:
//Проверка модифицированности реквизитов шапки и ТЧ
//+++ Осипов проверка изменен объект или нет, 2020
Если Объект.ЭтоНовый() Или Объект.ОбменДанными.Загрузка Тогда
//Сообщить(» Новый будет зарегистрирован:» + Объект);
Иначе
ЕстьИзменения = ложь;
ПредОбъект = Объект.Ссылка.ПолучитьОбъект();
МД = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
Для Каждого МДРеквизит Из МД.Реквизиты Цикл
Если Объект[МДРеквизит.Имя] <> ПредОбъект[МДРеквизит.Имя] Тогда
ЕстьИзменения = истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ ЕстьИзменения Тогда
Для Каждого МДТЧ Из МД.ТабличныеЧасти Цикл
Если ЕстьИзменения Тогда Прервать; КонецЕсли;
ТекТЧ = Объект[МДТЧ.Имя]; ВсегоТЧ = ТекТЧ.Количество();
ПредТЧ = ПредОбъект[МДТЧ.Имя]; ВсегоПредТЧ = ПредТЧ.Количество();
Если ВсегоТЧ <> ВсегоПредТЧ Тогда
ЕстьИзменения = истина;
Прервать;
КонецЕсли;
ТекСч = 0;
Для Каждого ТекСтрока ИЗ ТекТЧ Цикл
ПредСтрока = ПредТЧ[ТекСч]; ТекСч = ТекСч + 1;
Если ЕстьИзменения Тогда Прервать; КонецЕсли;
Для Каждого МДРеквизит Из МДТЧ.Реквизиты Цикл
Если ТекСтрока[МДРеквизит.Имя] <> ПредСтрока[МДРеквизит.Имя] Тогда
ЕстьИзменения = истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Если ЕстьИзменения Тогда
//Сообщить(» Зарегистрирован будет:» + Объект);
Иначе
//Сообщить(» Зарегистрирован не будет:» + Объект);
Отказ = истина;
КонецЕсли;
КонецЕсли;
//— Осипов проверка изменен объект или нет, 2020
Сергей это делается намного проще, зачем ты такую жуть накрутил?
Как же?
Как усложняешь. За тобой потом переписывать это.
Что именно усложняю. Как проще?
Что плохого если ты в Битрикс отправишь неизмененный но зарегистрированный в обмене документ?