|
Задвоение элементов справочника с уникальностью по коду после обмена XML | ☑ | ||
---|---|---|---|---|
0
Vladal
27.06.12
✎
18:00
|
Есть самописная конфигурация, которая стоит во всех розничных магазинчиках компании.
У каждой базы есть свой префикс, по которому файлы выгрузки. Весь обмен между магазинами построен на текстовых файлах с идентификацией справочников по коду, а документов по номеру. При этом из офиса поступают все изменения номенклатуры - название, цена и документы перемещения товаров в магазины. а обратно получаем документы продаж. Я добавил префикс базы в номера документов и перенумеровал их, создал новый план обмена для консолидации всех баз в одну и получил косяки с дублями справочников - номенклатура-то одна, и создаётся в центральной базе, уникальность по коду, а в обмене еще и по внутренним идентификаторам. Как бы при обмене проверять элемент тоже по коду в справочнике, а не внутреннему идентификатору? |
|||
1
1C-band
27.06.12
✎
18:03
|
Это смотрится не при обмене, а в правилах обмена.
|
|||
2
Vladal
27.06.12
✎
18:04
|
Справочник Дисконты, уникальность кода, в код записан штрихкод карты
Вот пример XML: <?xml version="1.0" encoding="UTF-8"?> <v8msg:Message xmlns:v8msg="http://v8.1c.ru/messages"> <v8msg:Header> <v8msg:ExchangePlan>ВсеСоВсеми</v8msg:ExchangePlan> <v8msg:To>A1</v8msg:To> <v8msg:From>UN</v8msg:From> <v8msg:MessageNo>10</v8msg:MessageNo> <v8msg:ReceivedNo>5</v8msg:ReceivedNo> </v8msg:Header> <v8msg:Body> <CatalogObject.Дисконты> <Ref>182d4b5e-b864-11e1-93c4-0015589a9806</Ref> <DeletionMark>false</DeletionMark> <Скидка>5</Скидка> <Имя/> <Фамилия/> </CatalogObject.ИнформационныеКарты> </v8msg:Body> </v8msg:Message> В результате у меня есть несколько элементов с кодом 2205000039007, которые пришли из разных магазинов, где этот человек покупал, и соответственно, с разным внутренним идентификатором. |
|||
3
Vladal
27.06.12
✎
18:04
|
(1) В каких правилах? Я не в КД делаю, а планом обмена.
|
|||
4
Vladal
27.06.12
✎
18:05
|
</CatalogObject.ИнформационныеКарты>
... спалился ))) |
|||
5
Vladal
27.06.12
✎
18:06
|
Что-то мне подсказывает, что надо смотреть модуле справочника, ПриЗаписи, когда Обмен = Истина. Но как?
|
|||
6
sda553
27.06.12
✎
18:29
|
(5) Зачем, ну поймаешь ты, что записывается дубль с обмен=истина. Тебе от этого легче не станет
Тебе надо приводить номенклатуру к единым уидам. поиск и замена ссылок в помощь |
|||
7
Vladal
27.06.12
✎
18:32
|
а каким боком этот уид заменить?
Я сейчас в одной базе это сделаю, но прийдёт же опять обмен и всё по-новой. |
|||
8
Vladal
27.06.12
✎
18:33
|
Так же и с товарами - сколько баз, столько и дублей товаров.
|
|||
9
ПТР
27.06.12
✎
18:33
|
При XML_Обмене контроль уникальности не спасает от двойников. Все дело в т.ч. и в рассогласовании баз по реквизитам используемым в "ПКО". Например, в базе приемнике согласно "ПКО" ищется элемент по коду и наименованию с помощью запроса. Наименование приемника чуть другое, а код тот же и запрос естественно получается пустым. В этом случае будет создан и записан элемент с уже существующим кодом и чуть другим наименованием.
|
|||
10
sda553
27.06.12
✎
18:34
|
(7) Заменить гуид принято так: берешь элемент с ненужным гуид, делаешь такой же элемент с нужным гуид. обработкой поиск и замена ссылок заменяешь по всей базе первую ссылку на вторую, первую помечаешь на удаление и удаляешь
|
|||
11
sda553
27.06.12
✎
18:36
|
(9) ты глянь на его xml вначале
|
|||
12
Vladal
27.06.12
✎
18:39
|
(10) Это надо синхронизировать во всех базах.
Но фишка еще в том, что так со всеми справочниками - и с товарами, и с дисконтами. С дисконтами пока проще - некотрые покупатели покупают только в 1-2 магазинах, а товары (номенклатура и хаорактеристики) во всех. Они-то и продублировались. |
|||
13
Vladal
27.06.12
✎
18:47
|
Завтра продолжим.
|
|||
14
Vladal
29.06.12
✎
09:48
|
_________________________________________________________________________________
Есть такая идея. При получении данных из XML я могу уже ими оперировать. То, как есть: Данные = ПрочитатьXML(ЧтениеХМЛ); // Записать полученные данные Попытка Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Данные.ОбменДанными.Загрузка = Истина; Данные.Записать(); Исключение ОбщегоНазначения.СообщитьОбОшибке("" + ТекущаяДата() + " -- " + ОписаниеОшибки()); Возврат; КонецПопытки; То, как я планирую: Данные = ПрочитатьXML(ЧтениеХМЛ); Ссылка = Справочники.ИнформационныеКарты.НайтиПоКоду(Данные.Код); Если НЕ Ссылка.Пустая() Тогда // вручную заполнить реквииты в существующем элементе справочника ... КонецЕсли; // Дальше - стандартными методами // Записать полученные данные Попытка Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Данные.ОбменДанными.Загрузка = Истина; Данные.Записать(); Исключение ОбщегоНазначения.СообщитьОбОшибке("" + ТекущаяДата() + " -- " + ОписаниеОшибки()); Возврат; КонецПопытки; |
|||
15
uraskin
29.06.12
✎
10:14
|
отлови событие "ПриЗаписи" во время обмена и проверяй, есть ли элемент с таким кодом в справочнике.
|
|||
16
Vladal
29.06.12
✎
10:17
|
(15) В самом элементе? В смысле в модуле справочника?
|
|||
17
uraskin
29.06.12
✎
10:19
|
ну да, там же есть ОбменДанными = Истина
|
|||
18
uraskin
29.06.12
✎
10:23
|
только дальше у тебя будет другая проблема, ссылки в документах на эту номенклатуру.
получается ты же ее не записываешь, и ссылка на нее в документе не сохранится. |
|||
19
uraskin
29.06.12
✎
10:25
|
будет типа <Объект: бла бла бла> не найден.
или не? |
|||
20
Vladal
29.06.12
✎
11:40
|
(19) Да вот... прийдётся вернуться "к истокам", как это было в старом обмене текстовиками - тотальный поиск по коду.
|
|||
21
Vladal
29.06.12
✎
11:44
|
(19) Я склоняюсь к тому, чтобы составить регистр сведений "Соответствия" и туда смотреть при обмене. Или сделать как в (6) - привести к единым ссылкам.
|
|||
22
pumbaEO
29.06.12
✎
11:51
|
(21) соответствия тебя спасут СоответствиеОбъектовДляОбмена , только добавишь для себя еще и Код или наименование в измерение.
И делай правила через КД, должно все автоматом построится. |
|||
23
Vladal
29.06.12
✎
12:22
|
(22) Я КД не использую, хотя наверно интересный инструмент.
|
|||
24
pumbaEO
29.06.12
✎
12:27
|
(23) Если частые изменения в реквизитах, то надо не забывать про изменения и правил, а так для аналогичных конфигураций, КД сам правила построит.
|
|||
25
Vladal
29.06.12
✎
12:29
|
(24) Ну да. Центрально обрабатывается количество покупок и корректируется скидка.
|
|||
26
Fish
29.06.12
✎
12:33
|
(25) Вот неплохой сайт по КД с примерами. ИМХО очень неплох для начального изучения КД: http://www.mykod.info/ Поройся, может, найдёшь, что нужно.
|
|||
27
Vladal
29.06.12
✎
12:38
|
(26) Спасибо.
|
|||
28
Vladal
29.06.12
✎
13:35
|
(6) А UUID никак нельзя сменить у существующего элемента?
|
|||
29
sda553
29.06.12
✎
20:46
|
(28) а смысл.? вот есть у тебя контрагент с уидом 10500 (для простоты). в базе на него 100500 документов, где этот контрагент вмкачестве реквизита.
Допустим ты нашел способ поменять контрагенту уид на 10501, что дальше? в базе у тебя будет куча доков с контрагетом "объект не найден 100500" т.к. такого контрагента больше нет, он ууид сменил. Т.е. надо не просто уид менять у контрагентаю а во всей базе данных, везде где он упоминался. И мы опять возвращаемся к способу (10) |
|||
30
Живой Ископаемый
29.06.12
✎
22:13
|
"мы сделали что-то неправильное, и все время этим пользовались.. Потом сделали правильное, но при этом все сломалось, в том числе наше неправильное... как теперь сделать правильное опять неправильным, что все работало как раньше"
|
|||
31
Vladal
06.07.12
✎
17:27
|
(29) нет. Я о том, что пройтись по всем периферийным базам и их УУИД сменить на такой, как у этого товара в центральной базе.
|
|||
32
Vladal
06.07.12
✎
17:27
|
(30) Стопудово.
На всякий случай я не ломал старое, пока не налажу новое. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |