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

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
От релиза платформы зависит.


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