Имя: Пароль:
1C
 
Исправить неверные движения в регистрах
0 ildary
 
03.06.15
16:42
Уважаемые специалисты, посоветуйте пожалуйста, как правильно исправить следующее:

В базе УТ11 создано много документов РТиУ с пустой датой оплаты, в результате регистр Расчеты с клиентами разбух до большого размера.
Если просто сделать запись с перепроведением - то все проводится очень медленно. Существует ли способ ускорить это исправление? Например можно ли удалить программно все движения этого регистра с пустой датой, затем сделать сжатие базы и перезаписать дату с перепроведением?
1 разработчик 1с
 
03.06.15
16:48
так закрой регистр, если разбух. зачем документы перепроводить
2 Naumov
 
03.06.15
16:49
можно просмотреть записи регистра и исправить где надо.
3 ДенисЧ
 
03.06.15
16:50
на нимфострате есть граната для обезъяны...
4 ildary
 
03.06.15
17:16
(1) а как его закрыть? хотя бы общими словами?
(2) то есть я могу сделать перебор записей регистра и напрямую их изменить? Я на самом деле семерочник и не уверен, что в 1с8 такое возможно (пока осваиваю букварь и до регистров не дошел).

(3) я там безденежный, поэтому давно ничего не качаю оттуда. А все-таки можно ли обработкой перебрать записи регистра и автоматом их исправить?
5 ДенисЧ
 
03.06.15
17:16
в 77 движения делают только документы (если лезьть прямо в таблицы).
О тсюда и пляши
6 ildary
 
03.06.15
17:19
(5) в 7.7 понятно - бери и проводи, либо прямым запросом шуруй. А какие способы в восьмерке для оперативного исправления подобного есть? Перепроводить - так в час только 30 документов проводится, а их больше тысячи.
7 Naumov
 
03.06.15
17:20
(6) Смотри СП по регистру накопления, в частности про наборЗаписей
8 ДенисЧ
 
03.06.15
17:20
(6) набор = регистрыНакопления.товарыНаСкладах.СоздатьНаборЗаписей();
набор.Отбор.Регистратор.Установить()...
9 ildary
 
03.06.15
17:24
(7) значит я могу перебрать записи регистра и изменить поле период?

(8) большое спасибо, а данный метод позволить менять поле Период у регистра?
10 ДенисЧ
 
03.06.15
17:25
(9) да
11 Naumov
 
03.06.15
17:33
(9) Ты уверен, что период? Поле период у записи регистра пустым не может быть - не даст записать движения.
12 ildary
 
03.06.15
17:34
(10) спасибо за советы, но я обнаружил, что у РегистрНакопленияВыборка параметр Период - только для чтения...
13 Naumov
 
03.06.15
17:35
(12) Потому что есть разные объекты. Менять можно либо в МенеджереЗаписи, Либо в НабореЗаписей.
14 ДенисЧ
 
03.06.15
17:35
(12) У выборки - все поля для чтения
15 разработчик 1с
 
03.06.15
17:36
(12) может не надо тебе движения менять
16 ildary
 
03.06.15
17:42
(11) могу фотку записей регистра показать - когда увидел - сам был в шоке.

(13)+(14) спасибо, я понял, попробую

(15) ок, а как тогда эту беду исправить?
17 разработчик 1с
 
03.06.15
17:44
(16) ок, ты пишешь, что регистр "разбух до большого размера". как ты это понимаешь? что ты хочешь с этим сделать?
18 ДенисЧ
 
03.06.15
17:44
(16) а покажи...
19 ildary
 
03.06.15
17:46
(16) один регистр весит больше, чем вся прочая база в несколько раз (4Гб, все остальное тянет примерно на 400Мб), проведение реализации страшно тормозит (кстати и простое открытие реализации тоже - это может вызвать?). Думаю, что этого достаточно, чтобы попробовать исправить.

(17) момент, щас сварганю
20 разработчик 1с
 
03.06.15
17:50
(19) в при открытии поставь замер производительности, посмотри, что так долго делается. не факт, что это из-за регистра.
можно свернуть регистр, есть всякие спец обработки. можно самому написать. на 1 января снимаешь остатки, заносишь их корректировкой. остальные все записи до 1 января через наборы удаляешь. смотри чтобы документы никто не перепроводил.
21 Naumov
 
03.06.15
17:52
(20) Скорее всего состояние расчетов проверяется, если регистр не закрыт, то вполне возможно, что будет долго думать.
22 ildary
 
03.06.15
17:57
(18) вот http://s020.radikal.ru/i708/1506/91/d11299f66206.png

(20) спасибо, проверю
23 ildary
 
03.06.15
21:22
Сделал примерно так, но даже в этом случае каждая запись проходит от 50 секунд до 3 минут, можно ли тут что ускорить?

    Док = Документы.РеализацияТоваровУслуг.Выбрать( ,,, "Дата Убыв" );
    Пока Док.Следующий() Цикл
        
        Если ЗначениеЗаполнено( Док.ДатаПлатежа ) Тогда
            
            Продолжить;
            
        КонецЕсли;
        
        Сообщить( Док );
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "" + Док;
        Сообщение.Сообщить();
        
        Набор = РегистрыНакопления.РасчетыСКлиентами.СоздатьНаборЗаписей();
        Набор.Отбор.Регистратор.Установить( Док.ПолучитьОбъект().Ссылка );
        Набор.Прочитать();
        
        БылоИзменение = Ложь;
        
        Для Каждого СтрокаНабора Из Набор Цикл
            
            Если Год( СтрокаНабора.Период ) <> 1 Тогда
                
                Продолжить;
                
            КонецЕсли;
            
            БылоИзменение = Истина;
            
            СтрокаНабора.Период = Док.Дата;
            
        КонецЦикла;
        
        Если БылоИзменение Тогда
            
            Набор.Записать();
            
        КонецЕсли;
        
    КонецЦикла;
24 Naumov
 
03.06.15
23:14
(23) Ну если записей в регистре на миллионов 100, то можно попробовать все одним набором в один прием записать
25 Naumov
 
03.06.15
23:16
Набор.Отбор.Регистратор.Установить( Док.ПолучитьОбъект().Ссылка );
Изменить на
Набор.Отбор.Регистратор.Установить( Док.Ссылка );
26 ildary
 
04.06.15
05:07
(24) а как одним набором правильно получить все записи с регистратором, у которого дата пустая?

(25) спасибо за совет, по капле выдавливаю из себя семерочника.
27 ildary
 
04.06.15
06:06
Может быстрее будет запомнить документы, у которых есть такие движения, потом удалить эти пустые движения, сжать базу и перепровести документы без этих движений заново? Будет ли такая операция быстрее?
28 ildary
 
04.06.15
07:06
+(27) нет, быстрее не будет - ползет с такой же скоростью.
29 ildary
 
04.06.15
07:13
Все, тема закрыта - для скоростной работы достаточно
совета в №17 из v8: Как очистить регистр накопления?!

в начале выполнения сделать
РегистрыНакопления.РасчетыСКлиентами.УстановитьИспользованиеИтогов( Ложь );

а после
РегистрыНакопления.РасчетыСКлиентами.УстановитьИспользованиеИтогов( Истина );
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан