Имя: Пароль:
1C
1С v8
v8: Есть плохая идея. Что скажете?
0 ТутЯ
 
09.09.13
11:19
1с8.2 Управляемые формы. Самописанная конфигурация.
Есть справочник "Работы".
Есть большая таблица значений 2,5 млн записей(группы и элементы).

Задача: загрузить таблицу значений в справочник.

Проблема: Средствами 1с очень долго.

Вопросы:
Какие есть решения проблемы?
Можно ли грузить прямо в СКЛ таблицы? Смотрю ПолучитьСтруктуруХраненияБазыДанных - все понятно. Смотрю на таблицы - не понятно как формируется код ссылки.
1 Maxus43
 
09.09.13
11:21
Да, идея плохая + нарушение лиц соглашения.

Грузи так, одноразовая операция же, на ночь поставил и всё
2 ТутЯ
 
09.09.13
11:22
Ночи не хватает
3 Славен
 
09.09.13
11:22
Выходные
4 Maxus43
 
09.09.13
11:22
(2) в одной транзакции поди делаешь ещё?
5 kortun
 
09.09.13
11:23
(2) должно хватать, 2.5 млн. записей это не так много
6 Славен
 
09.09.13
11:23
3-5 фоновых заданий и в путь
7 ТутЯ
 
09.09.13
11:23
пробовала и транзакции резать и с перерывами ее делать
8 Базис
 
naïve
09.09.13
11:23
Программист нужен, видимо.
9 Maxus43
 
09.09.13
11:23
(7) без транзакций делай вобще, это ж справочник
10 ТутЯ
 
09.09.13
11:24
про фоновые задания не поняла что-то... подскажи,
плиз
11 ТутЯ
 
09.09.13
11:24
и без транзакций пробовала. Этот вариант мне больше понравился.
12 Базис
 
naïve
09.09.13
11:25
А формировать ТЗ кусками пробовала?

100К записей за какое время грузится?

Все Сообщить() убирай, они тормозят вывод - достаточно Состояние() каждые тыщу строк.
13 ТутЯ
 
09.09.13
11:25
(5) возможно нужно еще пару часов, но пользователи не могут работать, сервер перегружен. Это если я в тестовую гружу.
14 Maxus43
 
09.09.13
11:26
Код в студию
15 ТутЯ
 
09.09.13
11:26
(12)да, пробовала
100К- не поняла это что?
"Сообщить" нет все убрала.
16 Maxus43
 
09.09.13
11:26
В пердЗаписью, ПриЗаписи в справочнике есть что? ОбменДанными.Загрузка = Истина добавь
17 fisher
 
09.09.13
11:26
(0) Надеюсь, ТЗ - не реквизит формы?
18 Базис
 
naïve
09.09.13
11:27
Фотка есть, можешь теперь код выкладывать.

Но я уехал на обед.
19 le_
 
09.09.13
11:28
(0) А ТЗ откуда берется?
20 ТутЯ
 
09.09.13
11:28
(17) нет не реквизиты. ТЗ собирается из кучи текстовых файлов. Это каталоги Ельза по запчастям...может кто пользовался и грузил?
21 пипец
 
09.09.13
11:28
тз на УФ ? мдя ...
22 ТутЯ
 
09.09.13
11:28
(16 ) попробую, спасибо
23 ТутЯ
 
09.09.13
11:29
(21) нучи как правильно, плиз
24 mistеr
 
09.09.13
11:29
(0) А в чем проблема грузить ночью по частям? И почему обязательно из ТЗ. Обычная загрузка из таб. документа справится.
25 Maxus43
 
09.09.13
11:29
(22) хотя самописка, я не знаю что в этих процедурах у вас, короче при загрузке надо отключать оттуда код исполняемый
26 le_
 
09.09.13
11:30
(20) Можно же по частям их грузить. Определенное количество файлов в сутки...
27 fisher
 
09.09.13
11:31
(20) Собирай их в ТЗ на сервере, а не на клиенте. Чтобы в алгоритме загрузки данных в справочник клиент вообще практически не участвовал. Ессно надо чтобы файлы были доступны с сервера.
28 ТутЯ
 
09.09.13
11:31
(26) да, но если процедуру выполнять раз в месяц, то хотелось бы все на автомате
29 ТутЯ
 
09.09.13
11:33
(27) на сервере собирается
30 NcSteel
 
09.09.13
11:33
(0) Грузил миллионы записей и обходилось все часами... Что то у вас в коде подурацки.
31 ТутЯ
 
09.09.13
11:34
Давайте посмотрим на код дурацкий, плиз. Щас скину. Скажите что именно дурь
32 le_
 
09.09.13
11:36
(28) Имя последнего загруженного в сесии файла (или индекс какой-нибудь в списке файлов) можно сохранять куда-нибудь и в след. раз начинать со следующего. Вполне можно автоматизировать. Регламентное задание можно сделать.
33 fisher
 
09.09.13
11:36
(29) Хм... Если запись порционными транзакциями не помогает, значит или тебе не помочь (упираешься в скорость записи) из 1С или есть бока (типа заполнения каких-то данных через точку, что равноценно запросу в цикле).
34 fisher
 
09.09.13
11:36
"(упираешься в скорость записи из 1С)"
35 Жан Пердежон
 
09.09.13
11:37
подписки по возможности отключи на время загрузки, если подписки свои - добавь в них проверку на ОбменДанными.Загрузка.

Индексы грохни, если есть.
36 fisher
 
09.09.13
11:37
Элементарный замер производительности должен показать, где корень зла.
37 NcSteel
 
09.09.13
11:37
я уверен, что там шняга в цикле .... поэтому и тормозит.
38 NcSteel
 
09.09.13
11:38
(36) +100500
39 ТутЯ
 
09.09.13
11:38
Есть процедура в которой создается массив, в массиве таблицы значений. Эти типа таким образом разбила большую таблицу значений.




Процедура ОбработатьМассивДанныхAPOS(МассивДанных)

...обработка текстовых файлов

МассивБольшой = Новый Массив;

...заполняем таблицы значений этого большого массива


Для Каждого СтрокаМассива Из МассивБольшой Цикл  
        ТаблицаРезультат = СтрокаМассива;
        
        ТаблицаРезультат.Свернуть("nn,code,ncode,Name,fullname,counts,grp,
        |isgroup,codeХ,ncodeХ,NameХ,fullnameХ,countsХ,grpХ,isgroupХ,КоличествоХ","");
        ТаблицаРезультат.Сортировать("nn Возр");
        
        ПеренестиСерверРаботыЕльза(ТаблицаРезультат);
КонецЦикла;    

КонецПроцедуры


&НаСервере
Процедура ПеренестиСерверРаботыЕльза(МассивДанных)
    
    //СоответствиеГрупп = Новый Соответствие;
    Ном = 0;
    
    НачатьТранзакцию();
    Счетчик = 0;    

    Для Каждого СтрокаМассива Из МассивДанных Цикл
        Ном = Ном +1;

        
        //Родитель = СоответствиеГрупп.Получить(СтрокаМассива.grp);
        
        
        Родитель = Неопределено;
        НайденнаяСтрока = ТаблицаГрупп.НайтиСтроки(Новый Структура("grp",СтрокаМассива.grp));
        Если  НайденнаяСтрока.Количество()>0 Тогда
             Родитель = НайденнаяСтрока[0].grpСсылка.Ссылка;
        КонецЕсли;
        
        Запрос = Новый Запрос();
        ТекстЗапроса = "ВЫБРАТЬ
        |    ГруппыРабот.Ссылка
        |ИЗ
        |    Справочник.Работы КАК ГруппыРабот
        |ГДЕ
        |    ГруппыРабот.Родитель = &Родитель
        |    И ГруппыРабот.Наименование = &Наименование
        |    И ГруппыРабот.ЭтоГруппа = &ПризнакГруппы
        |    И ГруппыРабот.КодСервиса = &Код
        |АВТОУПОРЯДОЧИВАНИЕ";
        
        Запрос.Текст = ТекстЗапроса;
        
        Запрос.УстановитьПараметр("Родитель", Родитель);
        Запрос.УстановитьПараметр("Наименование", СтрокаМассива.name);
        Запрос.УстановитьПараметр("Код", СтрокаМассива.code);
        
        Если СтрокаМассива.isgroup=1 Тогда
            
            Запрос.УстановитьПараметр("ПризнакГруппы", Истина);

            Результат = Запрос.Выполнить().Выбрать();
            
            Если Результат.Следующий() Тогда
                НовыйЭлемент = Результат.Ссылка;  
            Иначе
                НовыйЭлемент = Справочники.Работы.СоздатьГруппу();
                НовыйЭлемент.КодСервиса = СтрокаМассива.code;
                НовыйЭлемент.Наименование = СтрокаМассива.name;
                НовыйЭлемент.Родитель = Родитель;        
                НовыйЭлемент.Записать();
            КонецЕсли;
            //СоответствиеГрупп.Вставить(СтрокаМассива.code, НовыйЭлемент.Ссылка);
            НоваяСтрока = ТаблицаГрупп.Добавить();
            НоваяСтрока.grp = СтрокаМассива.code;
            НоваяСтрока.grpСсылка = НовыйЭлемент.Ссылка;
            
            
        Иначе    
            Запрос.УстановитьПараметр("ПризнакГруппы", Ложь);
            
            Результат = Запрос.Выполнить().Выбрать();
            
            Если Результат.Следующий() Тогда
                НовыйЭлемент = Результат.Ссылка.ПолучитьОбъект();  
            Иначе
                
                НовыйЭлемент = Справочники.Работы.СоздатьЭлемент();
                НовыйЭлемент.КодСервиса = СтрокаМассива.code;
                НовыйЭлемент.Наименование = СтрокаМассива.fullname;
                НовыйЭлемент.КодПроизводителя= СтрокаМассива.ncode;
                НовыйЭлемент.КоличествоНЧ= СтрокаМассива.counts;
                НовыйЭлемент.Родитель = Родитель;
            КонецЕсли;
            
            Попытка
                Вложение = СтрокаМассива.codeХ;                                        
            Исключение                                                    
                Вложение = Неопределено;                                  
            КонецПопытки;
            
            Если НЕ Вложение = Неопределено И ЗначениеЗаполнено(Вложение)Тогда
                //Родитель = СоответствиеГрупп.Получить(СтрокаМассива.grpХ);
                РодительХ = Неопределено;
                //НайденнаяСтрока = ТаблицаГрупп.Найти(СтрокаМассива.grpХ,"grp");
                НайденнаяСтрока = ТаблицаГрупп.НайтиСтроки(Новый Структура("grp",СтрокаМассива.grpХ));
                
                Если НайденнаяСтрока.Количество()>0 Тогда
                    РодительХ = НайденнаяСтрока[0].grpСсылка.Ссылка;
                КонецЕсли;

                
                Запрос2 = Новый Запрос();
                Запрос2.Текст = ТекстЗапроса;
                
                Запрос2.УстановитьПараметр("Родитель", РодительХ);
                Запрос2.УстановитьПараметр("Наименование", СтрокаМассива.fullnameХ);
                Запрос2.УстановитьПараметр("Код", СтрокаМассива.codeХ);
                Запрос2.УстановитьПараметр("ПризнакГруппы", Ложь);
                Результат2 = Запрос2.Выполнить().Выбрать();
            
                Если Результат2.Следующий() Тогда
                    НовыйВложенный = Результат2.Ссылка;  
                Иначе
                    НовыйВложенный = Справочники.Работы.СоздатьЭлемент();
                    НовыйВложенный.КодСервиса = СтрокаМассива.codeХ;
                    НовыйВложенный.Наименование = СтрокаМассива.fullnameХ;
                    НовыйВложенный.КодПроизводителя = СтрокаМассива.ncodeХ;
                    НовыйВложенный.КоличествоНЧ = СтрокаМассива.countsХ;
                    НовыйВложенный.Родитель = РодительХ;
                    НовыйВложенный.Записать();
                КонецЕсли;
                НоваяСтрока = НовыйЭлемент.Работы.Добавить();
                НоваяСтрока.Работа = НовыйВложенный.Ссылка;
                НоваяСтрока.ДополнительноКТО = Истина;  
                НоваяСтрока.Количество = СтрокаМассива.КоличествоХ;
            КонецЕсли;
            
            НовыйЭлемент.Записать();
        КонецЕсли;
        
        Счетчик=Счетчик+1;
        Если Счетчик=100 Тогда
            ЗафиксироватьТранзакцию();
            
            Для Ии=1 по 1000000 цикл
            КонецЦикла;

            
            НачатьТранзакцию();
            Счетчик=0
        КонецЕсли;

    КонецЦикла;
    ЗафиксироватьТранзакцию();

КонецПроцедуры
40 rotting
 
09.09.13
11:39
убери запрос из цикла
41 ТутЯ
 
09.09.13
11:40
(40) уберу
42 NcSteel
 
09.09.13
11:41
В общем и запросы в цикле и
НайденнаяСтрока = ТаблицаГрупп.НайтиСтроки(Новый Структура("grp",СтрокаМассива.grpХ));

Не радует.
43 ТутЯ
 
09.09.13
11:41
(36) именно в процессе записи в справочник тормозит
44 ТутЯ
 
09.09.13
11:42
(42) какой вариант по группам тогда?
45 rotting
 
09.09.13
11:43
(43) показывай процедуру ПриЗаписи()
46 NcSteel
 
09.09.13
11:43
(44) Непонятно что эта за таблица и очему в ней надо что то искать. Так же есть ли в ней индекс.
47 NcSteel
 
09.09.13
11:44
Так же нет ОбменДанными.Загрузка = Истина
48 fisher
 
09.09.13
11:44
(43) Что, вот прямо показывает 95% на "НовыйЭлемент.Записать()", ежели без транзакций?
49 ТутЯ
 
09.09.13
11:44
(46) это таблица соответствий для родителей
50 ТутЯ
 
09.09.13
11:45
(45) Нашла только вот это:

Процедура ПередЗаписью(Отказ)
    
    Если ОбменДанными.Загрузка=Истина Тогда
        Возврат;
    КонецЕсли;
    
    Если Не ЭтоГруппа И ЗначениеЗаполнено(Ссылка) И ВыбранныеРаботыПодбиратьВЗаказНаряд<> Ссылка.ВыбранныеРаботыПодбиратьВЗаказНаряд Тогда
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ПРЕДСТАВЛЕНИЕ(РаботыРаботы.Ссылка) КАК Владелец
        |ИЗ
        |    Справочник.Работы.Работы КАК РаботыРаботы
        |ГДЕ
        |    РаботыРаботы.Работа = &Работа";
        
        Запрос.УстановитьПараметр("Работа", Ссылка);
        
        Результат = Запрос.Выполнить();
        
        Если не Результат.Пустой() Тогда
            
            Отказ = Истина;
            Сообщить("Данная работа входит в состав комплектов:");
            
            ВыборкаДетальныеЗаписи = Результат.Выбрать();
            
            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                Сообщить(ВыборкаДетальныеЗаписи.Владелец);
            КонецЦикла;
            
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры
51 fisher
 
09.09.13
11:46
(50) Гы! Ну, воткни НовыйЭлемент.ОбменДанными.Загрузка = Истина. Или уже предлагали?
52 ТутЯ
 
09.09.13
11:47
(48) да, только 50%
53 ТутЯ
 
09.09.13
11:47
Да, тоже думаю что так, но куда прикрутить подскажите.
54 ТутЯ
 
09.09.13
11:48
(51) Не поняла где такое обращение
55 NcSteel
 
09.09.13
11:49
(54) у тебя его нет, а надо создать.
56 ТутЯ
 
09.09.13
11:49
(51) Дошло. Спасибо
57 ТутЯ
 
09.09.13
11:49
Щас попробую. Может сегодня самолет полетит...Сообщу)))
58 M0narch
 
09.09.13
11:49
(54) перед НовыйЭлемент.Записать();
59 ТутЯ
 
09.09.13
11:50
Да да. Спасибки
60 fisher
 
09.09.13
11:51
(52) На большом количестве итераций 50% кроме записи - многовато.
61 Maxus43
 
09.09.13
11:52
(60) там запросы в цикле и т.д., код вобще перегружен имхо, упростить надо всё
62 Chin
 
09.09.13
11:55
(0) Грузи пачками
63 SanGvin
 
09.09.13
11:56
такое надо на сервере, а не на клиенте запускать.
и еще я сталкивался с багом, что если писать ОбменДанными.Загрузка = Истина на больших объемах _иногда_ сжирает память на серваке.
64 ТутЯ
 
09.09.13
11:56
(61) а есть вариант разгрузить? Подскажите, пожалуйста.
65 ТутЯ
 
09.09.13
11:56
(63) на сервере конечно
66 ТутЯ
 
09.09.13
11:57
(63) она и так сжигается капитально
67 Жан Пердежон
 
09.09.13
11:57
чего фотка с мистой делает...
68 ТутЯ
 
09.09.13
12:00
(61) упросить код- это подготовить родителей. Каким образом?
69 Maxus43
 
09.09.13
12:04
НайденнаяСтрока = ТаблицаГрупп.НайтиСтроки(Новый Структура("grp",СтрокаМассива.grp));

НайтиСтроки по одному столбцу - не имеет смысла, всё равно первый берёшь.

ТаблицаГрупп.найти(СтрокаМассива.grp, "имя столбца"); используй
70 ТутЯ
 
09.09.13
12:07
(69) так и было изначально, но 1с ругается
71 ТутЯ
 
09.09.13
12:09
(69) чего-то не догоняю, а почему первый. Все верно находит
72 ТутЯ
 
09.09.13
12:09
я же часть данных загруженных вижу и родители все верно встали
73 Maxus43
 
09.09.13
12:31
(70) как ругается то?
74 ТутЯ
 
09.09.13
12:34
(73) уже не помню. ТаблицаГрупп- реквизит формы
75 ТутЯ
 
09.09.13
12:34
она не большая получается
76 Лефмихалыч
 
модератор
09.09.13
12:52
(0) есть хорошая идея - не грузить 2.5 млн записей в справочник
77 ТутЯ
 
09.09.13
12:57
(76) А продолжение идеи есть?
78 Reaper_1c
 
09.09.13
12:58
(77) Зацепить как внешний источник.
79 Лефмихалыч
 
модератор
09.09.13
12:59
(77) ну, не делать и всё. Выбрать только нужное и эти самые полторы сотни записей и загрузить, а остальное пусть себе гниет
80 ТутЯ
 
09.09.13
13:00
как я узнаю нужные?))))
81 ТутЯ
 
09.09.13
13:02
(78) и (79) не подходит
82 Лефмихалыч
 
модератор
09.09.13
13:03
(80) исходя из задачи - где-то в ней закопано то, зачем это все нужно и вот на основании этого "зачем" и можно принять решение, что нужно, а что нет.
83 ТутЯ
 
09.09.13
13:04
выясняю у заказчика...минуту)))
84 ТутЯ
 
09.09.13
13:05
меня поставили перед фактом...пришел аудит такой-то сякой и в такой-то день каталог должен быть в 1с...Щас уточную можно его оставить не в 1с...)))
85 Лефмихалыч
 
модератор
09.09.13
13:05
если заказчик скажет: "мне нужен каждый элемент из этих 2.5млн каждый день 24/7", знай - он врёт. Не бывает людей, которым нужны справочники по 2.5 млн записей.
86 ТутЯ
 
09.09.13
13:06
да это все понятно. Нужно уточнить на сколько жесткие требования. Пока не стала грузить не поняла проблему...
87 Enders
 
09.09.13
13:08
Особенно радует сообщение (28)
" да, но если процедуру выполнять раз в месяц, то хотелось бы все на автомате"
Это получается что каждый месяц вы будете добавлять в справочник по 2 млн записей?Оо
88 ТутЯ
 
09.09.13
13:08
не, обновление данных, там еще цифры есть...
89 ТутЯ
 
09.09.13
13:09
это не щас...главное придумать как загрузить, или не грузить, но использовать откуда-то
90 ТутЯ
 
09.09.13
13:10
заказчик пока молчит...жду...
91 Enders
 
09.09.13
13:11
Смотря что надо.
Если просто информационно и нигде не будет использоваться.
И надо каждый раз очищать и загружать заново, то имхо, в регистр. Хотя всё равно....
92 ТутЯ
 
09.09.13
13:11
нет...точно будет использоваться...
93 Odavid
 
09.09.13
13:11
(0) >>Средствами 1с очень долго.
а других в 1С нет.
Про SQL забудьте - в 8-ке он только для сервера 1С, а не для программистов.
Грузите через DBF - очень быстро выгружается и загружается.
94 ТутЯ
 
09.09.13
13:14
Требования жесткие. "Каталог должен быть в 1с!"
95 Odavid
 
09.09.13
13:14
(20)1C очень долго читает стандартными средствами текстовые файлы.
Используйте не то, что 1с рекомендует, а ЧтениеТекста.
А лучше - откажитесь от обработки текста в 1С вообще, и  слейте все текстовые файлы где-нибудь на стороне в одну DBF.
96 Odavid
 
09.09.13
13:15
(94) ну так и грузите.
Но не средствами "1С:Специалист".
97 ТутЯ
 
09.09.13
13:16
(93) Проблем нет вытащить в 1с. Проблема записать в справочник. Самый простой код ".Записать()" - вот в чем проблема. Написала процедуру записи в справочник. Вот тут и нужно перекопать и увеличить скорость.
98 M0narch
 
09.09.13
13:19
(97) на время загрузки изменить процедуру при записи и перед записью в конфе
99 Odavid
 
09.09.13
13:21
(97)>>Написала процедуру записи в справочник
тут нет вариантов.
Код платформы закрыт, и, вам остается либо всем восхищаться (как делает большинство) и дальше читать агитки 1С, либо молча "кушать какутус".
Единственно - загрузите частями ("Смотрите, вот он, справочник!"). Ведь никто не будет счиать, сколько там записей - 1 или 2 млн.
А потом подгрузите остальное.
100 ТутЯ
 
09.09.13
13:21
(98) сейчас запустила на тестирование с учетом ОбменДанными.Загрузка = Истина
Жду.
101 Simod
 
09.09.13
13:21
А вот это что за шняга:

           Для Ии=1 по 1000000 цикл
            КонецЦикла;

??
102 ТутЯ
 
09.09.13
13:22
(99)да, мне останется такой вариант
103 Odavid
 
09.09.13
13:23
(98) на что изменить? На "запиши все по-быстрому"??
Я уже рекомендовал 1С такую команду в нулевых, 1С только фыркнула в ответ.
104 ТутЯ
 
09.09.13
13:23
(101) можете на эту шнягу не смотреть - это пауза чтобы пользователи могли хоть что-то сделать со справочником работ. Иначе давала ошибки транзакции. Этот код уже закрыла и выгрузку делаю в тестовую.
105 Odavid
 
09.09.13
13:23
(101) это тестовый код имитации, если кто не понял.
106 Odavid
 
09.09.13
13:24
(104) а как пересекаются справочники Номенклатура и Работ??
107 maxile
 
09.09.13
13:26
Надо просто сертифицировать и найти потом сбыт иначе все труды напрасно. Все созданное должно иметь свою реализацию в конце концов. Иначе это просто фикция и ненужня трата энергии.
108 ТутЯ
 
09.09.13
13:26
(106) прошу прощения, что вопросом на вопрос...Я где-то опечаталась и написала Номенклатура?
109 ТутЯ
 
09.09.13
13:28
(106) Грузим в "Работы". "Номенклатура" завязана, но не в этот раз.
110 ТутЯ
 
09.09.13
13:33
(99) Справочник для аудита есть(ночью что-то загрузилось), но задача должна быть выполнена.
1. Загрузить что есть любым путем.
2. Раскрутить скорость и автоматом чтобы каждый месяц.
111 mikeA
 
09.09.13
13:36
Попробуй в транзакции записывать хотя бы тысяч по пять или десять элементов.
112 Odavid
 
09.09.13
13:37
(100)>> сейчас запустила на тестирование с учетом ОбменДанными.Загрузка = Истина
это на скорость записи не влияет, только на реагирование на ошибки создания и заполнения.
113 ТутЯ
 
09.09.13
13:37
(111) Отказалась от транзакции вообще.
На коде "НачалоТранзакции()" виснет на боевой базе. Кто знает причину?
114 ТутЯ
 
09.09.13
13:38
(112)а что значит на реагирование?
115 Odavid
 
09.09.13
13:39
(108)>>Я где-то опечаталась и написала Номенклатура?
>>Это каталоги Ельза по запчастям
Тогда - что за запчасти как "работа"?
116 Odavid
 
09.09.13
13:40
(109) 2,5 млн - это два с половиной миллиона работ??
117 Odavid
 
09.09.13
13:42
(110)>>2. Раскрутить скорость и автоматом чтобы каждый месяц.
грузите каждую ночь по 100 тыс наименований.
118 ТутЯ
 
09.09.13
13:42
(115) там так и есть...Даны позиции номенклатуры в одном файле, в другом файле нормо-часы, в другом файде модели авто, в другом файле группы, в другом связки....бред...еще полно всего...
Короче в итоге в 1с у меня получаются работы с нормо-часами.
119 ТутЯ
 
09.09.13
13:42
(116) работы и группы работ
120 Odavid
 
09.09.13
13:43
(111) >>Попробуй в транзакции записывать хотя бы тысяч по пять или десять элементов.
на скорость записи это тоже не влияет. Лишь на объем занимаемой памяти и вылеты при загрузке.
121 ТутЯ
 
09.09.13
13:43
(120) однозначно транзакции не будет и только ночная загрузка
122 Odavid
 
09.09.13
13:44
(118) я бы на DBF все соединил сначала (да хоть через 1С), а потом уже грузил один получившийся кусок.
123 ТутЯ
 
09.09.13
13:45
(112)мысль обдумываю, незнаю результата
124 Odavid
 
09.09.13
13:45
(121) "транзакция по 10 тыс" здесь абсолютно ни при чем.
Просто народ не понимает, зачем транзакции в 1С.
125 ТутЯ
 
09.09.13
13:45
как быстро открыть текстовый файл в дбф?
126 Odavid
 
09.09.13
13:46
(125) DBF быстро обрабатывается, чтение в 1С ТЕКСТОВОГО файла - весьма трудоемко.
А если еще и по рекомендациям 1С - то вообще конца не увидите.
127 ТутЯ
 
09.09.13
13:47
у меня текстовый в массивы, массив на сервер, на сервере в таблицы значений с индексами, из них собираются данные. Процесс по времени меня устраивает. Подскажите, если есть что лучше, пожалуйста.
128 ТутЯ
 
09.09.13
13:47
проблема не в чтении текстового
129 Odavid
 
09.09.13
13:48
(125) 1. Рекомендую обработать текстовики не в 1С.
2. Если (1 ) невозможно - обрабатывать тектсовики "в фоне", чтобы потом вечерком их автоматом перекидывать в 1С.
3. "В лоб" читать текстовики в 1С, обрабатывать и ждать, когда 1С соизволит все обработать. И при этом не отключится в забытье.
130 ТутЯ
 
09.09.13
13:49
вот смотрите...допустим я потрачу время чтобы 1с прочитала текст и создала дбф, потом буду дбф крутить и получу что-то похожее на то что у меня есть. И опять 10 часов не хватит чтобы записать...
131 Odavid
 
09.09.13
13:49
(128) с записью - только частями. Постоянно кидать части данных в свободное время сервера.
132 ТутЯ
 
09.09.13
13:49
Некому обработать текстовые. Надо кнопка старта и результат утром.
133 Odavid
 
09.09.13
13:50
(130) именно, тут вариантов нет. Либо вы сами разбиваете эти 10 часов на часы, либо - 1С "зависает" на все это время сама.
134 Odavid
 
09.09.13
13:51
(132) ну так загрузите все сначала, а потом будете делать поиск по базе и подгрузку отсутствующих данных.
135 Odavid
 
09.09.13
13:52
*загрузите сначала весь объем в 2,5 млн записей в 1С.
136 z0001
 
09.09.13
13:52
(0)какую-то ахунею тут понаписали...

1. то что у тебя в таблице значений помещаешь в таблицы скуля подключением чрез скуль его же средствами

2.апдейтишь из скуля свой справочник

быстрее способа нет, скуль просто ничтожно малое время занимает по сравнению с этими циклами всякими
137 z0001
 
09.09.13
13:54
если времени больше чем охренеть а данных меньше чем охренеть тогда можно втащить их порционно куда-нибудь в левую специально созданную структуру типа регистра сведений в 1С а потом уже обрабатывать
138 Odavid
 
09.09.13
13:54
(136) вы 1С-ой когда-нибудь занимались?
139 ТутЯ
 
09.09.13
13:54
(136) я человек простой и смысла-то не понимаю написанного
140 Odavid
 
09.09.13
13:55
(137)>>структуру типа регистра сведений в 1С
обращу внимание - даже РС не есть единая таблица в SQL.
141 ТутЯ
 
09.09.13
13:56
Я чего-то так думаю... я, наверно, подготовлю внешние готовые битые таблицы с элементами групп. И первоначально подгружу только группы, а потом частями по регламенту остальное...
142 Odavid
 
09.09.13
13:58
(141) вам в первом десятке ответов рекомендовали подгрузить сначала только сверхнужные данные. А потом и остальное.
143 ТутЯ
 
09.09.13
14:00
(142) Нужность не поняла сначала
144 ТутЯ
 
09.09.13
14:03
(142) да да, взяла все сказанное на заметку. Спасибо)))...
145 z0001
 
09.09.13
14:13
(138)да. ))) и кстати забыл написать что ссылки следует создавать средствами 1С а реквизиты (включая ссылочного типа) апдейтить скулем
146 Sj
 
09.09.13
14:16
(141) да, да. Делайте именно так, как и написали. И счастье будете тягать мешками.
147 z0001
 
09.09.13
14:28
(141)"готовые битые таблицы " прочел как битовые и крепко думал, прочитал верно и задумался ещё крепче )))
148 z0001
 
09.09.13
14:30
(141)не забудь реквизит синхронизации гарантированно уникальный найти или создать и чтобы поиск по нему адекватно работал т.е. лучше искать запросами чем методами короче
149 Loki Evil
 
09.09.13
14:31
Что можно сделать:

1) Убрать все что делалось при записи и перед записью
2) Посмотреть что все время, на 99% занимает Записать()
3) Убрать из ввода по строке Наименование, Код - это индексированные столбцы, возможно серверу будет проще не поддерживать эти индексы при добавлении элементов - вернуть на место после загрузки, чтобы обсчитал 1 раз.

Больше что-то на ум ничего не идет.
150 z0001
 
09.09.13
14:33
(149)при загрузке нужно проверять существование т.е. искать и не найденные создавать, как будет поиск отрабатывать без индексов? )))
151 z0001
 
09.09.13
14:36
прочел ветку и не понял откуда берется таблица значений(0)
152 Odavid
 
09.09.13
14:44
(151) потому что опыть применения других систем хранения в 1С абсолютно неприменим ))
Поэтому я и написал утвердительно - вы не занимаетесь 1С ))
(149) Все, что делает Записать() - это записывает в базу.
Если и есть какие-то "связанные" события, на которые вы намекаете (подписки, ПриЗаписи и т.д.) - это только влияет на ошибки при записи, но не на скорость самой записи "строки" в базу.
153 ТутЯ
 
09.09.13
14:45
(151) Таблица значений формируется в 1с.
154 Odavid
 
09.09.13
14:45
(145) создание ссылки в 1С - это и есть создание объекта в базе.
Без объекта - нет ссылки. Точнее, это не будет ссылка, а "мусор", не имеющий никакого значения для базы 1С.
155 ТутЯ
 
09.09.13
14:46
(153) после установки ОбменДанными.Загрузка = Истина получаем не 50%, а 30%.
Поиск групп занимает 18% и запросы 18%
156 Odavid
 
09.09.13
14:46
(153) он, как и многие до него "сгоряча", наложил опыт применения "нормальных" СУБД на 1С.
Поэтому и ТЗ у него - это таблица в СУБД уже.
157 ТутЯ
 
09.09.13
14:47
попробую сначала группы все создать и связки хранить в индексированной таблице
158 Odavid
 
09.09.13
14:49
(155) чего 30%? При записи или вообще при загрузке?
И потом, после устанровки "обхода" проверок - вы дадите гарантию, что справочники правильно создались, без битой ссылочности, внутренних противоречий (с кодами, другими справочниками и т.д.), и со всеми необходимыми полями?
159 ТутЯ
 
09.09.13
14:51
(155)так показывает замер производительности в цикле процедуры ПеренестиСерверРаботыЕльза
160 Odavid
 
09.09.13
14:53
(159) ну т.е. "общего" переноса, а не конкретно при ЭлементСправочника.Записать(), как вы настаивали.
О чем и толкую Вам.
161 Odavid
 
09.09.13
14:54
(157)>>и связки хранить в индексированной таблице
это как и где?
162 ТутЯ
 
09.09.13
14:57
вот и думаю и как и где...
таблицу групп хотела грузить сразу, поэтому получить отдельно таблицу значений только для групп, выполнить запись в справочник работ и сразу привязать к ссылкам записи тз.
Где-то сохранить внешними данными...незнаю...значение в строку и положить туда ссылку...Когда запускать регламент открывать эти данные и опять в Тз и проиндексировать и только после этого начинать грузить таблицы элементов...
163 Odavid
 
09.09.13
15:07
(162) я ж говорю вам - вы в любом случае упретесь в тормоза/невозможность 1С быстро/правильно/корректно (подчеркните нужное) работать с СУБД при ОГРОМНЫХ объемах данных, начинающихся от 100-200 тыс записей/транзакция.
Я в этом убежден, с чем не согласны большинство здесь на форуме.
Поищите - постоянно пишут о "миллионах обрабатываемых записей" (это, в основном, начальники-руководители и прочая, кто хочет видеть и видит лишь отчеты с агитками), и тут же - либо невозможность (по причине переполнения чего-нибудь - буфера 1С-сервера, памяти, темпового диска, очереди ввода-вывода и т.д.), либо долгие <годы> часы ожидания завершения обработки данных.
164 ТутЯ
 
09.09.13
15:11
(163) так какой выход?
165 Odavid
 
09.09.13
15:12
(164) (131 ) + ( 142)
Т.е. анализ данных перед загрузкой - 99% успеха загрузки в 1С.
166 ТутЯ
 
09.09.13
15:14
ну так я этим сейчас и занимаюсь)
167 ТутЯ
 
09.09.13
15:16
(162) не очень большая таблица групп, но чтобы уменьшить время загрузки элементов групп можно сохранить именно готовые ссылки самих групп
168 Odavid
 
09.09.13
15:19
(167) вы че-то запутались.
Если эти группы уже есть в базе - вам остается только найти их посиком. Если нет - создавать новые.
Какие еще "ссылки" и на что (и по какой базе) вы собрались сохранять перед загрузкой??
169 ТутЯ
 
09.09.13
15:19
(167) да и это уже не надо)
170 ТутЯ
 
09.09.13
15:20
запуталась, да, уже распуталась)
171 ТутЯ
 
09.09.13
15:20
(168) больше никаких
172 z0001
 
09.09.13
15:23
(170)алгоритм составь и закодь потом под замером производительности смотри как он работает и поймешь как быстрее а (168) с тобой скорее заигрывает чем вопрос решает )))
173 ТутЯ
 
11.09.13
13:41
Вопрос полностью закрыт. Записей оказалось не 2,5 а 11 млн и пришлось отказаться от загрузки в справочник. Придумалась структура из 2 рег сведений и дополнительной обработкой получилась загрузка на час. УРА! Спасибо, что подсказали как быть в случае когда много записей, буду иметь ввиду))).
174 Odavid
 
13.09.13
11:42
(172) ну что, только про троллей знаем, и больше ничего? развелось вас немеряно последние года....
(173) вот тут v8: Резко упала производительность 1С ЗУП я отписался именно о записи в справочник миллиона элементов - идет часами.
500 тыс - писало свыше 7 часов (почти 8). Миллион - пишет за 20 часов.
Именно в SQL-варианте.
В файловой DBF все идет совсем по-дургому. это не показатель...
175 badboychik
 
13.09.13
12:04
Хранение больших объемов во внешней базе вполне нормальный вариант, почему нет? На прошлой работе в Firebird хранились данные о пластиковых окнах, замерах и т.д., данные формировала другая программа, а 1С читала и модифицировала некоторые поля, причем для пользователя выглядело как обычные справочники и документы
176 Odavid
 
13.09.13
12:27
(175)>>причем для пользователя выглядело как обычные справочники и документы
значит, все, что они так видели - хранилось и в 1С.
177 Odavid
 
13.09.13
12:37
У кого-то миллион пишет за 14 часов.
Видимо, зависит от мощности серверов и космического излечения.
Но это все - огромные временные периоды, совершенно недопустимые в промышленной БД.
178 Odavid
 
15.09.13
10:26
Продолжаем тест.
Поиск среди 1 млн записей: прогонка 100 тыс записей - за 5-6 минут. Молодец SQL, и 1С, что не додумалась хотя б в поиск сунуть свои вездесущие "ноу-хау" (точнее, они есть в Справочник.НайтиПо<...>, но результат производительности, как видим, еще приемлем, - конечно, в критериях работы 1С, - хотя и тут находится на грани разумного).
Запись 1 млн элементов - стала 16 часов. Видимо, SQL "дали возможность" определить "узкие" места, и начал работать SQL оптимизатор - кроме теста, на SQL ничего не запущено.
179 Odavid
 
16.09.13
10:00
+ 1С сервер за сутки (пока гонял миллион туда-сюда) понаписал 50 Гб логов.
Так что будьте внимательны - места должно хватать и под логи, иначе вылетит.