Имя: Пароль:
1C
1С v8
Как предотвратить "зависание" 1с?
0 Evil-Wisp
 
15.09.11
07:12
Добрый день. Написал обработку, которая восстанавливает последовательность по заданным параметрам, в указанное время. Проблема в том, что после нескольких минут от начала работы обработки 1с перестает отвечать, и не обновляет свою строку состояния. После этого невозможно понять работает обработка, и какой день восстанавливается. Только залезть в журнал и посмотреть.
И так со многими обработками. Если она что-то делает интенсивное, то 1с перестает отвечать, следовательно перестают обновляется процессбары и другие элементы на форме до окончания исполнения кода обработки.
Может кто-то справлялся с этим? Например Групповая обработка СиД никогда не зависает.
Платформа: 1С:Предприятие 8.1 (8.1.15.14).
1 skunk
 
15.09.11
07:14
посмотреть как радотает групповая обработка ... сделать анологично
2 IamAlexy
 
15.09.11
07:15
ээээ ну допустим у тебя ест обработка.
на форме обработки допустим у тебя выбор периода и кнопка "Выполнить"

ты хочешь - чтобы после нажатия кнопки поля выбора периода начинали хаотично перемещатся по форме а кнопка "Выполнить" должна мигать?
или что?
3 Evil-Wisp
 
15.09.11
07:19
Я хочу, чтобы при выполнении
Последовательности.Восстановить(ТекущаяДатаВосстановления,ТаблицаПоследовательностей);
Продолжал обновлятся статус - какой день восстанавливается.
Здесь возможно винда решает, что 1с не отвечает, и перестает обновлять ее.
4 Kassius
 
15.09.11
07:19
(2) какая феерия =)
(достал попкорн)
Расскажи еще про кнопочки =)
5 skunk
 
15.09.11
07:20
нет здесь 1С решает что ей нафих не надо обновлять
6 Sammo
 
15.09.11
07:46
Ихмо, подобные вещи лучше делать регламентами, а там уже Состояний.
Пусть пишет в журнал регистраций протокол работы
7 Evil-Wisp
 
15.09.11
07:54
В журнал регистрации и так пишутся результаты проведения документов. Мне нужно видеть это на форме.
Регламентным заданием не получилось, т.к. устанавливается блокировка базы.
8 dmpl
 
15.09.11
08:03
(3) Винда ничего не решает. Она посылает окну 1С сообщение WM_PAINT, которое ввиду отсутствия нормальной многопоточности в работе 1С просто ожидает, когда можно будет вклиниться и обновить окно. В это время и появляются белые места на окне. Когда в очереди необработанных событий становится много событий - вот тогда винда и решает, что приложение не отвечает.
9 vde69
 
15.09.11
08:06
вставь в обработку ОбработатьПрерываниеПользователя()
10 Evil-Wisp
 
15.09.11
08:09
(9) Она стоит в цикле. Но Последовательности.Восстановить(Дата,ТЗ) это непрерывная операция. Даже когда я в цикле восстанавливаю по дням, проверяя не закончилось ли время, отведенное для проведения форма все равно не отвисает.
(8) Да, скорей всего из за корявой многопоточности.
11 andrewks
 
15.09.11
08:13
даёшь потоки в 1С!
12 vde69
 
15.09.11
08:19
(10) сам себе злобный буратино, по чему не сделал по документно?

вот в регламенте у меня, запуск каждые 30 минут и не мешает никому



Функция    СравнитьПараметр(Документ, ПараметрСравнения, НовыеЗначения, СтарыеЗначения)
   результат = "";
   
   
   Запись = Новый Структура;
   Запись.Вставить("Регистратор", Документ);
   Запись.Вставить("Контроль", ПараметрСравнения);
   
   ТЗ1 = НовыеЗначения.Скопировать(Запись);
   ТЗ2 = СтарыеЗначения.Скопировать(Запись);
   
   ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТЗ1, ТЗ2);
   ТЗ2.Свернуть("ДенежноеТребование", "");
   Для Каждого эл из ТЗ2 Цикл
       НЗ = 0;
       НС = 0;
       
       Запись.Вставить("ДенежноеТребование", эл.ДенежноеТребование);
       
       Строки = НовыеЗначения.НайтиСтроки(Запись);
       Для Каждого е из Строки Цикл
           НЗ = НЗ + е.СуммаОборот;
       КонецЦикла;
       
       Строки = СтарыеЗначения.НайтиСтроки(Запись);
       Для Каждого е из Строки Цикл
           НС = НС + е.СуммаОборот;
       КонецЦикла;
       
       Если НЗ <> НС Тогда
           результат = результат + "" + эл.ДенежноеТребование + ", " + ПараметрСравнения + " скорректированы на: " + Формат(НС - НЗ, "ЧДЦ=2") + "
                           |";
       КонецЕсли;
   КонецЦикла;
   
   возврат результат;
КонецФункции

Функция ПолучитьЗначениеКонтроля (Документ)
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("Регистратор", Документ);
   Запрос.Текст =
       "ВЫБРАТЬ
       |    КомиссииНачисленныеОбороты.Период,
       |    КомиссииНачисленныеОбороты.Регистратор,
       |    КомиссииНачисленныеОбороты.ДенежноеТребование,
       |    СУММА(КомиссииНачисленныеОбороты.СуммаОборот) КАК СуммаОборот,
       |    ""Начисленые комиссии"" КАК Контроль
       |ИЗ
       |    РегистрНакопления.КомиссииНачисленные.Обороты(, , Регистратор, ) КАК КомиссииНачисленныеОбороты
       |ГДЕ
       |    КомиссииНачисленныеОбороты.Регистратор = &Регистратор
       |
       |СГРУППИРОВАТЬ ПО
       |    КомиссииНачисленныеОбороты.Регистратор,
       |    КомиссииНачисленныеОбороты.Период,
       |    КомиссииНачисленныеОбороты.ДенежноеТребование
       |
       |ОБЪЕДИНИТЬ ВСЕ
       |
       |ВЫБРАТЬ
       |    КомиссииУдержанныеОбороты.Период,
       |    КомиссииУдержанныеОбороты.Регистратор,
       |    КомиссииУдержанныеОбороты.ДенежноеТребование,
       |    КомиссииУдержанныеОбороты.СуммаОборот,
       |    ""Удержаные комиссии""
       |ИЗ
       |    РегистрНакопления.КомиссииУдержанные.Обороты(, , Регистратор, ) КАК КомиссииУдержанныеОбороты
       |ГДЕ
       |    КомиссииУдержанныеОбороты.Регистратор = &Регистратор
       |
       |ОБЪЕДИНИТЬ ВСЕ
       |
       |ВЫБРАТЬ
       |    ТекущееФинансированиеОбороты.Период,
       |    ТекущееФинансированиеОбороты.Регистратор,
       |    ТекущееФинансированиеОбороты.ДенежноеТребование,
       |    ТекущееФинансированиеОбороты.СуммаОборот,
       |    ""Финансирование""
       |ИЗ
       |    РегистрНакопления.ТекущееФинансирование.Обороты(, , Регистратор, ) КАК ТекущееФинансированиеОбороты
       |ГДЕ
       |    ТекущееФинансированиеОбороты.Регистратор = &Регистратор
       |
       |ОБЪЕДИНИТЬ ВСЕ
       |
       |ВЫБРАТЬ
       |    ВзаиморасчетыУпрОбороты.Период,
       |    ВзаиморасчетыУпрОбороты.Регистратор,
       |    ВзаиморасчетыУпрОбороты.ДенежноеТребование,
       |    ВзаиморасчетыУпрОбороты.СуммаОборот,
       |    ""Взаиморасчеты""
       |ИЗ
       |    РегистрНакопления.ВзаиморасчетыУпр.Обороты(, , Регистратор, ) КАК ВзаиморасчетыУпрОбороты
       |ГДЕ
       |    ВзаиморасчетыУпрОбороты.Регистратор = &Регистратор";
   
   
   ТЗ = Запрос.Выполнить().Выгрузить();
   Возврат ТЗ;
КонецФункции

Процедура ОбработатьДокумент (мДок, МассивДТ, Остановка, ТекущийМомент)
   
   Стратегия = Константы.СтратегияПерерасчетов.Получить();

   Если ТипЗнч(мДок) = Тип("ДокументСсылка.РаспределениеСредствДебитора") Тогда
       МоментВостановления = Новый МоментВремени (мДок.ПлатежноеПоручение.Дата, мДок);
   ИначеЕсли ТипЗнч(мДок) = Тип("ДокументСсылка.РазноскаПоступлений") Тогда
       МоментВостановления = Новый МоментВремени (мДок.ПлатежноеПоручение.Дата, мДок);
   Иначе
       МоментВостановления = мДок.МоментВремени();
   КонецЕсли;

   Если ОстанавливатьПриОткатеГП Тогда
       Если не (ТекущийМомент = Неопределено) Тогда
           // проверим откат
           
           СравнениеМоментов = ТекущийМомент.Сравнить(МоментВостановления);
           Если СравнениеМоментов >= 0 Тогда
               // кто-то откатил последовательность, нужно остановится
               Остановка = Истина;
               Возврат;
           КонецЕсли;
       КонецЕсли;
       ТекущийМомент = МоментВостановления;
   КонецЕсли;

   Если не мДок.Проведен Тогда
       ПолныеПрава.РегистрироватьГраницыПоследовательностиКомисий(мДок, МоментВостановления, Остановка, МассивДТ);
       Возврат;
       
   ИначеЕсли не ЗначениеЗаполнено(Стратегия)Тогда
       ПолныеПрава.РегистрироватьГраницыПоследовательностиКомисий(мДок, МоментВостановления, Остановка, МассивДТ);
       Возврат;
       
   ИначеЕсли Стратегия = Перечисления.СтратегияПерерасчетов.НеПерерасчитывать Тогда
       ПолныеПрава.РегистрироватьГраницыПоследовательностиКомисий(мДок, МоментВостановления, Остановка, МассивДТ);
       Возврат;
       
   ИначеЕсли (     (Стратегия = Перечисления.СтратегияПерерасчетов.ПерерасчетБезРазносок)
               или (Стратегия = Перечисления.СтратегияПерерасчетов.ПерерасчетТолькоПослеРазноски))
           И (        (ТипЗнч(мДок) = Тип("ДокументСсылка.РазноскаПоступлений"))
               или (ТипЗнч(мДок) = Тип("ДокументСсылка.РаспределениеСредствДебитора"))) Тогда
       ПолныеПрава.РегистрироватьГраницыПоследовательностиКомисий(мДок, МоментВостановления, Остановка, МассивДТ);
       Возврат;
       
   ИначеЕсли (Стратегия = Перечисления.СтратегияПерерасчетов.ПерерасчетТолькоПослеРазноски) Тогда
       // проверим наличие разноски в будующем
       Запрос = Новый запрос (
           "ВЫБРАТЬ РАЗЛИЧНЫЕ
           |    Комиссии.ДенежноеТребование КАК ДенежноеТребование
           |ИЗ
           |    Последовательность.Комиссии КАК Комиссии
           |ГДЕ
           |    Комиссии.ДенежноеТребование В(&МассивДТ)
           |    И Комиссии.МоментВремени >= &МоментВремени
           |    И (ТИПЗНАЧЕНИЯ(Комиссии.Регистратор) = ТИП(Документ.РазноскаПоступлений)
           |            ИЛИ ТИПЗНАЧЕНИЯ(Комиссии.Регистратор) = ТИП(Документ.РаспределениеСредствДебитора))");
           
       Запрос.УстановитьПараметр("МассивДТ", МассивДТ);
       Запрос.УстановитьПараметр("МоментВремени", МоментВостановления);
       тзИсключений = Запрос.Выполнить().Выгрузить();
       МассивИсключений = тзИсключений.ВыгрузитьКолонку("ДенежноеТребование");
       ПолныеПрава.РегистрироватьГраницыПоследовательностиКомисий(мДок, МоментВостановления, Остановка, МассивИсключений);
       
       Для Каждого эл из МассивИсключений Цикл
           Инд = МассивДТ.Найти(эл);
           Если инд <> Неопределено Тогда
               МассивДТ.Удалить(Инд);
           КонецЕсли;
       КонецЦикла;
       
       Если МассивДТ.Количество() = 0 Тогда        
           Возврат;
       КонецЕсли;
   КонецЕсли;    
   
   
   ДокументОбъект = мДок.ПолучитьОбъект();
   ТипЗначенияСсылки = ТипЗнч(мДок);

   // получим свои скоректированые проводки
   ТаблицаПроводок = ПроведениеДокументов.СоздатьПустуюТаблицуПроводок();

   ПроведениеДокументов.ДобавитьПроводкиПоНачислениюКомиссий(ДокументОбъект, ТаблицаПроводок, МассивДТ);

   Если ТипЗнч(мДок) = Тип("ДокументСсылка.РазноскаПоступлений")
       ИЛИ ТипЗнч(мДок) = Тип("ДокументСсылка.РаспределениеСредствДебитора") Тогда
       СтрокаСообщения = "";
       
       Если ТипЗнч(мДок) = Тип("ДокументСсылка.РазноскаПоступлений") Тогда
           ПроведениеДокументов.ДобавитьПроводкиПоРазноске(ДокументОбъект, ТаблицаПроводок, МассивДТ, СтрокаСообщения, Остановка);
       ИначеЕсли ТипЗнч(мДок) = Тип("ДокументСсылка.РаспределениеСредствДебитора") Тогда
           Документы.РаспределениеСредствДебитора.ЗаполнитьТаблицуПроводок(ДокументОбъект, , ТаблицаПроводок, МассивДТ, СтрокаСообщения, Остановка);
       КонецЕсли;
       
       // особый случай, может делать движения и по другим регистрам

       //*******************************************************************
       // Регистр "ВзаиморасчетыУпр"
       Рег = РегистрыНакопления.ВзаиморасчетыУпр.СоздатьНаборЗаписей();
       Если Рег.Отбор.Регистратор.ТипЗначения.СодержитТип(ТипЗнч(мДок)) Тогда
           Рег.Отбор.Регистратор.Значение = мДок;
           ТПР_Рег = Рег.Выгрузить(Новый Массив());
               
           Для каждого Элемент из ТаблицаПроводок Цикл
               Если  (Элемент.ВидПроведения = "ПроведениеПоРегиструВзаиморасчетыУпр")
                   И (Элемент.Сумма <> 0) Тогда
                           
                   НоваяСтрока                    = ТПР_Рег.Добавить();
                   НоваяСтрока.ВидДвижения        = Элемент.ВидДвижения;
                   НоваяСтрока.Период                = Элемент.Период;
                   
                   НоваяСтрока.Организация         = Элемент.Организация;
                   НоваяСтрока.Контрагент          = Элемент.Контрагент;
                   НоваяСтрока.ЮрЛицо              = Элемент.ЮрЛицо;
                   НоваяСтрока.ДоговорПоставки     = Элемент.ДоговорПоставки;
                   НоваяСтрока.ДенежноеТребование  = Элемент.ДенежноеТребование;
                   НоваяСтрока.ВидКонтрагента      = Элемент.ВидКонтрагента;
                   НоваяСтрока.Сумма                = Элемент.Сумма;
                   
                   Если Не ЗначениеЗаполнено(НоваяСтрока.Период) тогда
                       // для этого регистра возможно проведение отличное от даты документа
                       НоваяСтрока.Период  = мДок.Дата;
                   КонецЕсли;
           
               КонецЕсли;
           КонецЦикла;

           Запрос2 = Новый Запрос;
           Запрос2.Текст =
               "ВЫБРАТЬ
               |    ВзаиморасчетыУпр.Период,
               |    ВзаиморасчетыУпр.Регистратор,
               |    ВзаиморасчетыУпр.НомерСтроки,
               |    ВзаиморасчетыУпр.Активность,
               |    ВзаиморасчетыУпр.ВидДвижения,
               |    ВзаиморасчетыУпр.Организация,
               |    ВзаиморасчетыУпр.Контрагент,
               |    ВзаиморасчетыУпр.ЮрЛицо,
               |    ВзаиморасчетыУпр.ДоговорПоставки,
               |    ВзаиморасчетыУпр.ДенежноеТребование,
               |    ВзаиморасчетыУпр.Сумма,
               |    ВзаиморасчетыУпр.ВидКонтрагента
               |ИЗ
               |    РегистрНакопления.ВзаиморасчетыУпр КАК ВзаиморасчетыУпр
               |ГДЕ
               |    ВзаиморасчетыУпр.Регистратор = &Регистратор
               |    И (НЕ ВзаиморасчетыУпр.ДенежноеТребование В (&ДенежноеТребование))";

           Запрос2.УстановитьПараметр("ДенежноеТребование", МассивДТ);
           Запрос2.УстановитьПараметр("Регистратор", мДок);

           ТПР_Рег2 = Запрос2.Выполнить().Выгрузить();
           ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТПР_Рег2, ТПР_Рег);
           
           ТПР_Рег.ЗаполнитьЗначения(мДок, "Регистратор");
           ТПР_Рег.ЗаполнитьЗначения(Истина, "Активность");
           
           Рег.Загрузить(ТПР_Рег);
           Рег.ОбменДанными.Загрузка = Истина;
           Рег.Записать(Истина);
           
       КонецЕсли;
       
       
       //*******************************************************************
       // Регистр "ОчередьВозвратовКлиенту"      
       Рег = РегистрыНакопления.ОчередьВозвратовКлиенту.СоздатьНаборЗаписей();
       Если Рег.Отбор.Регистратор.ТипЗначения.СодержитТип(ТипЗнч(мДок)) Тогда
           Рег.Отбор.Регистратор.Значение = мДок;
           ТПР_Рег = Рег.Выгрузить(Новый Массив());
               
           Для каждого Элемент из ТаблицаПроводок Цикл
               Если  (Элемент.ВидПроведения = "ПроведениеПоРегиструОчередьВозвратовКлиенту")
                   И (Элемент.Сумма <> 0) Тогда
                           
                   НоваяСтрока                    = ТПР_Рег.Добавить();
                   НоваяСтрока.ВидДвижения        = Элемент.ВидДвижения;
                   НоваяСтрока.Период                = Элемент.Период;
                   
                   НоваяСтрока.ЮрЛицо              = Элемент.ЮрЛицо;
                   НоваяСтрока.ДоговорПоставки     = Элемент.ДоговорПоставки;
                   НоваяСтрока.ДенежноеТребование  = Элемент.ДенежноеТребование;
                   
                   
                   НоваяСтрока.Сумма                = Элемент.Сумма;
                   
                   Если Не ЗначениеЗаполнено(НоваяСтрока.Период) тогда
                       // для этого регистра возможно проведение отличное от даты документа
                       НоваяСтрока.Период  = мДок.Дата;
                   КонецЕсли;
               КонецЕсли;
           КонецЦикла;

           Запрос2 = Новый Запрос;
           Запрос2.Текст =
               "ВЫБРАТЬ
               |    ОчередьВозвратовКлиенту.Период,
               |    ОчередьВозвратовКлиенту.Регистратор,
               |    ОчередьВозвратовКлиенту.НомерСтроки,
               |    ОчередьВозвратовКлиенту.Активность,
               |    ОчередьВозвратовКлиенту.ВидДвижения,
               |    ОчередьВозвратовКлиенту.ЮрЛицо,
               |    ОчередьВозвратовКлиенту.ДоговорПоставки,
               |    ОчередьВозвратовКлиенту.ДенежноеТребование,
               |    ОчередьВозвратовКлиенту.Сумма
               |ИЗ
               |    РегистрНакопления.ОчередьВозвратовКлиенту КАК ОчередьВозвратовКлиенту
               |ГДЕ
               |    ОчередьВозвратовКлиенту.Регистратор = &Регистратор
               |    И (НЕ ОчередьВозвратовКлиенту.ДенежноеТребование В (&ДенежноеТребование))";

           Запрос2.УстановитьПараметр("ДенежноеТребование", МассивДТ);
           Запрос2.УстановитьПараметр("Регистратор", мДок);

           ТПР_Рег2 = Запрос2.Выполнить().Выгрузить();
           ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТПР_Рег2, ТПР_Рег);
           
           ТПР_Рег.ЗаполнитьЗначения(мДок, "Регистратор");
           ТПР_Рег.ЗаполнитьЗначения(Истина, "Активность");
           
           Рег.Загрузить(ТПР_Рег);
           Рег.ОбменДанными.Загрузка = Истина;
           Рег.Записать(Истина);
           
       КонецЕсли;
       
       
       
       //*******************************************************************
       // Регистр "ТекущееФинансирование"
       Рег = РегистрыНакопления.ТекущееФинансирование.СоздатьНаборЗаписей();
       Если Рег.Отбор.Регистратор.ТипЗначения.СодержитТип(ТипЗнч(мДок)) Тогда
           Рег.Отбор.Регистратор.Значение = мДок;
           ТПР_Рег = Рег.Выгрузить(Новый Массив());
               
           Для каждого Элемент из ТаблицаПроводок Цикл
               Если  (Элемент.ВидПроведения = "ПроведениеПоРегиструТекущееФинансирование")
                   И (Элемент.Сумма <> 0) Тогда
                           
                   НоваяСтрока                    = ТПР_Рег.Добавить();
                   НоваяСтрока.ВидДвижения        = Элемент.ВидДвижения;
                   НоваяСтрока.Период             = Элемент.Период;
                   НоваяСтрока.ДенежноеТребование = Элемент.ДенежноеТребование;
                   НоваяСтрока.ДоговорПоставки    = Элемент.ДоговорПоставки;
                   НоваяСтрока.Сумма              = Элемент.Сумма;
                   
                   Если Не ЗначениеЗаполнено(НоваяСтрока.Период) тогда
                       НоваяСтрока.Период  = мДок.Дата;
                   КонецЕсли;
           
               КонецЕсли;
           КонецЦикла;

           Запрос2 = Новый Запрос;
           Запрос2.Текст =
               "ВЫБРАТЬ
               |    ТекущееФинансирование.Период,
               |    ТекущееФинансирование.Регистратор,
               |    ТекущееФинансирование.НомерСтроки,
               |    ТекущееФинансирование.Активность,
               |    ТекущееФинансирование.ВидДвижения,
               |    ТекущееФинансирование.ДоговорПоставки,
               |    ТекущееФинансирование.ДенежноеТребование,
               |    ТекущееФинансирование.Сумма
               |ИЗ
               |    РегистрНакопления.ТекущееФинансирование КАК ТекущееФинансирование
               |ГДЕ
               |    ТекущееФинансирование.Регистратор = &Регистратор
               |    И (НЕ ТекущееФинансирование.ДенежноеТребование В (&ДенежноеТребование))";

           Запрос2.УстановитьПараметр("ДенежноеТребование", МассивДТ);
           Запрос2.УстановитьПараметр("Регистратор", мДок);

           ТПР_Рег2 = Запрос2.Выполнить().Выгрузить();
           ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТПР_Рег2, ТПР_Рег);
           
           ТПР_Рег.ЗаполнитьЗначения(мДок, "Регистратор");
           ТПР_Рег.ЗаполнитьЗначения(Истина, "Активность");
           
           Рег.Загрузить(ТПР_Рег);
           Рег.ОбменДанными.Загрузка = Истина;
           Рег.Записать(Истина);
           
       КонецЕсли;
       
   КонецЕсли;




   //*******************************************************************
   // Регистр "ТекущиеКомиссии"
   Рег = РегистрыНакопления.ТекущиеКомиссии.СоздатьНаборЗаписей();
   Если Рег.Отбор.Регистратор.ТипЗначения.СодержитТип(ТипЗнч(мДок)) Тогда
       Рег.Отбор.Регистратор.Значение = мДок;
       ТПР_Рег = Рег.Выгрузить(Новый Массив());
           
       Для каждого Элемент из ТаблицаПроводок Цикл
           Если  (Элемент.ВидПроведения = "ПроведениеПоРегиструТекущиеКомиссии")
               И (Элемент.Сумма <> 0) Тогда
               
               НоваяСтрока                        = ТПР_Рег.Добавить();
               НоваяСтрока.ВидДвижения                = Элемент.ВидДвижения;
               НоваяСтрока.Период                  = Элемент.Период;
               НоваяСтрока.ДенежноеТребование        = Элемент.ДенежноеТребование;
               НоваяСтрока.ДоговорПоставки        = Элемент.ДоговорПоставки;
               НоваяСтрока.Комиссия                = Элемент.Комиссия;            
               НоваяСтрока.Сумма                    = Элемент.Сумма;
               
               Если Не ЗначениеЗаполнено(НоваяСтрока.Период) тогда
                   НоваяСтрока.Период  = мДок.Дата;
               КонецЕсли;
               
           КонецЕсли;
       КонецЦикла;

       Запрос2 = Новый Запрос;
       Запрос2.Текст =
           "ВЫБРАТЬ
           |    ТекущиеКомиссии.Период,
           |    ТекущиеКомиссии.Регистратор,
           |    ТекущиеКомиссии.НомерСтроки,
           |    ТекущиеКомиссии.Активность,
           |    ТекущиеКомиссии.ВидДвижения,
           |    ТекущиеКомиссии.ДоговорПоставки,
           |    ТекущиеКомиссии.ДенежноеТребование,
           |    ТекущиеКомиссии.Комиссия,
           |    ТекущиеКомиссии.Сумма
           |ИЗ
           |    РегистрНакопления.ТекущиеКомиссии КАК ТекущиеКомиссии
           |ГДЕ
           |    ТекущиеКомиссии.Регистратор = &Регистратор
           |    И (НЕ ТекущиеКомиссии.ДенежноеТребование В (&ДенежноеТребование))";

       Запрос2.УстановитьПараметр("ДенежноеТребование", МассивДТ);
       Запрос2.УстановитьПараметр("Регистратор", мДок);

       ТПР_Рег2 = Запрос2.Выполнить().Выгрузить();
       ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТПР_Рег2, ТПР_Рег);
       
       ТПР_Рег.ЗаполнитьЗначения(мДок, "Регистратор");
       ТПР_Рег.ЗаполнитьЗначения(Истина, "Активность");
       
       Рег.Загрузить(ТПР_Рег);
       Рег.ОбменДанными.Загрузка = Истина;
       Рег.Записать(Истина);
       
   КонецЕсли;

   //*******************************************************************
   // Регистр "КомиссииНачисленные"
   Рег = РегистрыНакопления.КомиссииНачисленные.СоздатьНаборЗаписей();
   Если Рег.Отбор.Регистратор.ТипЗначения.СодержитТип(ТипЗнч(мДок)) Тогда
       Рег.Отбор.Регистратор.Значение = мДок;
       ТПР_Рег = Рег.Выгрузить(Новый Массив());
       
       Для каждого Элемент из ТаблицаПроводок Цикл
           Если  (Элемент.ВидПроведения = "ПроведениеПоРегиструКомиссииНачисленные")
               И (Элемент.Сумма <> 0) Тогда
               
               НоваяСтрока                    = ТПР_Рег.Добавить();
               НоваяСтрока.Период             = Элемент.Период;
               НоваяСтрока.ДоговорПоставки    = Элемент.ДоговорПоставки;
               НоваяСтрока.ДенежноеТребование = Элемент.ДенежноеТребование;
               НоваяСтрока.Комиссия           = Элемент.Комиссия;            
               
               НоваяСтрока.Сумма              = Элемент.Сумма;
               НоваяСтрока.СуммаНДС           = Элемент.СуммаНДС;
               НоваяСтрока.СуммаБезНДС        = Элемент.СуммаБезНДС;
               
               Если Не ЗначениеЗаполнено(НоваяСтрока.Период) тогда
                   // для этого регистра возможно проведение отличное от даты документа
                   НоваяСтрока.Период  = мДок.Дата;
               КонецЕсли;
               
           КонецЕсли;
       КонецЦикла;
       
       Запрос2 = Новый Запрос;
       Запрос2.Текст =
           "ВЫБРАТЬ
           |    КомиссииНачисленные.Период,
           |    КомиссииНачисленные.Регистратор,
           |    КомиссииНачисленные.НомерСтроки,
           |    КомиссииНачисленные.Активность,
           |    КомиссииНачисленные.ДоговорПоставки,
           |    КомиссииНачисленные.ДенежноеТребование,
           |    КомиссииНачисленные.Комиссия,
           |    КомиссииНачисленные.Сумма,
           |    КомиссииНачисленные.СуммаНДС,
           |    КомиссииНачисленные.СуммаБезНДС
           |ИЗ
           |    РегистрНакопления.КомиссииНачисленные КАК КомиссииНачисленные
           |ГДЕ
           |    КомиссииНачисленные.Регистратор = &Регистратор
           |    И (НЕ КомиссииНачисленные.ДенежноеТребование В (&ДенежноеТребование))";

       Запрос2.УстановитьПараметр("ДенежноеТребование", МассивДТ);
       Запрос2.УстановитьПараметр("Регистратор", мДок);

       ТПР_Рег2 = Запрос2.Выполнить().Выгрузить();
       ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТПР_Рег2, ТПР_Рег);
       
       ТПР_Рег.ЗаполнитьЗначения(мДок, "Регистратор");
       ТПР_Рег.ЗаполнитьЗначения(Истина, "Активность");
       
       Рег.Загрузить(ТПР_Рег);
       Рег.ОбменДанными.Загрузка = Истина;
       Рег.Записать(Истина);
       
   КонецЕсли;

   //*******************************************************************
   // Регистр "КомиссииУдержанные"
   Рег = РегистрыНакопления.КомиссииУдержанные.СоздатьНаборЗаписей();
   Если Рег.Отбор.Регистратор.ТипЗначения.СодержитТип(ТипЗнч(мДок)) Тогда
       Рег.Отбор.Регистратор.Значение = мДок;
       ТПР_Рег = Рег.Выгрузить(Новый Массив());
           
       Для каждого Элемент из ТаблицаПроводок Цикл
           Если  (Элемент.ВидПроведения = "ПроведениеПоРегиструКомиссииУдержанные")
               И (Элемент.Сумма <> 0) Тогда
               
               НоваяСтрока                    = ТПР_Рег.Добавить();
               НоваяСтрока.Период             = Элемент.Период;
               НоваяСтрока.ДоговорПоставки    = Элемент.ДоговорПоставки;
               НоваяСтрока.ДенежноеТребование = Элемент.ДенежноеТребование;
               НоваяСтрока.Комиссия           = Элемент.Комиссия;            
               
               НоваяСтрока.Сумма              = Элемент.Сумма;
               НоваяСтрока.СуммаНДС           = Элемент.СуммаНДС;
               НоваяСтрока.СуммаБезНДС        = Элемент.СуммаБезНДС;
               
               Если Не ЗначениеЗаполнено(НоваяСтрока.Период) тогда
                   // для этого регистра возможно проведение отличное от даты документа
                   НоваяСтрока.Период  = мДок.Дата;
               КонецЕсли;
               
           КонецЕсли;
       КонецЦикла;
           
       Запрос2 = Новый Запрос;
       Запрос2.Текст =
           "ВЫБРАТЬ
           |    КомиссииУдержанные.Период,
           |    КомиссииУдержанные.Регистратор,
           |    КомиссииУдержанные.НомерСтроки,
           |    КомиссииУдержанные.Активность,
           |    КомиссииУдержанные.ДоговорПоставки,
           |    КомиссииУдержанные.ДенежноеТребование,
           |    КомиссииУдержанные.Комиссия,
           |    КомиссииУдержанные.Сумма,
           |    КомиссииУдержанные.СуммаНДС,
           |    КомиссииУдержанные.СуммаБезНДС
           |ИЗ
           |    РегистрНакопления.КомиссииУдержанные КАК КомиссииУдержанные
           |ГДЕ
           |    КомиссииУдержанные.Регистратор = &Регистратор
           |    И (НЕ КомиссииУдержанные.ДенежноеТребование В (&ДенежноеТребование))";

       Запрос2.УстановитьПараметр("ДенежноеТребование", МассивДТ);
       Запрос2.УстановитьПараметр("Регистратор", мДок);

       ТПР_Рег2 = Запрос2.Выполнить().Выгрузить();
       ОбщегоНазначения.ЗагрузитьВТаблицуЗначений(ТПР_Рег2, ТПР_Рег);
       
       ТПР_Рег.ЗаполнитьЗначения(мДок, "Регистратор");
       ТПР_Рег.ЗаполнитьЗначения(Истина, "Активность");
       
       Рег.Загрузить(ТПР_Рег);
       Рег.ОбменДанными.Загрузка = Истина;
       Рег.Записать(Истина);
   КонецЕсли;

   Если не Остановка Тогда
       ПолныеПрава.РегистрироватьГраницыПоследовательностиКомисий(мДок, МоментВостановления, Остановка, МассивДТ);
   КонецЕсли;
КонецПроцедуры    


Функция ВыполнитьОбработку () Экспорт
   Результат = Истина;
   Остановка = Ложь;
   ТекущийМомент = Неопределено;
   МассивДТ = Новый Массив;
   СтрокаСообщения = "";
   
   ТаблицаКонтроля = Новый ТаблицаЗначений;
   ТаблицаКонтроля.Колонки.Добавить("Документ");
   ТаблицаКонтроля.Колонки.Добавить("СтарыеЗначения");
   ТаблицаКонтроля.Колонки.Добавить("НовыеЗначения");
   
   ОбработаныеДокументы = Новый Массив;
   
   Пока Истина Цикл
       Попытка

           Запрос = Новый Запрос;
           Если ЗначениеЗаполнено(ДенежноеТребование) Тогда
                   
               //Запрос.Текст =
               //    "ВЫБРАТЬ РАЗЛИЧНЫЕ
               //    |    ВложенныйЗапрос.Регистратор КАК Документ,
               //    |    ВложенныйЗапрос.ДенежноеТребование,
               //    |    ВложенныйЗапрос.МоментВремени КАК МоментВремени
               //    |ИЗ
               //    |    (ВЫБРАТЬ
               //    |        ВложенныйЗапрос.Регистратор КАК Регистратор,
               //    |        КомиссииГраницы.ДенежноеТребование КАК ДенежноеТребование,
               //    |        КомиссииГраницы.МоментВремени КАК МоментВремени
               //    |    ИЗ
               //    |        (ВЫБРАТЬ ПЕРВЫЕ 1
               //    |            Комиссии.Регистратор КАК Регистратор,
               //    |            Комиссии.МоментВремени КАК МоментВремени
               
13 vde69
 
15.09.11
08:20
Запрос.Текст =
                   "ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |    ВложенныйЗапрос.Регистратор КАК Документ,
                   |    Комиссии.ДенежноеТребование,
                   |    Комиссии.МоментВремени КАК МоментВремени
                   |ИЗ
                   |    (ВЫБРАТЬ ПЕРВЫЕ 1
                   |        Комиссии.МоментВремени КАК МоментВремени,
                   |        Комиссии.Регистратор КАК Регистратор
                   |    ИЗ
                   |        Последовательность.Комиссии.Границы КАК КомиссииГраницы
                   |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Последовательность.Комиссии КАК Комиссии
                   |            ПО КомиссииГраницы.ДенежноеТребование = Комиссии.ДенежноеТребование
                   |                И (ЕСТЬNULL(КомиссииГраницы.ДенежноеТребование, ЗНАЧЕНИЕ(Справочник.ДенежноеТребование.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ДенежноеТребование.ПустаяСсылка))
                   |                И (Комиссии.МоментВремени > КомиссииГраницы.МоментВремени)
                   |    
                   |    УПОРЯДОЧИТЬ ПО
                   |        МоментВремени) КАК ВложенныйЗапрос
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Последовательность.Комиссии КАК Комиссии
                   |        ПО ВложенныйЗапрос.Регистратор = Комиссии.Регистратор
                   |ГДЕ
                   |    Комиссии.ДенежноеТребование В
                   |            (ВЫБРАТЬ
                   |                КомиссииГраницы.ДенежноеТребование
                   |            ИЗ
                   |                Последовательность.Комиссии.Границы КАК КомиссииГраницы
                   |            ГДЕ
                   |                Комиссии.МоментВремени > КомиссииГраницы.МоментВремени)
                   |ИТОГИ ПО
                   |    Документ";
                   
                   
           КонецЕсли;
               

           РезультатЗапроса = Запрос.Выполнить();
           
           Если РезультатЗапроса.Пустой() Тогда
               // это нормальное завершение востановления
               ОтменитьТранзакцию();
               Прервать;
           КонецЕсли;

           ВыборкаДокумент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
           
           Пока ВыборкаДокумент.Следующий() Цикл
               // Вставить обработку выборки ВыборкаДокумент
               
               мДок = ВыборкаДокумент.Документ;        //  ВыборкаДокумент.Группировка()
               МассивДТ.Очистить();
               ОбработаныеДокументы.Очистить();
               
               ВыборкаДетальныеЗаписи = ВыборкаДокумент.Выбрать();
               Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                   ДТ = ВыборкаДетальныеЗаписи.ДенежноеТребование;
                   МассивДТ.Добавить(ДТ);                    
               КонецЦикла;                                                    //(ТаблицаПроводок.Количество() > 0)или(ДокументОбъект.Движения.ТекущиеКомиссии.Количество()>0)
               
               #Если Клиент Тогда
                   Если ПоказыватьИзменения Тогда
                       ОбработаныеДокументы.Добавить(мДок);
                       
                       _СтарыеЗначения = ПолучитьЗначениеКонтроля (мДок);
                       Если _СтарыеЗначения.Количество() > 0 тогда
                           НоваяСтрокаКонтроля = ТаблицаКонтроля.Добавить();
                           НоваяСтрокаКонтроля.Документ = мДок;
                           НоваяСтрокаКонтроля.СтарыеЗначения = _СтарыеЗначения;
                       КонецЕсли;
                   КонецЕсли;
                   Состояние(мДок);
                   ОбработкаПрерыванияПользователя();
               #КонецЕсли
               
               НачатьТранзакцию();
               
               ОбработатьДокумент (мДок, МассивДТ, Остановка, ТекущийМомент);
               
               Если не Остановка Тогда
                   ЗафиксироватьТранзакцию();
                   
                   #Если Клиент Тогда
                       Если ПоказыватьИзменения Тогда
                           //ВыводитьОтчет = Ложь;
                           
                           Для Каждого мДок из ОбработаныеДокументы Цикл
                               _НовыеЗначения = ПолучитьЗначениеКонтроля (мДок);
                               
                               НайденнаяСтрока = ТаблицаКонтроля.Найти(мДок, "Документ");
                               Если НайденнаяСтрока = Неопределено Тогда
                                   _СтарыеЗначения = _НовыеЗначения.СкопироватьКолонки();
                               Иначе
                                   _СтарыеЗначения = НайденнаяСтрока.СтарыеЗначения;
                               КонецЕсли;
                               
                               Стр1 = СравнитьПараметр(мДок, "Начисленые комиссии", _НовыеЗначения, _СтарыеЗначения);
                               Стр2 = СравнитьПараметр(мДок, "Удержаные комиссии", _НовыеЗначения, _СтарыеЗначения);
                               Стр3 = СравнитьПараметр(мДок, "Финансирование", _НовыеЗначения, _СтарыеЗначения);
                               Стр4 = СравнитьПараметр(мДок, "Взаиморасчеты", _НовыеЗначения, _СтарыеЗначения);
                               
                               Если СокрЛП(Стр1+Стр2+Стр3+Стр4) <> "" Тогда
                                   // нужно печатать
                                   Сообщить("<<<<----- " + мДок + " ------>>>" , СтатусСообщения.Важное);
                                   
                                   Если сокрЛП(Стр1) <> "" Тогда
                                       Сообщить(Стр1 , СтатусСообщения.Важное);
                                   КонецЕсли;
                                   
                                   Если сокрЛП(Стр2) <> "" Тогда
                                       Сообщить(Стр2 , СтатусСообщения.Важное);
                                   КонецЕсли;
                                   
                                   Если сокрЛП(Стр3) <> "" Тогда
                                       Сообщить(Стр3 , СтатусСообщения.Важное);
                                   КонецЕсли;
                                   
                                   Если сокрЛП(Стр4) <> "" Тогда
                                       Сообщить(Стр4 , СтатусСообщения.Важное);
                                   КонецЕсли;
                               КонецЕсли;
                                                       
                           КонецЦикла;
                           
                       КонецЕсли;
                   #КонецЕсли
               Иначе
                   ОтменитьТранзакцию();
               КонецЕсли;
           КонецЦикла;

       Исключение
           Если ТранзакцияАктивна() Тогда
               ОтменитьТранзакцию();
           КонецЕсли;
           Остановка = Истина;
       КонецПопытки;
       
       Если Остановка Тогда
           Прервать;
       КонецЕсли;
   КонецЦикла;
       
   Возврат Результат;
КонецФункции
14 Evil-Wisp
 
15.09.11
08:32
(12) УПП, партионка. 40 пользователей. Тут либо работают пользователи или восстанавливается последовательность.
15 vde69
 
15.09.11
08:35
(14) ты-бы хоть глянул код :)

у меня пользователей не меньше и востановление идет и пользователи работают.

зы
угадай по чему штатное востановление требует монопольности?
16 ДемонМаксвелла
 
15.09.11
08:37
17 Evil-Wisp
 
15.09.11
08:52
(15) Как я понял, ты не проводишь документы, а корректируешь их движения? Или поясни в двух словах.
Мне нужно чтобы проводились документы, чтобы снимать ошибки с партионки.

(16) Познавательно.Как нибудь обязательно воспользуюсь. Но в этом случае не подходит. Хотя бы потому, что при блокировке базы не запускаются фоновые задания.
18 vde69
 
15.09.11
12:53
(17) да я корректирую движения, при этом

1. обработка идет по 1 моменту времение, если кто-то в момент выполнения обработки проведет документ за границей - обработка останавливается, или откатывается назад (по этому не требуется монопольный режим)

2. корректировка движений идет только по объектам (регистрам) влияющим на последовательность (а не полное перепроведение) что значительно быстрее и менее блочное
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший