четверг, 1 декабря 2016 г.

Ничего не изменилось в Украине

    В стране ничего не изменилось с правления Януковича, чиновники и государственные группировки как грабили страну так и грабят,бизнес отжимают, пример тому одна из крупнейших сетей АЗС "БРСМ". В медиа контролируемой депутатами и чиновниками  ни слова об этом, зато куча новостей о России и другой по сути неважно информации ,например о повышении минимальной зарплаты. Какая разница какая минимальная зарплата ,если благодаря включению этого решения просто включат типографский станок и напечатают вал денег и доллар станет по 50 или 60? Тарифы тоже любят обсуждать, стоимость газа  в долларах достаточно стабильна ,создайте условия что бы я мог заработать в долларах больше и меня не будут беспокоить платежи в объеме 50 - 100 долларов. Информацию о бегстве проворовавшегося чиновника пишут только когда он уже за границей, пока он в Украине никаких мер не принимается. Вокруг популизм, замыливание глаз и воровство. Судя по ситуации или будет вторая революция ,или Россия добъется своего, просто дост на 100 долларов больше нам чем предлагает существующая власть. 

понедельник, 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;
                                КонецЕсли;
                        Иначе
                                ВызватьИсключение;
                        КонецЕсли;
                КонецПопытки;
        КонецЦикла;
КонецПроцедуры