Форум программистов, компьютерный форум, киберфорум
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Наблюдатель
457 / 192 / 33
Регистрация: 01.05.2012
Сообщений: 1,028
1
1C 8.x

Работа с регистрами

01.09.2016, 09:56. Показов 1094. Ответов 8
Метки нет (Все метки)

Есть самописная конфа. Не моя. Разбираюсь что да как.

Есть код (корректирующая обработка), который выбирает из конкретного регистра (пусть будет: История) записи и проводится анализ.
Если в результате анализа выявлена ошибка, то в регистр вносятся изменения (когда то давно в коде была ошибка и в регистры записывалась не вся информация)
Получается что вызов регистра, чтение его данных и изменение проводятся в одном месте (типа)
Кликните здесь для просмотра всего текста
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    Для каждого строка Из ТзСлучай Цикл
...
...
...
    РегистрИсторииСлучая=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
    РегистрИсторииСлучая.Отбор.Случай.Установить(НашСлучай.Ссылка);
    РегистрИсторииСлучая.Прочитать();
        Если РегистрИсторииСлучая.количество()>0 Тогда
            Для НомСтр=1 По РегистрИсторииСлучая.Количество() Цикл
                Если ...
...
                   Ошибка=Ошибка+1;
...
                КонецЕсли; 
            КонецЦикла; 
        КонецЕсли;
 
        Если Ошибка>0 Тогда
            Продолжить;
        КонецЕсли; 
        //ошибки нет
    РегистрИсторииСлучая2=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
    РегистрИсторииСлучая2.Отбор.Случай.Установить(НашСлучай.Ссылка);
 
    ргИсторииСлучая=РегистрИсторииСлучая2.Добавить();
    ргИсторииСлучая.Период=ТекущаяДата();
    ргИсторииСлучая.Счет=РегистрИсторииСлучая[ЗаписьРегистраСлучая].Счет;
    ргИсторииСлучая.Случай=РегистрИсторииСлучая[ЗаписьРегистраСлучая].Случай;
            
    ргИсторииСлучая.КодОплаты=РегистрИсторииСлучая[ЗаписьРегистраСлучая].КодОплаты;
    ргИсторииСлучая.Сумма=РегистрИсторииСлучая[ЗаписьРегистраСлучая].Сумма;
        
    РегистрИсторииСлучая2.Записать();
 
...
...
...
 
 
    КонецЦикла;


Все работает как надо. Но только очень медленно.
Медленно (по наблюдениям) Инициализируются и пишутся регистры.

Инициализация и запись регистров делается каждый раз, как только это понадобится

Вопрос.
Можно ли вынести строки
1C
1
2
    РегистрИсторииСлучая=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
    РегистрИсторииСлучая2=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
и
1C
1
РегистрИсторииСлучая2.Записать();
за пределы основного цикла или по религии 1с такое не допустимо.
т.е.
Кликните здесь для просмотра всего текста
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        РегистрИсторииСлучая=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
    РегистрИсторииСлучая2=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
 
    Для каждого строка Из ТзСлучай Цикл
...
...
...
    РегистрИсторииСлучая.Отбор.Случай.Установить(НашСлучай.Ссылка);
    РегистрИсторииСлучая.Прочитать();
        Если РегистрИсторииСлучая.количество()>0 Тогда
            Для НомСтр=1 По РегистрИсторииСлучая.Количество() Цикл
                Если ...
...
                   Ошибка=Ошибка+1;
...
                КонецЕсли; 
            КонецЦикла; 
        КонецЕсли;
 
        Если Ошибка>0 Тогда
            Продолжить;
        КонецЕсли; 
        //ошибки нет
    РегистрИсторииСлучая2.Отбор.Случай.Установить(НашСлучай.Ссылка);
    ргИсторииСлучая=РегистрИсторииСлучая2.Добавить();
    ргИсторииСлучая.Период=ТекущаяДата();
    ргИсторииСлучая.Счет=РегистрИсторииСлучая[ЗаписьРегистраСлучая].Счет;
    ргИсторииСлучая.Случай=РегистрИсторииСлучая[ЗаписьРегистраСлучая].Случай;
            
    ргИсторииСлучая.КодОплаты=РегистрИсторииСлучая[ЗаписьРегистраСлучая].КодОплаты;
    ргИсторииСлучая.Сумма=РегистрИсторииСлучая[ЗаписьРегистраСлучая].Сумма;
        
 
...
...
...
 
 
    КонецЦикла; 
    РегистрИсторииСлучая2.Записать();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.09.2016, 09:56
Ответы с готовыми решениями:

Работа с независимыми регистрами сведений
Коллеги, нужна помощь начинающему. Есть задача: добавить запись независимого регистра сведений из...

Работа с регистрами сведений: ПрочитатьЗаписать или сразу Записать
добрый вечер. озадачился. что будет лучше и быстрее работать? рс с одним измерением. ...

Работа с регистрами
Пишу курсовую, выбрал очень неудачную тему Агентства недвижимости. (с точки зрения конкретных...

Работа с регистрами значений
задача такая: в регистр пишутся значения по пользователю и типу электричества. при выборе...

8
Модератор
Эксперт 1С
3130 / 2812 / 528
Регистрация: 10.03.2011
Сообщений: 10,826
Записей в блоге: 1
01.09.2016, 11:09 2
Alex Dark, переделай на МенеджерЗаписи
2
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
01.09.2016, 13:34 3
Скажите пожалуйста, сколько за этот цикл проходит итераций и какова вообще величина регистра?

Пути оптимизации:

можно добавить в регистр индексируемое измерение Месяц, куда писать дату начала месяца, делать отбор по нему, а не по случаю, добавлять записи и сохранять в него, что уменьшит количество обращений к базе.

Еще для оптимизации: что такое НашСлучай? Это объект или ссылка? Если объект, то ок, если ссылка, то каждый раз, когда вы пишете НашСлучай.Ссылка это масло масляное и лишнее ненужное очень тормозящее количество обращений к базе.

Добавлено через 29 минут
И почему вы читаете первый цикл через набор записей, а не запросом, непонятно. Это тоже может притормаживать алгоритм.

Добавлено через 29 минут
Хотя наверное Dethmontt дал исчерпывающий ответ, менеджер записи серьезно убыстрит, больше ничего не надо.
1
Эксперт 1С
841 / 604 / 211
Регистрация: 24.07.2013
Сообщений: 2,098
01.09.2016, 19:53 4
Цитата Сообщение от Alex Dark Посмотреть сообщение
Вопрос.
Можно ли вынести строки
1C
1
2
3
* * РегистрИсторииСлучая=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
* * РегистрИсторииСлучая2=РегистрыСведений.ИсторияСлучая.СоздатьНаборЗаписей();
и
1
РегистрИсторииСлучая2.Записать();
за пределы основного цикла или по религии 1с такое не допустимо.
Получится тоже самое. Чтение и запись регистра выполняется все равно в цикле.

Здесь может быть дело не только в коде, а в объеме данных и структуре регистра. Если обрабатывается большое количество записей, то желаемого прироста производительности, изменяя код, можно и не получить.
1
Наблюдатель
457 / 192 / 33
Регистрация: 01.05.2012
Сообщений: 1,028
03.09.2016, 07:18  [ТС] 5
Dethmontt, Tklwegsd, renat_dmitriev
Спасибо за участие.
Не подумайте что написал и свалил. Ваши ответы прочитаны и поняты.
Извините немного был занят.

Ещё раз, по теме. Вопрос в шапке - чисто теоретический.
Обработка (на которую я ссылаюсь) внешняя. Отрабатывается раз а полгода-год по факту проблемы.
Выполняется по времени не так уж и долго.
НО !!!
По типу этой обработки в конфе достаточно много алгоритмов записи в регистр.
Например Обработка итогов. Есть такой документ. По времени он может выполняться несколько часов (до суток)
Поэтому и появилась мысль как то оптимизировать, а попробовать на более простой обработке.

Добавлено через 3 минуты
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
И почему вы читаете первый цикл через набор записей, а не запросом, непонятно.
Для визуального предварительного просмотра результаты запроса скидываются в ТЗ.

Добавлено через 10 минут
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
Скажите пожалуйста, сколько за этот цикл проходит итераций и какова вообще величина регистра?
Конкретно в произошедшем случае 54 записи.
Два регистра. Измерений 2. Ресурсы 4
Измерения: Документ, Случай (уникален).
Документов за месяц может быть не менее 50.
В одном документе может быть от 1 до 5000 случаев

Добавлено через 10 минут
Цитата Сообщение от Tklwegsd Посмотреть сообщение
, а в объеме данных и структуре регистра. Если обрабатывается большое количество записей, то желаемого прироста производительности, изменяя код, можно и не получить.
Да я с вами согласен.
но!!!
Я эту обработку "проходил" под отладчиком (искал ошибку) обратил внимание именно на то что инициализация регистра и вызов были внутри цикла. И визуально давали задержку в 1 секунду.
Такая-же задержка происходила при записи изменений в регистр.
Было у меня 54 записи для отработки. С каждой по 2 секунды вот почти две минуты.
Поэтому и появился такой чисто теоретический вопрос.
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
03.09.2016, 07:23 6
Цитата Сообщение от Alex Dark Посмотреть сообщение
Для визуального предварительного просмотра результаты запроса скидываются в ТЗ.
Получение данных это одно, визуальное их отображение - другое. Они никак не связаны. Как полученное через набор записей вы можете отобразить в табличном поле, так и полученное через запрос. В данном случае очевидно логически правильней и быстрей не создавать в цикле набор записей с целью его чтения а сделать единственный запрос к базе с отбором по всем проверяемым ссылкам на случаи (НашСлучай.Ссылка) и итогами по случаю, после чего сделать иерархическую выборку из результатов запроса и внутри этой выборки создавать менеджер записи, заполнять его значениями и записывать. Так будет и значительно быстрей и логически правильней.

обратил внимание именно на то что инициализация регистра и вызов были внутри цикла. И визуально давали задержку в 1 секунду.
Вот 54 секунды и будет выигрыш. Два простых шага:
1) Выносите из цикла получение данных, получаете их одним запросом
2) Меняете Набор записей на Менеджер записей.
1
Наблюдатель
457 / 192 / 33
Регистрация: 01.05.2012
Сообщений: 1,028
03.09.2016, 07:39  [ТС] 7
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
Если объект, то ок, если ссылка, то каждый раз, когда вы пишете НашСлучай.Ссылка это масло масляное и лишнее ненужное очень тормозящее количество обращений к базе.
Ок. Учту.
Цитата Сообщение от renat_dmitriev Посмотреть сообщение
можно добавить в регистр индексируемое измерение Месяц, куда писать
Быстрее всего что нет.
каждый обрабатываемый случай привязан к конкретному периоду (месяцу) и эта привязанность чисто для отчетности.
И пока я не разберусь с имеющимся алгоритмом работы конфигурации я ни чего принципиального менять не буду.

ps а алгоритм, поверьте, далеко не простой. Не простой но не потому что тут код сложный. Не простой он потому что наше вышестоящее руководство + законодатели всех уровней нагородили такой огород...
Как в монологе, если кто помнит:
"Здесь играем, здесь не играем. Здесь рыбу заворачивали. Вот тут берём кусочек вот отсюда, но только в третьем такте. И не перепутай, в третьем. И то если рукой сделаю вот так..."
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
03.09.2016, 07:54 8
Цитата Сообщение от Alex Dark Посмотреть сообщение
Быстрее всего что нет.
каждый обрабатываемый случай привязан к конкретному периоду (месяцу) и эта привязанность чисто для отчетности.
И пока я не разберусь с имеющимся алгоритмом работы конфигурации я ни чего принципиального менять не буду.
Данное мое предположение не предполагало изменения ни единой существующей строчки кода, мы просто добавляли в регистр измерение Месяц исключительно ради возможности делать отбор в наборе записей по месяцу, а не по каждому конкретному случаю. Другое дело, что менеджер записи все равно как оказалось работает значительно быстрей.

Цитата Сообщение от Alex Dark Посмотреть сообщение
а алгоритм, поверьте, далеко не простой. Не простой но не потому что тут код сложный. Не простой он потому что наше вышестоящее руководство + законодатели всех уровней нагородили такой огород...
Задача внедренца любой огород в головах начальства перевести в ясные и понятные объекты программы и простой четко структурированный код. Поэтому по моему личному наблюдению, любая сложность алгоритма - это непродуманные действия внедренца. Конечный пользователь, и уж тем более законодатели ни в коем случае не могут быть ответственны за сложности кода. Грамотное внедоение - это когда то, что кажется сложным заказчику-работодателю, сделать простым, ясным и четким в программе. Все сложности - в человеческих мозгах и нигде более.
1
Наблюдатель
457 / 192 / 33
Регистрация: 01.05.2012
Сообщений: 1,028
03.09.2016, 09:35  [ТС] 9

Не по теме:

Цитата Сообщение от renat_dmitriev Посмотреть сообщение
Поэтому по моему личному наблюдению, любая сложность алгоритма - это непродуманные действия внедренца.
...
Все сложности - в человеческих мозгах и нигде более.
я не второй, кто разрабатывает (в моём случае пока громко сказано - разрабатывает) эту конфу.
И даже не третий и не четвертый.
Мой предшественник, (спасибо что не отказывает) оказывает посильную помощь в разъяснении идей пришедших свыше и методов их реализации.
И то что методы реализации далеки от оптимальных ясно хотя бы по коментам в коде.
Типа "здесь какой то косяк, противоречие здравого смысла и алгоритма спущенного с верху. По указанию номер такой то делать надо так .... Результат выборки - неоднозначность. Вбиваем костыль. Вылезет в таких то случаях. Редкость большая. Если что, вернётся в виде ошибки. Править ручками в документе"
далее идет кусок заремаренного кода (как надо по алгоритму) и блок кода с пометкой КОСТЫЛЬ.

Костыль - как раз кусок кода который противоречит методике, но выдаёт в 95% правильный результат.
Методика - половину в лучшем случае сливает в неоднозначность, в результате оператор должен каждый случай открыть посмотреть и клацнуть "ДА, это нормально".

но всё это к теме не относится



Добавлено через 32 минуты

Не по теме:

Вывод достаточно прост.
времени на реализацию всех несуразностей у моих предшественников реально не хватало.

Сам столкнулся с таким случаем неоднозначности. Потратил впустую на него целый день. Если бы сразу проконсультировался с предшественником он бы мне сразу сказал - что не стоит..

Случай выпадает раз на тысячу.
Его реализация - выкинула в ошибку десятки других, правильных записей.
Делема: одна запись в ошибках или десяток?
Грубо говоря.
Правило расчета для группы случаев (а их там 1500) по условиям А,Б,В,Г,Д - Алгоритм1.
НО !!! для случая 386, если выполняется А и Б и С или неА и С или Б=Д и это случилось первый раз в году делается по Алгоритму2 и только если Алгоритм1 выдает результат меньший чем Алгоритм2.
НО !!! для Алгоритм2 для такого же набора случаев но с другими условиями, есть свой случай с кучей условий при выполнении которых надо использовать Алгоритм1.
А есть ещё Алгоритм3, Алгоритм4. И там свои тараканы

При чем метод выбора алгоритма изначально определяется до получения выборки случаев по правилам которые ни как напрямую не связаны со случаями.
Короче как в Кин-Дза-Дза

— Ну вот у вас, на Земле, как вы определяете — кто перед кем сколько должен присесть?
— Ну, эт на глаз…
— Дикари.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.09.2016, 09:35

Создание и работа с регистрами
Здравствуйте! Подскажите, пожалуйста, методы реализации такого вопроса: Есть склад, объем...

Работа с регистрами
Как записать в регистр AL содержимое переменной (к примеру, min), заданной как слово? (dw)

Работа с регистрами
Помогите реализовать это: Задано число в регистре AX. Установить биты 0,3,5 в значение 0....

работа с регистрами ST
Как переложить содержимое st(0) в st(1) и обратно?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.