Модераторы: stron
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение своих данных в справочник 1с, есть ли другой вариант, чтоб побыстрей 
V
    Опции темы
sergey_85
Дата 6.8.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет!

В 1с мне нужно сохранять лог изменения док-та, ну а потом его и выводит в отчет.
Для этого разработал структуру справочника, казалось бы все, но сохранение данных в него идет не очень быстро, когда записей много, а все это делается при нажатии кнопки пользователем (очень медленно сохраняется на учебной, пустой базе 10 сек., код без сохранения в БД работает быстро)

Так вот вопрос, есть ли альтернативный вариант сохранения данных, если не в справоччник, то еще куда-нить, но чтоб их можно было вывести в отчет-таблицу (напомню, что в справочнике есть ряд методов для извлечения данных! )


--------------------
A good design always pays off.
PM MAIL   Вверх
AkelaSQL
Дата 6.8.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



Платформа?


--------------------
user posted image
PM MAIL ICQ   Вверх
sergey_85
Дата 6.8.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



1c v7.7 dbf база данных smile (старье, короче)


--------------------
A good design always pays off.
PM MAIL   Вверх
AkelaSQL
Дата 6.8.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



1. Убери все лишние индексы с реквизитов справочника (галочки сортировка, отбор по реквизиту), это замедлит выборку, но ускорит запись.
2. Процедуру записи в справочник - в студию...
3. Переведи базу на SQL
4. Используй 1С++


--------------------
user posted image
PM MAIL ICQ   Вверх
sergey_85
Дата 7.8.2009, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Спасибо за советы AkelaSQL!
1 - сделаю
2 - вот код, если закоментить строки где создается эл-т в справочнке и пишется в бд, то код работает быстро!
Код

//*************************************************************
Процедура СохранитьЛогТабличнойЧастиВБазуДанных(спрЛогДокта, Док, тзЛогИзмененныеСтроки, тзЛогУдаленныеСтроки, тзЛогСтарыеСтроки)
    
    спрДетализация     = СоздатьОбъект("Справочник.ЛогДетализацияДокументов");    
    спрСписокИзменений = СоздатьОбъект("Справочник.ЛогСписокИзмененийДокументов");
     
    //просматриваем лог удаленных записей и вносим их в БД
    Для к = 1 По тзЛогУдаленныеСтроки.КоличествоСтрок() Цикл    
        спрДетализация.Новый();
    
        спрДетализация.СпрВладелец     = спрЛогДокта.ТекущийЭлемент(); 
        спрДетализация.ВидДетализации  = 2; // 1 - шапка 2 - табл. часть  
        спрДетализация.ВидДействия     = 3; // 0 - изм. шапки. 1 - нов строка тч. 2 ред. строки тч 3 - удал. строки тч 4 - перем. строки тч
     спрДетализация.Примечание      = "удалена строка";
        
        спрДетализация.Записать(); 
        
        //табличная часть
        Для кк = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл
         ид = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(кк).Идентификатор;

            спрСписокИзменений.Новый();
       
            спрСписокИзменений.СпрВладелец    = спрДетализация.ТекущийЭлемент();
            спрСписокИзменений.ИмяРеквизита   = СокрЛП(ид);
         спрСписокИзменений.СтароеЗначение = СокрЛП(тзЛогУдаленныеСтроки.ПолучитьЗначение(к, ид));
            спрСписокИзменений.НовоеЗначение  = "";
    
            спрСписокИзменений.Записать();  
        КонецЦикла;    
        сообщить("строка тч удалена");
    КонецЦикла;      
    
    //а теперь просматриваем лог нов., ред., перем. записей и вносим их в БД
    Для к = 1 По тзЛогИзмененныеСтроки.КоличествоСтрок() Цикл    
            
        //нов.
        Если тзЛогИзмененныеСтроки.ПолучитьЗначение(к, тзЛогИзмененныеСтроки.КоличествоКолонок() - 2) = 0 Тогда
         спрДетализация.Новый();
    
            спрДетализация.СпрВладелец     = спрЛогДокта.ТекущийЭлемент(); 
            спрДетализация.ВидДетализации  = 2; // 1 - шапка 2 - табл. часть  
            спрДетализация.ВидДействия     = 1; // 0 - изм. шапки. 1 - нов строка тч. 2 ред. строки тч 3 - удал. строки тч 4 - перем. строки тч
         спрДетализация.Примечание      = "нов. строка";
        
            спрДетализация.Записать(); 
        
            //табличная часть
            Для кк = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл
             ид = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(кк).Идентификатор;
                     
                спрСписокИзменений.Новый();
       
                спрСписокИзменений.СпрВладелец    = спрДетализация.ТекущийЭлемент();
                спрСписокИзменений.ИмяРеквизита   = ид;
             спрСписокИзменений.СтароеЗначение = "";
                спрСписокИзменений.НовоеЗначение  = тзЛогИзмененныеСтроки.ПолучитьЗначение(к, ид);
    
                спрСписокИзменений.Записать();  
            КонецЦикла;  
            сообщить("строка тч новая");
        //ред.
        ИначеЕсли тзЛогИзмененныеСтроки.ПолучитьЗначение(к, тзЛогИзмененныеСтроки.КоличествоКолонок() - 2) = 1 Тогда
            спрДетализация.Новый();
    
            спрДетализация.СпрВладелец     = спрЛогДокта.ТекущийЭлемент(); 
            спрДетализация.ВидДетализации  = 2; // 1 - шапка 2 - табл. часть  
            спрДетализация.ВидДействия     = 2; // 0 - изм. шапки. 1 - нов строка тч. 2 ред. строки тч 3 - удал. строки тч 4 - перем. строки тч
         спрДетализация.Примечание      = "ред. строка";
        
            спрДетализация.Записать(); 
        
            //табличная часть
            Для кк = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл
             ид = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(кк).Идентификатор;
             
                Если тзЛогСтарыеСтроки.ПолучитьЗначение(к, ид) <> тзЛогИзмененныеСтроки.ПолучитьЗначение(к, ид) Тогда
                    спрСписокИзменений.Новый();
       
                    спрСписокИзменений.СпрВладелец    = спрДетализация.ТекущийЭлемент();
                    спрСписокИзменений.ИмяРеквизита   = ид;
                 спрСписокИзменений.СтароеЗначение = тзЛогСтарыеСтроки.ПолучитьЗначение(к, ид);
                    спрСписокИзменений.НовоеЗначение  = тзЛогИзмененныеСтроки.ПолучитьЗначение(к, ид);
    
                    спрСписокИзменений.Записать(); 
                КонецЕсли;
            КонецЦикла; 
            сообщить("строка тч ред");
        КонецЕсли;  
            
        //перем.
        Если тзЛогИзмененныеСтроки.ПолучитьЗначение(к, тзЛогИзмененныеСтроки.КоличествоКолонок() - 1) = 1 Тогда
            спрДетализация.Новый();
    
            спрДетализация.СпрВладелец     = спрЛогДокта.ТекущийЭлемент(); 
            спрДетализация.ВидДетализации  = 2; // 1 - шапка 2 - табл. часть  
            спрДетализация.ВидДействия     = 4; // 0 - изм. шапки. 1 - нов строка тч. 2 ред. строки тч 3 - удал. строки тч 4 - перем. строки тч
         спрДетализация.Примечание      = "строка тч перемещена на " + СокрЛП(тзЛогИзмененныеСтроки.ПолучитьЗначение(к, тзЛогИзмененныеСтроки.КоличествоКолонок()));
        
            спрДетализация.Записать(); 
        
            //табличная часть
            Для кк = 1 По Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти() Цикл
             ид = Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти(кк).Идентификатор;
                     
                спрСписокИзменений.Новый();
       
                спрСписокИзменений.СпрВладелец    = спрДетализация.ТекущийЭлемент();
                спрСписокИзменений.ИмяРеквизита   = ид;
             спрСписокИзменений.СтароеЗначение = "";
                спрСписокИзменений.НовоеЗначение  = тзЛогИзмененныеСтроки.ПолучитьЗначение(к, ид);
    
                спрСписокИзменений.Записать();  
            КонецЦикла; 
            сообщить("строка тч перемещ");    
        КонецЕсли;        
    КонецЦикла;    
КонецПроцедуры    

3 - невозможно, задача небольшая и из-за неё переводить на sql затратно
4 - 1с++ никогда не слышал, я недавно работаю с 1с


--------------------
A good design always pays off.
PM MAIL   Вверх
AkelaSQL
Дата 7.8.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



2. Ну тут всё понятно, куча вложенных циклов быстро никогда работать не будет, тем более с таким содержимым. Как вариант можно посоветовать:
    а) собирай все нужные для записи данные в ТЗ и только в конце процедуры проходи по ТЗ циклом и пиши данные в справочник.
    б) делай всё это в транзакции (НачатьТранзакцию - ЗафиксироватьТранзакцию)

3. SQL сервер можно поднять 2005 Express - это быстро и не затратно.

4. http://www.script-coding.info/1cpp.html
    http://www.script-coding.info/Direct_queries.html
    и вообще гугли, инфы по 1С++ много, у меня торговля на 7.7 переписана на 50%
    в твоём случае возникнет проблемка, если используешь УРБД, но при желании она легко решаема


--------------------
user posted image
PM MAIL ICQ   Вверх
sergey_85
Дата 7.8.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



не тут и так уже все собрано в кучу, а цикл лишь обходит ТЗ и пишет в базу, дело в том что писать приходться сразу много, не 1-2 записи а 15-20 за раз. Не охота напрягать пользователей (бухгалтеров)


Ну и конечно я еще просмотрю и подправлю код, это сырой вариант 

Это сообщение отредактировал(а) sergey_85 - 7.8.2009, 11:48


--------------------
A good design always pays off.
PM MAIL   Вверх
AkelaSQL
Дата 7.8.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



всё равно вставь всю эту процедуру внутрь 1 транзакции и сделай замер


--------------------
user posted image
PM MAIL ICQ   Вверх
sergey_85
Дата 7.8.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



о чудо!!!! слушай, стала почти летать!  smile 

я так понимаю, что сейчас создается 1 транзакция на сохранение всех записей, а раньше каждое сохранение порождало новую транзакцию - отсюда и тормоза!!!! 

Код

    Попытка
        НачатьТранзакцию();   
        /// мои действия по добавлению в справочник                
        ЗафиксироватьТранзакцию();
    Исключение  
            ОтменитьТранзакцию();
            сообщить("О Ш И Б К А ! ! !");
            Возврат;
    КонецПопытки;
  


--------------------
A good design always pays off.
PM MAIL   Вверх
AkelaSQL
Дата 7.8.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 14.9.2007
Где: Москва

Репутация: 6
Всего: 7



Твоё узкое звено - дисковая подсистема.


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "1C: Предприятие, SAP, ERP и учётные системы"
stron

Запрещается!

1. Обсуждение крэков, кейгенов и других подобных программ

Пробуйте искать сами или обращайтесь в приват к участникам форума.

Темы с подобными вещами будут немедленно удаляться, а нарушители - получать предупреждения.

Также запрещается обсуждение проблем работы этих программ (что куда вписать, куда что скопировать и т.п...)

2. Давать ссылки на взломанные продукты

  • Пожалуйста, пользуйтесь поиском перед тем, как задать вопрос - возможно ответ уже есть на форуме.
  • Название темы должно отражать её суть
  • Действия модераторов можно обсудить здесь

С уважением, stron, Pegas.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | 1C: Предприятие, SAP, ERP и учётные системы | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.