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