Имя: Пароль:
1C
1С v8
Хеширование ссылки 1с - как проще реализовать?
0 suvolod
 
26.02.13
12:01
Мне нужно организовать обмен со сторонней базой (не 1С) справочниками и некоторыми документами. Помимо прочего, нужно каким-то образом передать признак того, что элемент справочника / документ был изменен. Хочу просто передавать хеш такого элемента. Предполагается, что предыдущее значение хеша будет хранить сторонняя база, в момент загрузки сравнивать старое и новое значение и, если они не совпадают, повторно загружать (перезаписывать) ранее загруженный элемент.

Насколько знаю, хешироваться могут только строки..Как тогда проще/правильнее перевести Ссылку в строку 1С? Ведь мне не просто строковый УИД ссылки нужен, (или ЗначениеВСтрокуВнутр, например), а такая строка, которая гарантированно измениться при изменении любого реквизита /  строки ТЧ переданной ссылки.
1 Balonbl4
 
26.02.13
12:03
Планы обмена используйте.
2 suvolod
 
26.02.13
12:04
через планы обмена не хочу. программы абсолютно разные, да и по условиям задачи меня попросили просто передавать в формируемый xml-файл хеш выгружаемого объекта
3 kosts
 
26.02.13
12:05
(2) Версия данных
4 pumbaEO
 
26.02.13
12:05
uuid+версия данных
5 pumbaEO
 
26.02.13
12:07
объект -> xml -> md5
6 kosts
 
26.02.13
12:08
(2) Но по любому планы обмена было бы удобнее...
Т.к. тебе придется выгружать все элементы вместо того, что бы просто выгрузить перезаписанные
7 suvolod
 
26.02.13
12:10
(3), (4), (5) - Спасибо. Оба способа подойдут. Про версию данных - только сейчас понял, когда это свойство может пригодиться
8 suvolod
 
26.02.13
12:13
(6) Тогда нужно будет или квитирование сообщений как-то прописывать, или периодически сбрасывать регистрацию изменений.
9 kosts
 
26.02.13
12:13
Можно сделать то что хочешь, немного по другому.

1. В планах обмена хранить только действительно измененные объекты (а не просто записанные).
2. Во время записи объекта сверять его с базой дынных
Например Ссылка.Наименование = Объект.Наименование
И если было изменение, то добавляем в план обмена.
10 pumbaEO
 
26.02.13
12:16
при передачи данных и сбрасывай регистрацию.
11 suvolod
 
26.02.13
12:20
(9), (10). Принимающая сторона не обеспечивает гарантированной загрузки данных. Грубо говоря, если на той стороне что-то глюкнет, а я уже затру регистрацию изменений - пойдет рассинхронизация данных. Да и по условиям задачи выгружаемые справочники редактируются постоянно, и количество элементов в них не превышает 50.000, а выгружаемые документы ограничены периодом в 2-4 недели. Мне проще их выгрузить как есть, просто как "затребованные за период данные", а вторая сторона пусть сама разбирается, что с ними делать.
12 kosts
 
26.02.13
12:30
(11) Если тебе придется сопровождать эту систему, то лучше сразу сделать по уму.
А каждый раз проверять 50000 элементов накладно...
13 Serg_1960
 
26.02.13
12:34
"На стороне" 1С всё потребное автору легко реализуемо - оно уже есть в типовых :) И планы обмена, и даже есть где посмотреть впервые выгружается ссылка или нет...
14 kosts
 
26.02.13
12:36
v8: как в ПередЗапись() справочника проверить были ли изменения?

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

//сравнивает два произвольных объекта, возвращает Истина, если они равны.

Функция СравнитьОбъекты(об1, об2)

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

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


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

   Возврат СтрокаXML;
КонецФункции
Закон Брукера: Даже маленькая практика стоит большой теории.