Вход | Регистрация

1С:Предприятие ::

Метки:Расчет

медленная запись в регистр расчета

Я
   kvckp
 
25.11.04 - 20:38
1С 8.0.3.15 (крякнутая, локальная). На сайте 1С красиво и убедительно написано про масштабируемость восьмерки. Тем не менее, перед покупкой "кота в мешке" - лицензионной версии платформы, проверяю возможность ведения полноценнных расчетов с квартиросъемщиками для сотни тысяч лицевых счетов. Компьютер вполне современный (P4 HT, SATA, RAM 1Гб), Win2000. Объем тестируемой конфигурации - около 500МГб, размер справочника "Услуги по лицевым счетам" - около 1500 тыс. записей. Для каждой записи этого справочника надо сделать расчет начислений, льготных скидок, недопоставки услуг и т.д. и т.п. При попытке проведения документа "Выполнить основные начисления" столкнулся с проблемой слишком медленной работы конфигурации (настолько медленной, что впору отказываться от дальнейших попыток применения 1С для решения этой задачи). Сделал замер производительности и обнаружил, что 98% времени затрачивается на движение регистра расчета: Движения.ОснНач.Записать();

Вопросы: Эта особенность присуща ранним версиям платформы, или сохраняется и в последних релизах? Есть у кого-нибудь опыт объемных расчетов? Где предел возможностям 1С8? Может быть есть хитрости программирования движения регистров расчета?

Андрей.
 
 
   Волшебник
 
1 - 25.11.04 - 22:03
Обнови релиз. Ято за конфигурация? Покажи программный код. Какова структура регистра расчета?
   kvckp
 
2 - 26.11.04 - 11:58
1. Перед покупкой лицензионной программы хотелось бы убедиться на опыте в том, что она пригодна для решения задачи. Директор меня не поймет, если сотни у.е. окажутся потраченными впустую.

2. Конфигурация самописная, изготовлена (пока) с целью определения пригодности 1С8 для решения задачи.

3. Программный код (несколько опробованных вариантов):

// Самый медленный вариант.


Процедура ОбработкаПроведения(Отказ, Режим)
    НачМес=НачалоМесяца(ДатаНачала);
    Запрос = Новый Запрос("ВЫБРАТЬ Справочник.УслугиПоЛицевымСчетам.Ссылка как Услуга");
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    ВидРсч=ПланыВидовРасчета.Общий.НайтиПоКоду("ОснНач");
    Пока Выборка.Следующий() Цикл
        Движение = Движения.ОснНач.Добавить();
        Движение.Регистратор = Ссылка;
        Движение.ПериодРегистрации = ДатаНачала;
        Движение.ВидРасчета = ВидРсч;
        Движение.Услуга = Выборка.Услуга;
        Движения.ОснНач.Записать();
    КонецЦикла;
КонецПроцедуры


// Другой вариант. Оператор "Движения.ОснНач.Записать()" вынесен за цикл.

// В этом варианте "сжирается" до 1.5Гб опертивной памяти.
// Скорость неудовлетворительная. 


Процедура ОбработкаПроведения(Отказ, Режим)
    НачМес=НачалоМесяца(ДатаНачала);
    Запрос = Новый Запрос("ВЫБРАТЬ Справочник.УслугиПоЛицевымСчетам.Ссылка как Услуга");
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    ВидРсч=ПланыВидовРасчета.Общий.НайтиПоКоду("ОснНач");
    Пока Выборка.Следующий() Цикл
        Движение = Движения.ОснНач.Добавить();
        Движение.Регистратор = Ссылка;
        Движение.ПериодРегистрации = ДатаНачала;
        Движение.ВидРасчета = ВидРсч;
        Движение.Услуга = Выборка.Услуга;
    КонецЦикла;
    Движения.ОснНач.Записать();
КонецПроцедуры


// Вариант с записью движений 1 раз на 1000 записей выборки, 

// памяти "кущшает" поменьше. 
// Скорость неудовлетворительная. 



Процедура ОбработкаПроведения(Отказ, Режим)
    НачМес=НачалоМесяца(ДатаНачала);
    Запрос = Новый Запрос("ВЫБРАТЬ Справочник.УслугиПоЛицевымСчетам.Ссылка как Услуга");
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    ВидРсч=ПланыВидовРасчета.Общий.НайтиПоКоду("ОснНач");
        НачатьТранзакцию();
    Номер=0; 
    Пока Выборка.Следующий() Цикл
        Номер=Номер+1;
        Движение = Движения.ОснНач.Добавить();
        Движение.Регистратор = Ссылка;
        Движение.ПериодРегистрации = ДатаНачала;
        Движение.ВидРасчета = ВидРсч;
        Движение.Услуга = Выборка.Услуга;
        Если Номер=1000 Тогда
            Движения.ОснНач.Записать();
            ЗафиксироватьТранзакцию();    
            Номер=0;
            НачатьТранзакцию();
        КонецЕсли;
    КонецЦикла;
    ЗафиксироватьТранзакцию();    
КонецПроцедуры



4. Структура регистра расчета ОснНач: Измерения - "Услуга", Ресурсы - "Начислено".


Андрей.
   Волшебник
 
3 - 26.11.04 - 12:01
Набор в регистр нужно записывать один раз, а после каждого добавления новой записи в набор.
   kvckp
 
4 - 26.11.04 - 14:50
Спасибо за совет. Если я правильно понял, "набором" Вы называете набор свойств движения (т.е. Движение.Регистратор, Движение.ПериодРегистрации, Движение.ВидРасчета, Движение.Услуга)? И движение надо записывать ( Движения.ОснНач.Записать() ) НЕ один раз, а после каждого добавления движения ( Движения.ОснНач.Добавить() )? Так я и делал в первом самом медленном варианте (см. предыдущее послание). В других (более быстрых) вариантах регистр заполняется точно также как и в первом варианте, т.е. проблема не в том, что регистр расчета не заполняется, а в том, что он заполняется на удивление медленно.  

Андрей.
   Shaytan
 
5 - 26.11.04 - 15:08
ИХМО, Набор - коллекция записей в регистр (4) - это запись. Более 1000 записей за одну транзакцию записывать не рекомендовали на курсах.
   Волшебник
 
6 - 26.11.04 - 15:10
(5) Без всяких ИМХО.
   Shaytan
 
7 - 26.11.04 - 15:12
(2) Зачем столько транзакций в последнем варианте?
   Rovan
 
8 - 26.11.04 - 15:25
(0) 1500 тыс или все таки 1,5 тыс = 1500 записей ?
и как часто надо проводить такой док ?
   kvckp
 
9 - 26.11.04 - 16:02
1. Значит совет был такой (3): "Набор в регистр нужно записывать один раз, а НЕ после каждого добавления новой записи в набор". Ну хорошо, и так я делал (во втором варианте, см. послание 2), но без того же успеха.

2. В последнем варианте столько транзакций как раз для того, чтобы было 1000 записей на транзакцию. Если делать все в одной транзакции (второй вариант), то обработка съедает 1.5Гб оперативной памяти и долго думает, где бы ее взять еще. Притом, что вся конфигурация - около 500МГб.

3. Если Вам (5) рекомендовали не курсах не более 1000 записей на транзакцию, видимо, это и есть предел возможностей 1С.

Андрей.
   kvckp
 
10 - 26.11.04 - 16:03
(8) Все-таки 1,5 тыс. записей.
 
 
   kvckp
 
11 - 26.11.04 - 16:04
Что на самом деле (по смыслу) означает 1500 тыс. Извините за опечатки, они есть у всех.
   THawk
 
12 - 26.11.04 - 16:08
Если это единовременный расчет (месячный) по 1.5 млн. объектам (элементам), что-то многовато - разделите по группам и потихонечку за 2 дня можно рассчитать.
я за 18 часов считаю амортизацию по 1200000 объектам, монопольно на сервере.
   kvckp
 
13 - 26.11.04 - 17:43
Получается, что добавление записей в регистр расчета происходит не очень быстро, и это не зависит от релиза. Вся хитрость заключается в том, что расчет надо делить на части и делать потихонечку в монопольном режиме за два дня (в моем случае больше, чем за 2 дня, потому что "начисление" это не более 20% всех расчетов).
   Shaytan
 
14 - 26.11.04 - 17:58
От релиза платформы зависит.


Список тем форума
Рекламное место пустует   Рекламное место пустует
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует