Имя: Пароль:
1C
 
Управляемые формы Модифицированность() объектов
,
0 ProDeveloper
 
10.03.15
16:33
В УФ существует проблема - в событии ПередЗаписью() в модуле объекта метод Модифицированность() всегда возвращает Истина, даже если мы ничего не меняли в объекте. Происходит это из за того, что перед записью начинается транзакция записи. Объект до транзакции <> объекту в транзакции или после транзакции из-за версии данных, которая при записи всегда изменяется. В связи с этим становится невозможным красивая реализация отказа от записи объектов в подписке ПередЗаписью()

Код в подписке ПередЗаписью() вида Процедура xxxx_ЗапретИзмененияДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    Если ЗначениеЗаполнено(Источник.Ссылка) И Источник.Модифицированность() Тогда ...
в УФ теряет свой смысл.

Пока что сделал через костыль, тупым перебором реквизитов и ТЧ в цикле, ТЧ сравнивать было лениво, поэтому ТЧ преобразую в строку и сравниваю строковые представления ТЧ.
Процедура xxxx_ЗапретИзмененияДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    Модифицированность = Ложь;
    
    Для каждого Реквизит Из Источник.Метаданные().Реквизиты Цикл
        
        Если Источник[Реквизит.Имя] <> Источник.Ссылка[Реквизит.Имя] Тогда
            Модифицированность = Истина;
        КонецЕсли;
        
    КонецЦикла;
    
    Для каждого ТЧ Из Источник.Метаданные().ТабличныеЧасти Цикл
        
        ТЧИсточник = ЗначениеВСтрокуВнутр(Источник[ТЧ.Имя].Выгрузить());
        ТЧСсылка = ЗначениеВСтрокуВнутр(Источник.Ссылка[ТЧ.Имя].Выгрузить());
        
        Если ТЧИсточник <> ТЧСсылка Тогда
            Модифицированность = Истина;
        КонецЕсли;
        
    КонецЦикла;
    
    Если ЗначениеЗаполнено(Источник.Ссылка) И Модифицированность Тогда ...


Есть у кого соображения как ещё можно выкрутиться?
1 Nuobu
 
10.03.15
16:36
(0) Перенести в модули документов и справочников не подходит?
2 Nuobu
 
10.03.15
16:36
(1) Тоесть документов.
3 ProDeveloper
 
10.03.15
16:48
(1)(2) А если подумать? А если такой функционал нужен для всех справочников и документов коих в ERP 2.0 превеликое множество? Что неужели будешь править все формы спр-ков и доков? А обновлять потом как?
Слив засчитан :)
4 DmitrO
 
10.03.15
17:09
"Происходит это из за того, что перед записью начинается транзакция записи"
Ну это не из-за транзакции записи непосредственно конечно, а из-за того, что экземпляр объект в УФ получается десериализацией из данных формы, соответственно он всегда модифицирован.

А вообще изначально задача-то как стоит? Отказаться от записи в подписке если объект реально не модифицирован в форме? И получить собственно получить исключение?
5 ProDeveloper
 
10.03.15
17:18
(4) Изначально задача стоит так "Запретить изменение объектов закаченных из сторонней БД (Oracle)". Соответственно есть РС.СоответсвияОбъектов где живут IDшники(ID Oracle, ID 1C, ЗагруженИзСтороннейБД-булево). Реализованно через подписку на событие - в подписке ПередЗаписью() происходит проверка на модификацию объекта, если объект модифицирован и в РС.СоответсвияОбъектов имеется этот объект ID 1C с признаком ЗагруженИзСтороннейБД = истина, тогда отказ.
6 DmitrO
 
10.03.15
17:23
тут противоречие в том что: "в форме" и "в подписке" - это не для 1С, они не поддерживают сценарии работы с подписками для целей логики форм.

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

(5) а зачем при этом проверять модифицированность? если загружен просто Отказ и все.. разве нет?
7 ProDeveloper
 
10.03.15
17:28
(6) Никаких противоречий нет, ты просто не допонял. Все уже реализованно и работает. Смотри код в (0). Просто хотелось узнать у людей вдруг кто знает более изящное решение.
8 ProDeveloper
 
10.03.15
17:29
(6) Смысла залезать в форму каждого объекта справочника и документа коих в ERP 2.0 превеликое множество не вижу. Не вижу ещё и потому, что с таким подходом получаем гемор при обновлении.
9 DmitrO
 
10.03.15
17:36
А если документ загружен (в РС.СоответсвияОбъектов есть соответствие) но не модифицирован, запись должна пройти без отказа?
10 ProDeveloper
 
10.03.15
17:39
(9) Да, допустим захотели перепровести документ по той или иной причине. Причем не забывай, что перепровести документ можно не открывая форму документа, тупо из списка.