понедельник, 26 сентября 2016 г.

Быстрая запись в справочники 1с Предприятие

       Приветсвую! Обычная скорость записи элементов около 150-200 записей в секунду, ОЧЕНЬ медленно! Для записи в справочники могу посоветовать 2 режима, первый подходит только для DBF формата базы данных и выглядит вот так:

       НачатьТранзакцию();

спрТовар.ВыбратьЭлементы();
Пока спрТовар.ПолучитьЭлемент() = 1 Цикл
спрТовар.Удалить(1);
КонецЦикла;
       сч = 0;
       Пока спрТовар.ПолучитьЭлемент() = 1 Цикл
              сч = сч + 1;
      спрТовар.Новый();
              спрТовар.Наименование = СокрЛП();
      спрТовар.Записать();
       КонецЦикла;

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

Второй метод использовать компоненту 1c++, 50000 элементов в секунду, ускорение в 100 раз:

Процедура УдалитьТовар();
       Recordset = СоздатьОбъект("ODBCRecordset");
текстСКЛ = "DELETE FROM $справочник.Товар;"; 
Recordset.ВыполнитьСкалярный(текстСКЛ);
КонецПроцедуры

Процедура ВыполнитьЗапрос(Запрос,Текст = "")
        Перем Рез;
        Если ПустаяСтрока(Текст)=1 Тогда
                Рез=Запрос.Выполнить();
        Иначе
                Рез=Запрос.Выполнить(Текст);
        КонецЕсли;
        Если Рез=0 Тогда
                ВыполняемыйМодуль=СоздатьОбъект("ВыполняемыйМодуль");
                ВыполняемыйМодуль.СформироватьОшибку(Запрос.ПолучитьОписаниеОшибки());
        КонецЕсли;
КонецПроцедуры

Процедура ПодготовитьЗапрос(Запрос,Текст)
        Если Запрос.Подготовить(Текст)=0 Тогда
                ВыполняемыйМодуль=СоздатьОбъект("ВыполняемыйМодуль");
                ВыполняемыйМодуль.СформироватьОшибку(Запрос.ПолучитьОписаниеОшибки());
        КонецЕсли;
КонецПроцедуры

Процедура ДобавитьПараметр(Запрос,Тип,Длина,Точность)
        Если Запрос.ДобПараметр(1,Тип,Длина,Точность)=0 Тогда
                ВыполняемыйМодуль=СоздатьОбъект("ВыполняемыйМодуль");
                ВыполняемыйМодуль.СформироватьОшибку(Запрос.ПолучитьОписаниеОшибки());
        КонецЕсли;
КонецПроцедуры

Процедура СозданиеЭлементовПоНовому()
        Запрос=СоздатьОбъект("ODBCRecordset");
        БлокировкаТовары=СоздатьОбъект("SQLLock");
        БлокировкаТовары.УстановитьТипОбъекта("Справочник","Товар");
        БлокировкаТовары.УстановитьТаймаут(10);

        ФлагУдачи=0;
        Пока ФлагУдачи=0 Цикл
                Попытка
                        ВыполнитьЗапрос(Запрос,"begin tran");
                        ПодготовитьЗапрос(Запрос,"insert $Справочник.Товар values(?ID, '     0   ', ?Код, ?Наименование, 2, 0, 0, '')");
                        ДобавитьПараметр(Запрос, 14, 9, 0);
                        ДобавитьПараметр(Запрос, 14, 6, 0);
                        ДобавитьПараметр(Запрос, 14, 100, 0);
                        Для Тек=1 По 50000 Цикл
                                Запрос.УстПараметр("ID",БлокировкаТовары.НовыйИД());
                                Запрос.УстПараметр("КодС",Тек);
                                Запрос.УстПараметр("НаименованиеС",СокрЛП(Тек));
                                ВыполнитьЗапрос(Запрос);
                        КонецЦикла;
                        ВыполнитьЗапрос(Запрос,"if @@trancount > 0 commit tran");
                        ФлагУдачи=1;
                Исключение
                        Запрос.Выполнить("if @@trancount > 0 rollback tran");
                        Если ОписаниеОшибки()="LockTimeoutExpired" Тогда
                                Если Вопрос("Неудалось заблокировать справочник Товары.
                                        |Повторить попытку?","ОК+Отмена")="Отмена" Тогда
                                        ФлагУдачи=2;
                                КонецЕсли;
                        Иначе
                                ВызватьИсключение;
                        КонецЕсли;
                КонецПопытки;
        КонецЦикла;
КонецПроцедуры

1 комментарий:

  1. Вот контактные данные г-на Бенджамина, адрес электронной почты, lfdsloans@outlook.com. / Или WhatsApp 1 989-394-3740, который помог мне с займом в 90 000,00 евро, чтобы начать свой бизнес, и я очень благодарен, мне было очень тяжело, пытаясь найти способ, как мать-одиночка, вещи не были легкими со мной, но с помощью мистера Бенджамина улыбнулся мне в лицо, когда я смотрю, как растет и развивается мой бизнес. Я знаю, вы можете удивиться, почему я ставлю такие вещи здесь, но я действительно должен выразить свою благодарность, чтобы любой, кто ищет финансовая помощь или преодоление трудностей с этим бизнесом или желание запустить бизнес-проект могут позаботиться об этом и надеяться на выход из затруднений. Спасибо.

    ОтветитьУдалить