Фиксация изменений объекта

Нужно было фиксировать изменения объекта, чтобы измененные объекты повторно выгружать в файл обмена с Bitrix.

Использовал план обмена Полный, т.к. там есть все документы, которые мне нужно.


Пришлось делать видимым поле «Код», оно невидимо, а без него узел не создается. Люблю 1С.

Столкнулся с тем, что 1С при перезаписи обмена регистрирует его в плане обмена.

Походил отладчиком, походил, нашел, что изменения завязаны на ПКС, в общем, все как всегда у 1С — сложно.

Тогда покопал в сторону правил регистрации. Впервые их настраивал, если честно, но ничего, не боги горшки обжигают.

Сохранил правила регистрации из конфигурации:

Открыл из в КД, добавил ветку Документы и туда — нужный мне документ:

К сожалению, в БП 3.0 не нашел функции, которая бы сравнивала текущий записываемый объект с его слепком в базе. Пришлось набросать самому, причем максимально внимательно, т.к. прогоны делал выгружая правила регистрации в рабочую базу:

Сообщения сначала были раскомментированы, я записывал документ и смотрел на сообщения. Потом проверил, что в случае отказа документ действительно не регистрируется на плане обмена (по кнопочке Параметры синхронизации данных — Состав отправляемых данных).

Код придется скопировать во все документы, спасибо, их у меня всего три.

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

Вот код текстом, коллеги:

//Проверка модифицированности реквизитов шапки и ТЧ
//+++ Осипов проверка изменен объект или нет, 2020
Если Объект.ЭтоНовый() Или Объект.ОбменДанными.Загрузка Тогда
   
//Сообщить(» Новый будет зарегистрирован:» + Объект);
Иначе
   
ЕстьИзменения = ложь;
   
ПредОбъект = Объект.Ссылка.ПолучитьОбъект();
   
МД = Метаданные.НайтиПоТипу(ТипЗнч(Объект));

    Для Каждого
МДРеквизит Из МД.Реквизиты Цикл
        Если
Объект[МДРеквизит.Имя] <> ПредОбъект[МДРеквизит.Имя] Тогда
           
ЕстьИзменения = истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;

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

    Если
ЕстьИзменения Тогда
       
//Сообщить(» Зарегистрирован будет:» + Объект);
   
Иначе
       
//Сообщить(» Зарегистрирован не будет:» + Объект);
       
Отказ = истина;
    КонецЕсли;

КонецЕсли;
//— Осипов проверка изменен объект или нет, 2020

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 5

  1. Типочек:

    Сергей это делается намного проще, зачем ты такую жуть накрутил?

  2. 123:

    Как усложняешь. За тобой потом переписывать это.

  3. naf2000:

    Что плохого если ты в Битрикс отправишь неизмененный но зарегистрированный в обмене документ?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *