Имя: Пароль:
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) Да, допустим захотели перепровести документ по той или иной причине. Причем не забывай, что перепровести документ можно не открывая форму документа, тупо из списка.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn