Имя: Пароль:
1C
 
Как быстро сравнить справочник номенклатур
0 Hillsnake
 
11.07.19
11:57
2 базы ERP, в одной больше номенклатур  чем в другой.


нужно выяснить на какие номенклатуры отличаются и догрузить их . Загрузка есть, это не сложно.

кончено здорово было бы сделать 2х сторонний обмен КД3. но это разовая акция.

как лучше сделать.
1 выгрузить номенклатуры в xml и сравнить 2 xml. очень долго.

2. развернуть SQl и там сравнить.

3.. еще варианты.
1 shuhard
 
11.07.19
11:59
(0) в xls + ADODB  + обработка сравнения
2 Hillsnake
 
11.07.19
12:00
(1) xls ??

да он там умрет
xml  файл то формируется в 60 ГБ.

номенклатур многА!
3 _Дайвер_
 
11.07.19
12:03
ручками
4 shuhard
 
11.07.19
12:04
(2) а что ещё форум должен угадать ?
5 Hillsnake
 
11.07.19
12:06
(4) если было бы мало, я бы не спрашивал.
(3) смишно .
6 shuhard
 
11.07.19
12:08
(5) сиквел
7 Hillsnake
 
11.07.19
12:11
(6) да вот склоняюсь к этому варианту.

главное чтоб ADODB   быстро отработал в выгрузку.  


строкаПодключения = "driver={SQL Server};server="+ стрПараметры.серверИмя +
                        ";uid='"+ стрПараметры.серверПользователь +
                        "';pwd='"+ стрПараметры.серверПароль+
                        "';database="+ стрПараметры.серверБаза +
                        ";trusted_connection=yes";
    АДОДБКоннект = Новый COMОбъект("ADODB.Connection");
    Попытка
        АДОДБКоннект.ConnectionTimeout = 0;
        АДОДБКоннект.Open(строкаПодключения);
        Возврат АДОДБКоннект;
    Исключение
        Предупреждение("Невозможно установить соединение с SQL-сервером " + стрПараметры.серверИмя + " " + ОписаниеОшибки());
        АДОДБКоннект.Close();
        Возврат Ложь;        
    КонецПопытки;

думаю что то вроде этого.
8 _Дайвер_
 
11.07.19
12:13
Эта задача делается просто, пишешь обработку с COM соединением, выясняешь общие параметры(например код), пишешь запрос
"ВЫБРАТЬ
|    Номенклатура.Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Код = &Код"
Проверяешь по условию если есть, идешь дальше, если нет то так же через COM создаешь новую номенклатуру "Соединение.Справочники.Номенклатура.СоздатьЭлемент();", попутно проверяя это группа или нет, и заполняешь параметры, у меня таккая обработка есть, писал как-то для похожей ситуации, правда базы разнородные были
9 Hillsnake
 
11.07.19
12:15
(8)  COM соединением? я думаю  это будет делаться месяц.
В курсе, что Комы не поддерживаются 64 платформой.
10 sitex
 
naïve
11.07.19
12:21
(9) О каком количестве идет речь?
11 _Дайвер_
 
11.07.19
12:22
(9) В курсе что поддерживается 64 платформой
12 sitex
 
naïve
11.07.19
12:23
(9) также базы SQL на одном сервере находятся ?
13 shuhard
 
11.07.19
12:24
(9)[В курсе, что Комы не поддерживаются 64 платформой.]
тебя обманули
14 Hillsnake
 
11.07.19
12:26
(10) 800 тыс.
(13) хмм возможно .  но Если сравнивать Ком с Адодб. явно будет быстрее даже на том же xls.
15 Hillsnake
 
11.07.19
12:27
(12) нет.
16 PiotrLoginov
 
11.07.19
12:31
(14) >>Если сравнивать Ком с Адодб. явно будет быстрее даже на том же xls.

ерунда
17 shuhard
 
11.07.19
12:32
(16) ты бредишь
18 Garykom
 
гуру
11.07.19
12:34
Быстрее всего будет выгрузить два файла в CSV, загрузить их в Access и там сравнить запросом.
19 Seriy_Volk
 
11.07.19
12:36
(0) была подобная задача, справочник номенклатура около миллиона записей. Через запрос MS SQL синхронизация заняла около одной минуты, так что я за п.2
запрос в духе insert ... from select ... where not EXISTS (select...)
20 arsik
 
гуру
11.07.19
12:37
(0) А сравнивать номенклатуру по каким полям будешь?
21 1Сергей
 
11.07.19
12:37
800 тыс в 60 гб????
Кучеряво живёте :)
22 Garykom
 
гуру
11.07.19
12:39
(18)+ Вместо MS Access можно использовать любой SQL сервер с которым лучше знакомы.
23 Hillsnake
 
11.07.19
12:42
(18)  CSV 60 ГБ?? он просто вывалится.
(16) http://catalog.mista.ru/public/64883/ не ерунда,  вот провели эксперимент.
24 Garykom
 
гуру
11.07.19
12:43
(23) Куда вывалится? HDD/SSD у тебя вывалится из системника да?

Построчно пиши. В файл, текстовый. С расширением CSV. По формату.
25 Hillsnake
 
11.07.19
12:44
(21) это по минимуму характеристик. да когда то, загрузили все запчасти с дуру, от жадности.

как начинаешь говорить, что там 80  процентов ненада. сразу вопли нам все ннннада!!
26 Hillsnake
 
11.07.19
12:45
(24) с ошибкой по памяти. (20) характеристики  и еще парочка. по минимуму.
27 Garykom
 
гуру
11.07.19
12:46
(24)+

Файл = Новый ЗаписьТекста(ИмяФайла);
Файл.ЗаписатьСтроку("Привет!");
Файл.ЗаписатьСтроку("Как дела?");
Файл.Закрыть();


Вот это тебе позволит хоть несколько террабайт забить на диске, если файловая система может.
28 Garykom
 
гуру
11.07.19
12:46
(26) Тупица. Извини сорвался.
29 Garykom
 
гуру
11.07.19
12:47
Но реально вводит в недоумение когда человек с такой полоской и "типа программист" показывает такие проблемы в базовых знаниях.

ПОСТРОЧНАЯ запись в текстовый файл, сразу на диск. Какая еще к черту память?
30 arsik
 
гуру
11.07.19
12:49
(29) Долго будет построчно. Наверно лучше порциями по метров 10 хотя бы.
31 Garykom
 
гуру
11.07.19
12:50
(30) А вот это уже оптимизация, причем размер порции можно на лету подбирать динамически засекая время.
32 Провинциальный 1сник
 
11.07.19
12:51
Я бы через КОМ сделал, но не поэлементно дергать, а запросом с примитивными типами вытащил в таблицу значений и её сериализацией перебросил через КОМ. И далее дело техники, сверка справочника с таблицей.
33 Garykom
 
гуру
11.07.19
12:52
(32) Как думаешь результат запроса где хранится? Учитывая чего то на 60 гигов?
34 Hillsnake
 
11.07.19
12:53
(30) вот именно.
(29) ты сам то такие эксперименты производил Чудише.
записать то запишет, но не факт что потом он откроется.
35 Garykom
 
гуру
11.07.19
12:53
(34) Рука лицо.

Ну делай файлы по полгига или по 100 метров и потом из по очереди и скорми в SQL.
36 Bigbro
 
11.07.19
12:53
(32) звучит как правильный вариант.
37 Garykom
 
гуру
11.07.19
12:54
(36) Ыыыы
38 Провинциальный 1сник
 
11.07.19
12:55
(33) Справочник вряд ли больше сотни мег. Всё в память спокойно влезет.
39 Garykom
 
гуру
11.07.19
12:55
(37)+ Потому что если на сервере >64Gb RAM то может и взлететь ))
40 Hillsnake
 
11.07.19
12:56
(35) слава богу дошло.

не все так просто.

думаю буду переводить в SQL. по кусочкам.
41 Garykom
 
гуру
11.07.19
12:57
(38) Возьми длины строк кода и наименования (учитывая что каждый символ 2 байта) и умножь на 800 тысяч.
Если кроме кода и наименования еще чего то надо то добавь в формулу расчета сколько надо памяти.
Ну и плюсом служебные в двойном запасе.
42 Провинциальный 1сник
 
11.07.19
12:59
(41) Ну тогда ой. 800 тысяч записей это не для сериализации, точно) Тогда фрагментами.
43 sitex
 
naïve
11.07.19
13:07
(40) В SQL запросом сравнить не предлагать ?
44 arsik
 
гуру
11.07.19
13:10
(43) А кстати можно на одном SQL сервере сравнить 2 таблицы из разных баз одним запросом?
45 sitex
 
naïve
11.07.19
13:12
(44) Можно
46 Garykom
 
гуру
11.07.19
13:13
(44) Зависит от sql сервера но обычно можно
47 sitex
 
naïve
11.07.19
13:14
Выгрузить первые 100 кодов номенклатуры

SELECT TOP 100 [_Code] FROM [_BASE_1].[dbo].[_Reference32] WHERE [_Code] NOT IN (SELECT [_Code] FROM [_BASE_2].[dbo].[_Reference32]);
48 Garykom
 
гуру
11.07.19
13:15
(44) Только сначала надо выяснить в какой табличке хранится на сервере номенклатура в этих двух базах и какие нужны поля.
Ну и довольно часто 1Сников напрямую к sql серверу боевому не подпускают, чтобы не ипортили.
49 sitex
 
naïve
11.07.19
13:15
(47) Если нет во второй таблице
50 DGorgoN
 
11.07.19
13:16
Про поля дополнительные не забудьте и про критерии сравнения.
51 Hillsnake
 
11.07.19
13:34
(43) сначала нужно выгрузить, потом сравнить.
52 hhhh
 
11.07.19
13:35
(41) 800тыс, наименование гдето 100 байт, получается 80 мб умножить на 2 = 160. (38) прав, в принципе.
53 Hillsnake
 
11.07.19
13:37
(48) это противоречит Лицензионному соглашению.
(50) в чтоку.
(52) посчитай еще поле описание, и характеристики. и 2 кода.
* на 10 получится.
54 sitex
 
naïve
11.07.19
13:40
Создать sql скрипт который выгрузит что есть в первой таблице и отсутствуют во второй по кодам и загрузить куда что  в какую базу не хватает если ---> Загрузка есть, это не сложно.
55 Hillsnake
 
11.07.19
13:42
(54) да думаю, так и поступлю.
56 Garykom
 
гуру
11.07.19
13:44
(55) Реквизит добавь в 1С для номенклатуры и sql скриптом сразу установи для дублей как надо
57 Garykom
 
гуру
11.07.19
13:45
(56)+ Только все эксперименты не на боевой базе 1С а на копии на том же sql сервере
58 Hillsnake
 
11.07.19
13:47
(57) это и так понятно.
(56) а вот реквизит низя. увы.
59 hhhh
 
11.07.19
13:48
(53) в запросе вы не будете выбирать поле Описание. Максимум Код и Наименование - это где-то 160 мб. Мизер.
60 Garykom
 
гуру
11.07.19
13:49
(58) Пиши в любой существующий текстовый, числовой или булевый, но надо чтобы в основной таблице для простоты а не доп.реквизиты в связанной.
61 Hillsnake
 
11.07.19
13:51
(59) про нормирую и буду Увы. до 800, или сколько то там знаков. + Характеристики + Ед изм.
много там. у некоторых есть спецификация в фото, но слава богу их мало.
62 hhhh
 
11.07.19
13:55
(61) как вы фото будете сравнивать? по распознаванию отдельных фигур на рисунке?
63 sitex
 
naïve
11.07.19
13:56
(62) Это уже надо ИИ внедрять. Отдельная тема.
64 Hillsnake
 
11.07.19
13:57
(62) нет по индентичности. хотя нет наверное не буду сравнивать.

нужно что то типа, если 2 одинаковых элемента у одного есть фото у другого нет.  (значит нужно добавить. )
65 sitex
 
naïve
11.07.19
14:19
(64) Можно конечно считать в SQL контрольную сумму строки таблицы, убрать несопоставимые данные. Лично не пробовал, но как вариант сранения в двух базах
66 HeKrendel
 
11.07.19
14:25
Ждем следующую тему, догрузил номенклатуру, как вернуть обратно ;-)
67 Serg_1960
 
11.07.19
14:28
(офф) Читал ветку и думал: "По каким полям (минимальному набору) идентификация идентичности будет?" Имхо, этот вопрос ещё никто толком не копал. А он крайне важен.
68 Hillsnake
 
11.07.19
14:30
(67) несомненно .
(66) смешно .
69 HeKrendel
 
11.07.19
14:36
(68) Отвечу на твою задачу, как БА- ответ на тип сравнения находится в должностной инструкции к системе по заведению справочника номенклатуры, если она актуальна

Если не актуальна, сбор технологии заведения справочника займет от 3-х дней до 2 недель, и после этого можно будет ставить задачу программеру,

написание что обработки, что КД, 16 часов с тестированием
70 HeKrendel
 
11.07.19
14:40
Ну это мое оценочное суждение по масштабам бедствия
71 Hillsnake
 
11.07.19
15:17
(69) 2 недели + 16 часов. ??

охренеть,  я уже почти все сделал.
72 HeKrendel
 
11.07.19
15:19
(71) Это же отлично
73 HeKrendel
 
11.07.19
15:24
отпишись когда из "почти все сделал" будет стоять в продакшене ;-)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn