|
Хеширование ссылки 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; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |