Имя: Пароль:
1C
1С v8
как в ПередЗапись() справочника проверить были ли изменения?
, ,
0 Сниф
 
28.11.11
10:51
Хочу добавить в справочник реквизит "ДатаПоследнегоИзменения". Заполнять его в обработчике ПередЗаписью() для новых и в случае, если данные изменились.

А вот как избежать ситуации: пользователь открыл элемент справочника, потыкал, вернул прежнее значение - у формы флаг модифированности есть, на вопрос "Записать?" ответил "Да".

Как сравнить все реквизиты и табличные части элемента справочника между объектом и тем, что хранится в базе по ссылке?
1 Поручик
 
28.11.11
10:54
Код для проверки отсюда можно взять http://infostart.ru/public/19949/
2 Сниф
 
28.11.11
10:57
(1) навороченный какой-то код. Может элегантнее ЗначениеВСтрокуВнутр() и строки сравнивать?
3 Ц_У
 
28.11.11
11:08
Например, через ссылку проверяй, Объект.Комментарий <> Объект.Ссылка.Комментарий
4 Поручик
 
28.11.11
11:12
(3) Ага, очень замечательно, через ссылку весь объект читать ради комментария.
5 Ц_У
 
28.11.11
11:16
(4) да я смотрю ты начитанный, сам то не через ссылку в (1) ?
6 Maxus43
 
28.11.11
11:16
(4) в (1) по сути тоже самое... запросом выдёргиваем нужные поля ссылки и сравниваем с объектом
7 aleks-id
 
28.11.11
11:18
покури как в универсальной загрузке ХМЛ реализована обработка флага "загружать только измененные"
8 Сниф
 
28.11.11
11:44
(7) если это написано про обработку с инфостарта, то у меня доступа нет.
9 aleks-id
 
28.11.11
11:57
(8) какой нафиг старт. во всех конфах есть универсальный обмен в формате хмл
10 Поручик
 
28.11.11
12:02
(8) Могу продать. Обращайся.
11 Stepa86
 
28.11.11
12:11
А точно надо заморачиваться со сценарием "потыкал чо та на форме, получил модифицированность, нажал записать"? Раз чо то тыкал и записал - вот те и последнее изменение, и пофик, что оно совпало с предыдущими значениями
12 Сниф
 
28.11.11
12:16
(11) если пользователь потыкал и по сути ничего не изменил, но перезаписал, то ДатаПоследнегоИзменения увеличивается и объект попадет в план обмена, хотя он там для обмена и не нужен, так  как реально не был изменен. Лишние движения.
13 aleks-id
 
28.11.11
12:18
(12) если он (внимание, ключевое слово!) _перезаписал_, то объект полюбому попадет в план обмена и ему плевать - изменил ты дату или нет.
14 Kreont
 
28.11.11
12:21
(0)Проверить строки до и после изменения через:
ЗначениеВСтрокуВнутр
15 Stepa86
 
28.11.11
12:26
(12) там настолько большой объект, что нужно потратить кучу времени на внедрение заглушки от сценария, который может быть в 1% всех случаев?
16 Сниф
 
28.11.11
12:28
(15) большой - код web-страницы для обновления с сайтом
17 hhhh
 
28.11.11
13:00
(16) нафига вы код web-страницы включили в обмен?  Приколисты.
18 Сниф
 
28.11.11
13:27
Вот что написал в результате, если кому интересно:

Процедура ПередЗаписью(Отказ)
   
   ДанныеИзменились = ЭтоНовый();    
   Если НЕ ДанныеИзменились Тогда
       
       Если НЕ СравнитьОбъекты(ЭтотОбъект, Ссылка.ПолучитьОбъект()) Тогда
            ДанныеИзменились = Истина;
       КонецЕсли;                        
   КонецЕсли;                        
   Сообщить(ДанныеИзменились);
КонецПроцедуры

//сравнивает два произвольных объекта, возвращает Истина, если они равны.
Функция СравнитьОбъекты(об1, об2)

   стрXML1 = СериализоватьОбъектXDTO(об1);
   стрXML2 = СериализоватьОбъектXDTO(об2);

   Возврат (стрXML1 =  стрXML2);
КонецФункции // СравнитьОбъекты()

Функция СериализоватьОбъектXDTO(Объект) Экспорт
   
   ЗаписьXML = Новый ЗаписьXML();
   ЗаписьXML.УстановитьСтроку();
   СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Объект, НазначениеТипаXML.Явное);
   СтрокаXML = ЗаписьXML.Закрыть();

   Возврат СтрокаXML;
КонецФункции
19 hhhh
 
28.11.11
13:34
(18) а он у вас разве не будет сравнивать эти коды web-страниц?
20 Сниф
 
28.11.11
13:37
(19) если html хранится в реквизите справочника, то сравнит, конечно.
21 kosts
 
28.11.11
13:37
(13) Это если автоматическая регистрация. Если ручная, то есть место для фантазии.
22 hhhh
 
28.11.11
14:28
(20) тогда это будет дольше чем обмен.
Независимо от того, куда вы едете — это в гору и против ветра!