|
Как предотвратить "зависание" 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. корректировка движений идет только по объектам (регистрам) влияющим на последовательность (а не полное перепроведение) что значительно быстрее и менее блочное |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |