Имя: Пароль:
1C
1C 7.7
v7: ТЗ, быстро "сохранить" наружу от 1С и потом "быстро" загрузить обратно...?
, , ,
0 Злопчинский
 
17.01.20
19:38
Есть ТЗ, может быть большая, десятки-сотни тысяч строк.
как _максимально_ быстро сохранить "наружу" от 1С (на диск), потом
как _максимально_ быстро загрузить "внутрь" в 1С (на диск)..?

лучший вариант - с сохранением внутреннего представления, крайний вариант - только внешнее представление?
лучший вариант - штатными 1С возможностями, крайний вариант - использование нештатного (типа скюлайт)

что предложите использовать? (только не 8-ку! ;-)
спсб.
1 Провинциальный 1сник
 
17.01.20
19:56
Лучше работать с индексированной таблицей из 1с++, она своим методом ВФайл сохраняется намного быстрее штатной платформенной процедуры ЗначениеВФайл. Даже если исходно есть обычная ТЗ, то получить из неё ИТЗ и сохранить - на порядок быстрее прямого сохранения.
2 Garykom
 
гуру
17.01.20
20:07
(0) 1С 7.x : ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр

Но лучше переписать код/алгоритм так чтобы не нужна была эта большая ТЗ.
Короче лучше всего отказаться от 8-ки.

Для 8-ки я кста вот тестил тут с ТЗ глянь в конце Удаление строк из таблицы значений по номеру
3 astrawalk
 
17.01.20
20:09
(0) Таблица mxl
4 Garykom
 
гуру
17.01.20
20:09
(2) *отказаться от 77-ки.
5 astrawalk
 
17.01.20
20:11
(0) или XBase
6 Garykom
 
гуру
17.01.20
20:11
(3) Да уж сказанул.
1. Каким образом быстро из ТЗ засунуть в mxl?
2. Про глюк с сохранением больших mxl на диск слышали?
7 Провинциальный 1сник
 
17.01.20
20:13
+(1) Вот специально тестовый пример сделал, табличку с сотней строк сохранял через ЗначениеВФайл - порядка 70 секунд само сохранение заняло. А если её загрузить в индексированную таблицу, а потом сохранить родным методом - ДВЕ секунды. Включая загрузку из ТЗ.
8 Провинциальный 1сник
 
17.01.20
20:13
(7) Сотня ТЫСЯЧ строк, конечно же..
9 Злопчинский
 
17.01.20
20:15
(1) думал об этом. использовать есть возможность.
10 Злопчинский
 
17.01.20
20:17
(2) "Переписать" - смысла не имеет. по сути ТЗ - большая плоская таблица, а отчет - универсальный построитель/группировщик. ТЗ собирается долго, а крутить-анализировать несколько раз (в разное время/сесси) в разных разрезах хочется, и чтобы каждый раз не насчитыаать ТЗ заново между сессиями - хочется "хранить". Этакий миниолап
11 Злопчинский
 
17.01.20
20:19
(7) сохранял во внутреннем формате?
сколько обьем файла получился?
.
сколько чтение обратно в ТЗ занимает?
12 Провинциальный 1сник
 
17.01.20
20:23
(11) Во внутреннем. Там похоже характерный для 7.7 баг с нелинейным ростом времени сохранения в файл от размера объекта. А в ИТЗ сохранялка своя, без этого бага. Размеры файлов практически одинаковые получились. Загружать не пробовал.
13 Злопчинский
 
17.01.20
20:24
(12) лентяй, как все 1сники ;-)
14 Garykom
 
гуру
17.01.20
20:27
(2) Походу я уже забыл 7.7

Короче забираю свои слова назад.
ЗначениеВСтрокуВнутр() на 7.7 пипец как тормозно на больших ТЗ

Сча пробую с ВК
15 Злопчинский
 
17.01.20
20:35
(14) см. (7)
.
таблица с примерно 3 агрегатными колонками, остальные - примитивные типы, всего ~10 (3 - агрегатные типы, 4 - число, 3 строка нефиксированной длины)
16 Злопчинский
 
17.01.20
20:37
(14) я потому и спрашивал, бо когда на ТСД-склад - задания в виде ТЗ во внешних файлах - сброс/восстановление некритичнор блыо бо обьемы, но уже понятно что тормозно будет на обьемах больших
17 Злопчинский
 
17.01.20
20:37
..это я давно делал, сейчас "задача" чуть иная
18 Garykom
 
гуру
17.01.20
20:39
Протестируй плиз

//======================================================================
Функция ДатаВремя()
    Часы = "";
    Минуты = "";
    Секунды = "";
    ТекущееВремя(Часы,Минуты,Секунды);
    Возврат ""+Часы+":"+Минуты+":"+Секунды;
КонецФункции // ДатаВремя

//======================================================================
Процедура Сформировать()
    лТЗ = СоздатьОбъект("ТаблицаЗначений");
    лТЗ.НоваяКолонка("Строка");
    лТЗ.НоваяКолонка("Число");
    
    КоличествоСтрок = 100000;
    
    Сообщить("Заполнение ТЗ, начало "+ДатаВремя());
    Для НомерСтроки=1 По КоличествоСтрок Цикл
        лТЗ.НоваяСтрока();
        лТЗ.Строка = "длапдлвапдлаовп";
        лТЗ.Число = 734673643;
    КонецЦикла;
    Сообщить("Заполнение ТЗ, конец "+ДатаВремя());
    
    Сообщить("ТЗ в Текст, начало "+ДатаВремя());
    лТекст = СоздатьОбъект("Текст");
    лТЗ.ВыбратьСтроки();
    Пока лТЗ.ПолучитьСтроку() = 1 Цикл
        лСтрока = ""+лТЗ.Строка+"|"+лТЗ.Число;
        лТекст.ДобавитьСтроку(лСтрока);
    КонецЦикла;
    лТекст.Записать("C:\temp\ТЗиз1С.txt");
    Сообщить("ТЗ в Текст, конец "+ДатаВремя());
    
КонецПроцедуры
19 Garykom
 
гуру
17.01.20
20:47
(18) Блин у СоздатьОбъект("Текст"); тоже проблема большого объема.

100к строк идеально за 7 секунд, а вот 200к строк уже полторы минуты.
Короче бьешь на куски по 50к строк или меньше и сохраняешь штатно средствами 1С 7.7 в несколько файлов через Текст.
20 Garykom
 
гуру
17.01.20
20:54
Кстати XBase для 1С 7.7 это отличный вариант, очень шустрый
21 Злопчинский
 
17.01.20
21:00
(20) кстати.
22 План счетов
 
17.01.20
21:01
Давно делал, так вроде самое быстрое было
Это читаем из файла
FSO=СоздатьОбъект("Scripting.FileSystemObject");
            File=FSO.GetFile(ИмяФНов);
            TextStream=File.OpenAsTextStream(1);
            Пока TextStream.AtEndOfStream=0 Цикл
                //3 строки в текстовом файле = 1 строке в ТЗ
                Стр_ = TextStream.ReadLine();    
                Если НомерСтроки = 1 Тогда
                    ТЗ.НоваяСтрока();
                    ТЗ.День = Дата(Стр_);            
                    НомерСтроки = НомерСтроки + 1;
                ИначеЕсли НомерСтроки = 2 Тогда            
                    ТЗ.ДанныеТаблицы = ЗначениеИзСтрокиВнутр(Стр_);                        
                    НомерСтроки = 3;
                ИначеЕсли НомерСтроки = 3 Тогда    
                    // Тут какаято процедура была, удалил                                
                    НомерСтроки = 1;
                КонецЕсли;        
            КонецЦикла;
            TextStream.Close();
23 Garykom
 
гуру
17.01.20
21:02
(22) Кому не влом проверьте через FSO на ТЗ 100к строк из (18)
24 План счетов
 
17.01.20
21:03
Сохранение
FSO=СоздатьОбъект("Scripting.FileSystemObject");
    TextStream=FSO.CreateTextFile(ИмяФНов);
    ТЗ.Сортировать("День");
    ТЗ.ВыбратьСтроки();
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
        TextStream.WriteLine(ТЗ.День);
        Стр = ЗначениеВСтрокуВнутр(ТЗ.ДанныеТаблицы);
        TextStream.WriteLine(Стр);        
        Стр2 = ЗначениеВСтрокуВнутр(СЗ_С_КакимитоДанными);
        TextStream.WriteLine(Стр2);
    КонецЦикла;
    TextStream.Close();
25 План счетов
 
17.01.20
21:06
Код чуть подрезал, смысл думаю понятен. Мы хранили так ТЗ, большие, но не знаю скольтко строк, там строк не много, колонок много было.
Файл получается 3-4 метра, сохраняется секунд 30 и примерно так же извлекается.

Когда делал, этот способ был вроде самый быстрый
26 Garykom
 
гуру
17.01.20
21:08
(24) Угу просто идеально через FSO!

//======================================================================
Функция ДатаВремя()
    Часы = "";
    Минуты = "";
    Секунды = "";
    ТекущееВремя(Часы,Минуты,Секунды);
    Возврат ""+Часы+":"+Минуты+":"+Секунды;
КонецФункции // ДатаВремя

//======================================================================
Процедура Сформировать()
    лТЗ = СоздатьОбъект("ТаблицаЗначений");
    лТЗ.НоваяКолонка("Строка");
    лТЗ.НоваяКолонка("Число");
    
    КоличествоСтрок = 100000;
    
    Сообщить("Заполнение ТЗ, начало "+ДатаВремя());
    Для НомерСтроки=1 По КоличествоСтрок Цикл
        лТЗ.НоваяСтрока();
        лТЗ.Строка = "длапдлвапдлаовп";
        лТЗ.Число = 734673643;
    КонецЦикла;
    Сообщить("Заполнение ТЗ, конец "+ДатаВремя());
    
    Сообщить("ТЗ в Текст, начало "+ДатаВремя());
    лТекст = СоздатьОбъект("Текст");
    лТЗ.ВыбратьСтроки();
    Пока лТЗ.ПолучитьСтроку() = 1 Цикл
        лСтрока = ""+лТЗ.Строка+"|"+лТЗ.Число;
        лТекст.ДобавитьСтроку(лСтрока);
    КонецЦикла;
    лТекст.Записать("C:\temp\ТЗиз1С1.txt");
    Сообщить("ТЗ в Текст, конец "+ДатаВремя());
    
    Сообщить("ТЗ в FSO, начало "+ДатаВремя());
    ИмяФайла="C:\temp\ТЗиз1С2.txt";
    fso=СоздатьОбъект("Scripting.FileSystemObject");                                                          
    file=fso.CreateTextFile(ИмяФайла, -1, 0); //создать файл, перезаписывая существующий.
    лТЗ.ВыбратьСтроки();
    Пока лТЗ.ПолучитьСтроку() = 1 Цикл
        лСтрока = ""+лТЗ.Строка+"|"+лТЗ.Число;
        file.WriteLine(лСтрока);
    КонецЦикла;
    file.Close();
    Сообщить("ТЗ в FSO, конец "+ДатаВремя());
    
КонецПроцедуры


Заполнение ТЗ, начало 21:8:6
Заполнение ТЗ, конец 21:8:6
ТЗ в Текст, начало 21:8:6
ТЗ в Текст, конец 21:8:13
ТЗ в FSO, начало 21:8:13
ТЗ в FSO, конец 21:8:15
27 Garykom
 
гуру
17.01.20
21:11
1 лям строк через FSO пишет примерно минуту
Заполнение ТЗ, начало 21:10:27
Заполнение ТЗ, конец 21:10:34
ТЗ в FSO, начало 21:10:34
ТЗ в FSO, конец 21:10:59
28 Garykom
 
гуру
17.01.20
21:12
29 Злопчинский
 
17.01.20
21:57
бдю...
30 Злопчинский
 
17.01.20
21:58
тут больше времени будет преобразование в строкуВнутр и наоботрот занимать будет.
запихни агрегатный тип..
31 Cthulhu
 
18.01.20
12:31
(30) на агрегатных самый тормоз на преобразоании объект-строка (д/сохр) и строка-объект (д/загр).
универсальное по ИД - самое тормозное. ситуацию можно значительно улучшить НЕ универсальным кодом - ЕСЛИ структура данных позволяет белать быстрый поиск (справочника по коду в зависимости от уникальности, документы по номеру+дате в зависимости от периодичности).
по скоростям сохр/загр ТЗ примитивных типов тебе уже накидали там выше...
32 Cthulhu
 
18.01.20
12:33
(31)+ ну или если "идеальный" случай уникальности текстового представления объектов и тебе не важны объекты - то тупо в ТЗ загоняй примитивные текстовые представления (для верчения в плясках с группировками такого должно хватить, например)
33 Злопчинский
 
18.01.20
19:10
(32) да, такогоо думал и частично юзаю
34 AAA
 
18.01.20
19:45
Если уж дошло до XBASE, то не лучше ли в самой конфигурации создать справочник и в него писать? зачем сторонний файл?
35 GreyK
 
18.01.20
20:21
(0) Задам главный вопрос, а наферкуя все эти пляски?
36 Злопчинский
 
18.01.20
22:03
(34) нахера временные "файлы" писать в базу?
37 Злопчинский
 
18.01.20
22:05
(35) большой отчет. считается долго. отлаживается долго. для отладки - надо "смотреть" в таблицу. данные мутные. в базе - криво. по сути - таблица для отчета - эмуляция упрощенного учета за хрен знает с какой даты до сегодня.
38 AAA
 
18.01.20
22:14
(36)Это предрассудок. Разделение данных на базу и не базу чисто условное. Твой временный файл это тоже база. И не надо заботиться о типизации, об имени файла и прочей бадяге. Но дело хозяйское)
39 Arbuz
 
20.01.20
12:20
ну, я буду не оригинален - на больших объёмах удобнее и быстрее вместо гигантской тз изначально использовать скулайт базу. и прямо из неё выборки делать со всякими cte и оконными плюшками. качественно решается одновременно столько вопросов, что вне конкуренции. мы ж про дбф базу?
40 Злопчинский
 
20.01.20
14:35
(39) ок. принял во внимание.