Новости для бухгалтера, бухучет, налогообложение, отчетность, ФСБУ, прослеживаемость и маркировка, 1С:Бухгалтерия

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

Показывать по 10 20 40 сообщений
Новая тема Ответить
Письмо в техподдержку 1С
[Прочее]

Очень медленый перенос данных из *.DBF в операции

andrei_p
читатель
офлайн
Дата регистрации: 01.02.2007
Сообщений: 23
Пост №1
 
17.06.2008 08:23

"стоит задача переноса данных из файла *.DBF и на основе этих данных создания операций.<br>сам файл DBF весит 30 мб. <br>код примерно следующий<br><br>------------<br>       СпрКВ=СоздатьОбъект("Справочник.Квартиры");<br> ФайлКВ=СоздатьОбъект("XBASE");<br> ФайлКВ.ОткрытьФайл(СокрЛП(ФайлСДанными));<br> ФайлКВ.КодоваяСтраница(1);<br> Если ФайлКВ.Открыта()=0 Тогда<br> Сообщить("Выберите путь к данным!!!");<br> Возврат ;<br> КонецЕсли;<br> //УстановитьТипВеличины();<br> БухИт = СоздатьОбъект("БухгалтерскиеИтоги");<br> ФайлКВ.Первая();                   <br> <br> СпрКВ.ИспользоватьДату(ТекущаяДата());<br> Пока (ФайлКВ.ВКонце()=0) Цикл       <br> <br> Если СпрКВ.НайтиПоКоду(ФайлКВ.SS,0)=1 Тогда <br> Опер=СоздатьОбъект("Операция"); <br> Опер.Новая();<br> Опер.Содержание="ул. "+СпрКВ.ТекущийЭлемент().Владелец.Владелец.Наименование+" д."+СпрКВ.ТекущийЭлемент().Владелец.Наименование+" "+"кв."+СпрКВ.ТекущийЭлемент().Наименование;<br> Опер.ДатаОперации=Дата("31.12.2007"); <br> <br> Опер.НоваяПроводка(); <br> Опер.Кредит.Счет = СчетПоКоду("1.4");<br> Опер.Кредит.Субконто(1, СпрКВ.ТекущийЭлемент());<br> Опер.Сумма = ФайлКВ.SAL1;                   <br> Опер.СодержаниеПроводки = "Сальдо на начало года "+СпрКВ.ТекущийЭлемент().полноеНаименование();<br>             Опер.Записать();<br><br>--------------------------------<br>ВОБЩЕМ на каждый месяц создается новая операция и в каждой операции 5-7 проводок .<br><br>Вопрос в следующем что именно тормозит процесс? Загрузка процессора 3% !! Всего остального тоже предостаточно.<br> "

Thorvardr
читатель
офлайн
Дата регистрации: 25.02.2005
Сообщений: 3082
Пост №2
 
17.06.2008 09:29

"оптимизируй алгоритм, как минимум. убери лишние ненужные разыменования ссылок, примени транзакции... вот так, примерно:<br>СпрКВ=СоздатьОбъект("Справочник.Квартиры");<br>ФайлКВ=СоздатьОбъект("XBASE");<br>ФайлКВ.ОткрытьФайл(СокрЛП(ФайлСДанными));<br>ФайлКВ.КодоваяСтраница(1);<br>Если ФайлКВ.Открыта()=0 Тогда<br> Сообщить("Выберите путь к данным!!!");<br> Возврат ;<br>КонецЕсли;<br><br>Опер=СоздатьОбъект("Операция");<br>НужнаяДата=Дата("31.12.2007");<br>Сч1_4=СчетПоКоду("1.4");<br><br>Счетчик=0;<br>НачатьТранзакцию();<br>ФайлКВ.Первая();                   <br>Пока (ФайлКВ.ВКонце()=0) Цикл<br> Если СпрКВ.НайтиПоКоду(ФайлКВ.SS,0)=1 Тогда<br> ТекущаяКвартира=СпрКВ.ТекущийЭлемент();<br> Опер.Новая();<br> Опер.Содержание="ул. "+ТекущаяКвартира.Владелец.Владелец.Наименование+" д."+ТекущаяКвартира.Владелец.Наименование+" "+"кв."+ТекущаяКвартира.Наименование;<br> Опер.ДатаОперации=НужнаяДата;<br> <br> Опер.НоваяПроводка(); <br> Опер.Кредит.Счет = Сч1_4;<br> Опер.Кредит.Субконто(1, ТекущаяКвартира);<br> Опер.Сумма = ФайлКВ.SAL1;                   <br> Опер.СодержаниеПроводки = "Сальдо на начало года "+ТекущаяКвартира.ПолноеНаименование;<br> Опер.Записать();<br> КонецЕсли;<br> Счетчик=Счетчик+1;<br> Если Счетчик>100 Тогда<br> НачатьТранзакцию();<br> ЗафиксироватьТранзакцию();<br> Счетчик=0;<br> КонецЕсли;<br>КонецЦикла;<br>ЗафиксироватьТранзакцию();<br><br>p.s. странный алгоритм, на каждую квартиру создается новая операция с одной проводкой (а не 5-7), не проверяется, а была ли она уже создана ранее, а нет ли в ней уже нужных проводок, в общем, над этим тоже подумайте. При сложении строк, наверное, еще бы пробелы по бокам пооткусывать"

andrei_p
читатель
офлайн
Дата регистрации: 01.02.2007
Сообщений: 23
Пост №3
 
17.06.2008 10:03

Спасибо большое за ответ!<br>по поводу кода не много не так, я просто опустил оставшиеся 5-6 проводок . Проверка убрана сознательно, т.к. это разовое действие и перед ним база отчищаеться вообще от всего, Хотя сейчас подумал, логика то есть в проверке, я же могу остановить перенос данных и что-бы возобновить мне придеться опять заняться чисткой((<br> по ссылкам согласен, тем более у меня и обращений к счету и к ул. "+ТекущаяКвартира.Владелец.Владелец.Наименование+" д."+ТекущаяКвартира.Владелец.Наименование+" "+"кв."+ТекущаяКвартира.Наименование несколько раз за цикл<br> Почитал про Транзакцию, думал она только отвечает за целостность данных, ан нет, буду пробовать!<br><br>Блин? я наверное зря после каждой проводки ставлю Опер.Записать()?<br><br>

Thorvardr
читатель
офлайн
Дата регистрации: 25.02.2005
Сообщений: 3082
Пост №4
 
17.06.2008 10:58

Ну... транзакция, в принципе, штука, которая убивает двух зайцев.<br>1. Если что то не получится, то в базе не появится кривой результат.<br>2. При объявлении транзакции дальнейшая работа идет в памяти, и не идет обновление базы данных на жестком диске. Соответственно, скорости выше на порядки. Но! Если памяти мало, а задача по изменению в базе данных огромна, то операционка начнет делать swap, поэтому, если я полностью уверен в алгоритме и "кривой" результат не ожидаю, то периодически по счетчику фиксирую транзакцию, высвобождая память.<br><br>Опер.Записать(), кнечно не надо делать после каждой проводки. Ведь при этом пересчитываются бух.итоги, а это небыстро. Накидали в операцию все нужные проводки, потом записали. Ну и со строкой, тоже, посчитать ее как то надо только один раз. Хотя... складывание строк идет быстро, а вот сравнение строк, если оно будет, идет гораздо дольше.

andrei_p
читатель
офлайн
Дата регистрации: 01.02.2007
Сообщений: 23
Пост №5
 
17.06.2008 15:34

Большое спасибо , все быстро работает!

Показывать по 10 20 40 сообщений

Читают тему:

Быстрый переход
Для технических специалистов
  • Книга жалоб и предложений по работе сайта
  • Для технических специалистов
  • Представление регламентированной отчетности
  • Говорильня
  • Бухгалтерский учет: обсуждаем проекты нормативных актов и рекомендаций по ведению учета от БМЦ
  • Новый порядок применения ККТ (онлайн кассы с передачей сведений в ФНС)
  • Интернет-конференция: Оформление командировок по новым правилам
  • МАРКИРОВКА
  • ЕГАИС
  • Учет, налогообложение, автоматизация