Конечно, сейчас мода на ручную регистрацию изменений в планах обмена, но до сих пор остается много старых и самописных конфигураций, которым, может быть, сможет помочь моя публикация.
Для начала я вкратце расскажу, как ручная регистрация происходит в типовой конфигурации:
- Перед записью документа вызывается событие "МеханизмРегистрацииОбъектовПередЗаписьюДокумента", которое, собственно, и отвечает за регистрацию. Я пропущу большую часть всех условий, а перейду к сути.
- А именно к функции "ОбъектМодифицированДляПланаОбменаПопыткаИсключение". Функция получает "ТаблицаРеквизитовРегистрации", которая, по-видимому, берется из правил регистрации объектов. После чего для каждого реквизита или таблицы регистрации идет запрос (ЗАПРОС В ЦИКЛЕ) для значения реквизита до изменений. И идет сравнение с текущим значением реквизита.
- В результате перед записью одного документа выполняется хренова куча кода с хреновой кучей запросов.
Скажу честно, такой подход мне показался не слишком оптимальным, и при этом достаточно МНОГОВРЕМЕНИЗАТРАЧИВАЕМЫМ для моей простой небольшой базы. Поэтому я и решил поискать способ попроще.
- Чтобы отменить авторегистрацию, нужно написать где-нибудь:
Источник.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
- Я создал подписку перед записью документа и решил добавить простенькую проверку на модифицированность
Если Не Источник.Модифицированность() Тогда Источник.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; КонецЕсли;
-
Каково же было моё удивление, что она не работает))) Причем, даже есть проверять модифицированность в самом начале в модуле объекта. Решением стал вызов подписчика на процедуру "ОбработкаПроверкиЗаполнения". Но и это не все! если проведение происходит из списка документов, то проверка на модифицированность даёт ЛОЖЬ, а если через форму документа (даже если ты просто нажал ОК) ИСТИНА.