Имя: Пароль:
1C
1С v8
v8: как ускорить загрузку в регистр бухгалтерии
,
0 Garry1010
 
27.12.13
15:42
Удивительное дело, каким образом 1С пишет свои методы объектов.
В продолжение своей ранней темы с переносом проводок в МСФО занимаюсь сейчас ускорением работы этой шняги. Стал делать заполнение проводок через Таблицу значений, чтобы потом всё скопом загрузить в регистр и - О, ужас! Строка:
    Движения.Международный.Загрузить(тзМСФО);
работает так же медленно, как и обычный вариант с прямым созданием записей. Даже отключение использования итогов для регистра бухгалтерии не помогает.
Зато вариант с построчным добавлением записей в регистр работает в 10(!) раз быстрее (160 секунд вместо 1366). То есть что-то типа:
Для Каждого стр из тзМСФО цикл
    запись = Движения.Международный.Добавить();
    ЗаполнитьЗначенияСвойств(запись, стр);
    Если стр.СубконтоДт1 <> Неопределено Тогда Запись.СубконтоДт[стр.ВидСубконтоДт1] = стр.СубконтоДт1 КонецЕсли;
    Если стр.СубконтоДт2 <> Неопределено Тогда Запись.СубконтоДт[стр.ВидСубконтоДт2] = стр.СубконтоДт2 КонецЕсли;
    Если стр.СубконтоДт3 <> Неопределено Тогда Запись.СубконтоДт[стр.ВидСубконтоДт3] = стр.СубконтоДт3 КонецЕсли;
    Если стр.СубконтоКт1 <> Неопределено Тогда Запись.СубконтоКт[стр.ВидСубконтоКт1] = стр.СубконтоКт1 КонецЕсли;
    Если стр.СубконтоКт2 <> Неопределено Тогда Запись.СубконтоКт[стр.ВидСубконтоКт2] = стр.СубконтоКт2 КонецЕсли;
    Если стр.СубконтоКт3 <> Неопределено Тогда Запись.СубконтоКт[стр.ВидСубконтоКт3] = стр.СубконтоКт3 КонецЕсли;
КонецЦикла;

...даёт офигенный прирост скорости. Я обалдеваю... Может кому-то поможет при поиске ответа на вопрос "как ускорить загрузку в регистр бухгалтерии".
1 Maxus43
 
27.12.13
16:06
Что за тзМСФО? сколько записей? колонки типизированы?
2 ptiz
 
27.12.13
16:08
Не верю, что в этом дело.
3 Azverin
 
27.12.13
16:09
о, ужас!
4 Кирпич
 
27.12.13
16:12
мож под отладкой запускаешь
5 Garry1010
 
27.12.13
17:42
(1) Очевидно, что ТаблицаЗначений.;) 25408 строк - нормально? Строго типизированы, ибо созданы выгрузкой из регистра (когда он пустой вначале): тзМСФО = Движения.Международный.Выгрузить();
(2) Сам не верю...
(4) Вообще-то, да.[:шарк:] И сейчас вот без отладки что-то тормозит, собака! О_О Как это вообще возможно??? Они там в 1С вообще сдурели, что ли?..
Хотя исходный вариант с загрузкой всей таблицы ведь тоже под Отладчиком сидел, однако не ускорялся от него.-_-
Чудеса! Я добавил в цикл вывод состояния с прогресс-баром - и всё полетело красиво и быстро, как под отладкой.
6 H A D G E H O G s
 
27.12.13
17:43
(5) Хрень какая-то.
7 Garry1010
 
27.12.13
17:46
(6) Не то слово!О_О
8 Мимохожий Однако
 
27.12.13
17:47
(6) + 1
(7) - 1
9 Apokalipsec
 
27.12.13
17:48
В (0) не вижу, чтобы записывалась запись в регистр, автор ты просто добавляешь?))
Автор - черепашка.
10 vde69
 
модератор
27.12.13
17:50
(5) для отлдадчика каждая лишняя строка = замедление,

если отладчика нет - количество строк влияет только если код выполняется на клиенте, при выполнении на сервере писать в одну строку не имеет смысла.

собственно именно по этому ты и поимел неверные оценки скорости
11 hhhh
 
27.12.13
18:07
(7) перебор-то понятно должен быстрее работать, чем Загрузить().

попробуйте еще заменить ЗаполнитьЗначенияСвойств(), еще быстрее получится.
12 Garry1010
 
27.12.13
18:08
(9) Так это документ ПереносПроводок такой - там сначала заполняются проводки, показываются в форме документа и лишь потом документ записывается вместе с регистрами своими. Ясен пень, что я не собираюсь записывать в базу 25408 строк по одной строке.[:гы-гы:]
13 Garry1010
 
27.12.13
18:12
(10) Посмотрим - пока, вроде, удалось добиться ускорения.
(11) Хз. Обычно встроенные методы должны(?) работать быстрее - они же не подвергаются интерпретации кода. Видать, тут у 1С что-то криво написано.
(10) Не понял про "если отладчика нет - количество строк влияет только"... По идее, наоборот, чем меньше строк, тем быстрее должно жужжать - верно? А тут - наоборот.
Ошибка? Это не ошибка, это системная функция.