![]() |
|
Волновое перепроведение партий - реализовано. | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
17.02.15
✎
21:01
|
Это конечно не партионный учет без перепроведения, но все же нечто.
Рекомендую, ибо у себя уже сделал. Суть - на начало месяца получаем остатки по всем товарам, далее в запросе получаем все движения по регистру остатков, сортируем их по времени и начинаем списание партий. Преимущество - не нужно вычислять остатки на каждый документ, как только обработали документ, переходим к следующему, а все остатки по с/сти висят в памяти. Работает раз в 5 быстрее обычного перепроведения по партиям. Вы такое у себя делали? |
|||
86
Vovan1975
18.02.15
✎
15:19
|
ждем квантовое перепроведение и все будет пучком.
|
|||
87
Feanor
18.02.15
✎
15:22
|
ждем осознания двойственной природы проведения по партиям :)
|
|||
88
Fish
гуру
18.02.15
✎
15:29
|
(71) Запросы в цикле? А говорили, что ты профи.
|
|||
89
vde69
18.02.15
✎
15:34
|
(71) не увидел слов "Попытка", "Транзакция"
|
|||
90
vde69
18.02.15
✎
15:36
|
даю свой вариант :) работает в фоне, не мешает проведению, не блокируется.... автоматически определяет если кто влез в процесс...
----------------------------------------------------- Функция ВостановитьПоследовательность () Экспорт // если "ФильтрСделка" заполнено, то только расчитываем блоки и формируем уведомления Перем ТекущийМомент, НовыйМомент, КоличествоПопыток; УдалитьОшибкиРегистрации(); Сделки = Новый Массив; Результат = Истина; КоличествоПопыток = 10; НомерПопытки = 0; ВремяПаузы = 0; // в секундах, можно использовать дробные ЗарегистрироватьКритическуюОшибку = Ложь; ЭтоПервыйЦикл = Истина; ТекущийМомент = Новый МоментВремени(Дата(1,1,1)); НовыйМомент = Новый МоментВремени(Дата(1,1,1)); // сначало востановление последовательности ЗапросПоследовательности = Новый Запрос( "ВЫБРАТЬ | ПоследовательностьСделок.Сделка, | ПоследовательностьСделок.Регистратор, | ПоследовательностьСделок.МоментВремени |ПОМЕСТИТЬ НеВостановленые |ИЗ | Последовательность.ПоследовательностьСделок КАК ПоследовательностьСделок | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Последовательность.ПоследовательностьСделок.Границы КАК ПоследовательностьСделокГраницы | ПО ПоследовательностьСделок.Сделка = ПоследовательностьСделокГраницы.Сделка | И ПоследовательностьСделок.МоментВремени > ПоследовательностьСделокГраницы.МоментВремени | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПараметрыСделок КАК ПараметрыСделок | ПО (ПараметрыСделок.Сделка = ПоследовательностьСделок.Сделка) | И (ПараметрыСделок.Параметр = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыПараметровСделок.КритическаяОшибка)) | И (ПараметрыСделок.Значение = ИСТИНА) |ГДЕ | НЕ ПоследовательностьСделок.Сделка.Ссылка ЕСТЬ NULL | И ПараметрыСделок.Параметр ЕСТЬ NULL | |СГРУППИРОВАТЬ ПО | ПоследовательностьСделок.Сделка, | ПоследовательностьСделок.Регистратор, | ПоследовательностьСделок.МоментВремени |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.Сделка, | ВложенныйЗапрос.Регистратор, | ВложенныйЗапрос.МоментВремени |ПОМЕСТИТЬ ПервыеНеВостановленые |ИЗ | (ВЫБРАТЬ | НеВостановленые.Сделка КАК Сделка, | НеВостановленые.Регистратор КАК Регистратор, | НеВостановленые.МоментВремени КАК МоментВремени, | МАКСИМУМ(ВЫБОР | КОГДА НеВостановленые.МоментВремени > НеВостановленые1.МоментВремени | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ) КАК ЕстьПредыдущие | ИЗ | НеВостановленые КАК НеВостановленые | ЛЕВОЕ СОЕДИНЕНИЕ НеВостановленые КАК НеВостановленые1 | ПО НеВостановленые.Сделка = НеВостановленые1.Сделка | И НеВостановленые.МоментВремени <> НеВостановленые1.МоментВремени | | СГРУППИРОВАТЬ ПО | НеВостановленые.Сделка, | НеВостановленые.Регистратор, | НеВостановленые.МоментВремени) КАК ВложенныйЗапрос |ГДЕ | ВложенныйЗапрос.ЕстьПредыдущие = ЛОЖЬ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1 | ПервыеНеВостановленые.Регистратор |ПОМЕСТИТЬ табРегистратор |ИЗ | ПервыеНеВостановленые КАК ПервыеНеВостановленые | |УПОРЯДОЧИТЬ ПО | ПервыеНеВостановленые.МоментВремени |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПервыеНеВостановленые.Сделка, | ПервыеНеВостановленые.Регистратор, | ПервыеНеВостановленые.МоментВремени |ИЗ | ПервыеНеВостановленые КАК ПервыеНеВостановленые | ВНУТРЕННЕЕ СОЕДИНЕНИЕ табРегистратор КАК табРегистратор | ПО ПервыеНеВостановленые.Регистратор = табРегистратор.Регистратор"); РезультатЗапроса = ЗапросПоследовательности.Выполнить(); Пока не РезультатЗапроса.Пустой() Цикл ЗарегистрироватьКритическуюОшибку = Ложь; Сделки.Очистить(); #Если Клиент Тогда ОбработкаПрерыванияПользователя(); #КонецЕсли //////////---------------------------------------------------------------- ////////// пауза 1сек НЕ РАБОТАЕТ !!!!!!!!!!!!!! ////////Пауза=Секунда(ТекущаяДата()+1); ////////Локатор=Новый COMОбъект("wbemscripting.swbemlocator"); ////////Сервис=Локатор.ConnectServer(".","root\cimv2","","","","",128); ////////Время = Сервис.ExecNotificationQuery("Select * from __instancemodificationevent WITHIN 1 where TargetInstance isa 'Win32_LocalTime' and TargetInstance.Second="+Пауза); ////////СледующееСобытие = Время.NextEvent(); //////////---------------------------------------------------------------- СравнениеМоментов = ТекущийМомент.Сравнить(НовыйМомент); Если ЭтоПервыйЦикл Тогда // первый цикл - пропускаем проверки ИначеЕсли СравнениеМоментов = -1 Тогда // ТекущийМомент меньше чем НовыйМомент // ситуация нормальная, идем дальше ТекущийМомент = Новый МоментВремени(НовыйМомент.Дата, НовыйМомент.Ссылка); НомерПопытки = 0; Иначе // ТекущийМомент больше или равен чем НовыйМомент // пока мы ковырялись, кто-то откатил последовательность назад НомерПопытки = НомерПопытки + 1; ТекущийМомент = Новый МоментВремени(НовыйМомент.Дата, НовыйМомент.Ссылка); #Если Клиент Тогда Сообщить("< попытка №" + НомерПопытки + " >"); #КонецЕсли КонецЕсли; ЭтоПервыйЦикл = Ложь; Если НомерПопытки >= КоличествоПопыток Тогда // видимо не судьба!!! кому-то мешаем! Результат = Ложь; #Если Клиент Тогда Сообщить("< превышено количество попыток >"); #КонецЕсли Прервать; КонецЕсли; Попытка НовыйМомент = ТекущийМомент; НачатьТранзакцию(); мТаб = РезультатЗапроса.Выгрузить(); Если мТаб.Количество() > 0 Тогда мРегистратор = мТаб[0].Регистратор; НовыйМомент = мТаб[0].МоментВремени; Отказ = Ложь; Заголовок = "Движение документа """ + СокрЛП(мРегистратор) + """: "; #Если Клиент Тогда Сообщить("Востановление движений: "+СокрЛП(мРегистратор)); #КонецЕсли Сделки = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Сделка"); Для Каждого Сделка из Сделки Цикл УстановитьБлокировкуПоСделке(Сделка); #Если Клиент Тогда Сообщить("----------- " + Сделка + " -------------"); #КонецЕсли КонецЦикла; Мета = мРегистратор.Метаданные(); МенеджерДокумента = Документы[Мета.Имя]; оДокумент = мРегистратор.ПолучитьОбъект(); ТаблицаПроведения = ПроведениеДокументов.СоздатьТаблицуПроведения(); МенеджерДокумента.ЗаполнитьТаблицуПроведения(ТаблицаПроведения, оДокумент.ПометкаУдаления, оДокумент.Проведен, Отказ); Для Каждого эл из ТаблицаПроведения Цикл Если не эл.Использовать Тогда Продолжить; КонецЕсли; // там нужны только регистры по сделке Если не эл.ПроведениеПоСделке = Истина Тогда эл.Использовать = Ложь; КонецЕсли; КонецЦикла; // подготовим пакет запроса в соответствие с тем какие регистры мы определили, мЗапрос = ПроведениеДокументов.ПодготовитьЗапросДляПроведения(оДокумент, ТаблицаПроведения, Заголовок, Отказ); // выполнение пакета и заполнения таблиц проведения // после можно что-то подкоректировать руками Параметры = Новый Структура("СохранитьСтарыеДвижения,ОчищатьДвижения"); ПроведениеДокументов.ПодготовитьТаблицуПроведения (оДокумент, мЗапрос, ТаблицаПроведения, Параметры, Заголовок, Отказ); мСтарыеДвижения = Параметры.СтарыеДвижения; // нужно получить текущие движения по документу и удалить из них все что касается текущей сделки Для Каждого эл из ТаблицаПроведения Цикл Если не эл.Использовать Тогда Продолжить; КонецЕсли; эл.ДополнительныеДанные.Вставить("РегистрироватьТолькоСделку", Сделки); // скопируем новые движения, потом из них будем тащить движения по сделки мТаблицаДвижений = эл.ТаблицаДвижений.Скопировать(); //прочитаем текущие движения эл.ТаблицаДвижений = мСтарыеДвижения[эл.ИмяРегистра].Скопировать(); // удалим из текущих движений все по нашей сделки Если эл.ИмяРегистра = "КассовыйКалендарь" Тогда ИмяКолонки = "Аналитика"; Иначе ИмяКолонки = "Сделка"; КонецЕсли; Для Каждого Сделка из Сделки Цикл Отбор = Новый Структура(); Отбор.Вставить(ИмяКолонки, Сделка); Строки = эл.ТаблицаДвижений.НайтиСтроки(Отбор); Для Каждого мСтр из Строки Цикл эл.ТаблицаДвижений.Удалить(мСтр); КонецЦикла; КонецЦикла; // в мТаблицаДвижений новые движения // в эл.ТаблицаДвижений старые движения без текущих сделок // надо новые движения по текущем сделкам добавить в страрые Для Каждого мСтр из мТаблицаДвижений Цикл Если Сделки.Найти(мСтр[ИмяКолонки]) <> Неопределено Тогда НоваяСтрока = эл.ТаблицаДвижений.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, мСтр); КонецЕсли; КонецЦикла; КонецЦикла; // выполняем движения по регистрам ПроведениеДокументов.ПроведениеПоРегистрам(мРегистратор, ТаблицаПроведения, Заголовок, Отказ, Истина); Если Отказ Тогда ЗарегистрироватьКритическуюОшибку = Истина; ВызватьИсключение "Ошибка формирования движений - " + ОписаниеОшибки(); КонецЕсли; //------------------------------------------------------------------------------------------ // движения по сделки переделали, теперь обработаем регистр "ПараметрыСделок" // запишим состояние сделки в регистр как "Востановлено" // по сколько у нас выборка по сделке в целом заблокирована, // а все регистры подвязаны движениями к последовательности, ситуация когда // кто-то изменит задним числом что-то по этой сделке невозможна // по этому пишем ... Для Каждого Сделка из Сделки Цикл ОбработатьУведомления = Ложь; РегПар = РегистрыСведений.ПараметрыСделок.СоздатьНаборЗаписей(); РегПар.Отбор.Сделка.Установить(Сделка, Истина); РегПар.Прочитать(); ТЗ_ТекущиеДанные_Пар = РегПар.Выгрузить(); //** последовательнось уже обработали СтрПараметра = ТЗ_ТекущиеДанные_Пар.Найти(ПланыВидовХарактеристик.ВидыПараметровСделок.ПоследовательностьВерна, "Параметр"); Если СтрПараметра = Неопределено Тогда СтрПараметра = ТЗ_ТекущиеДанные_Пар.Добавить(); СтрПараметра.Сделка = Сделка; СтрПараметра.Параметр = ПланыВидовХарактеристик.ВидыПараметровСделок.ПоследовательностьВерна; НужноЗаписыватьПараметры = Истина; КонецЕсли; СтрПараметра.Значение = Истина; //** попутно пишем регистр "СостояниеБлоковУчета" РегН = РегистрыСведений.СостояниеБлоковУчета.СоздатьНаборЗаписей(); РегН.Отбор.Сделка.Установить(Сделка, Истина); РегН.Прочитать(); ТЗ_ТекущиеДанные = РегН.Выгрузить(); ДанныеСделки = Документы.Сделка.РасчитатьСоостоянияБлоков (Сделка); // сама запись регистра Если ЕстьРазличияВТаблицах (ТЗ_ТекущиеДанные, ДанныеСделки.СостояниеБлоковУчета, "Сделка,Состояние,Описание,БлокУчета,ID_События") Тогда РегН.Загрузить(ДанныеСделки.СостояниеБлоковУчета); РегН.Записать(Истина); ОбработатьУведомления = Истина; КонецЕсли; // здесь расчитаем статус самой сделки ОбновитьСтатусСделки(Сделка); //** СтрПараметра = ТЗ_ТекущиеДанные_Пар.Найти(ПланыВидовХарактеристик.ВидыПараметровСделок.БлокиРасчитаны, "Параметр"); Если СтрПараметра = Неопределено Тогда СтрПараметра = ТЗ_ТекущиеДанные_Пар.Добавить(); СтрПараметра.Сделка = Сделка; СтрПараметра.Параметр = ПланыВидовХарактеристик.ВидыПараметровСделок.БлокиРасчитаны; НужноЗаписыватьПараметры = Истина; КонецЕсли; СтрПараметра.Значение = Истина; //** СтрПараметра = ТЗ_ТекущиеДанные_Пар.Найти(ПланыВидовХарактеристик.ВидыПараметровСделок.УведомленияАктуальны, "Параметр"); Если СтрПараметра = Неопределено Тогда СтрПараметра = ТЗ_ТекущиеДанные_Пар.Добавить(); СтрПараметра.Сделка = Сделка; СтрПараметра.Параметр = ПланыВидовХарактеристик.ВидыПараметровСделок.УведомленияАктуальны; ОбработатьУведомления = Истина; Иначе ОбработатьУведомления = СтрПараметра.Значение; КонецЕсли; //** Если ОбработатьУведомления Тогда ОбработатьУведомленияПоСделки(Сделка); КонецЕсли; //** РегПар.Загрузить(ТЗ_ТекущиеДанные_Пар); РегПар.Записать(Истина); //------------------------------------------------------------------------------------------ // вроде сделка полностью востановлена Отбор = Новый Структура ("Сделка"); Отбор.Вставить("Сделка", Сделка); Последовательности.ПоследовательностьСделок.УстановитьГраницу(НовыйМомент, Отбор); КонецЦикла; КонецЕсли; Блокировка = Неопределено; ЗафиксироватьТранзакцию(); Исключение #Если Клиент Тогда Сообщить("!!! " +ОписаниеОшибки()); #КонецЕсли Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; КонецПопытки; // получим новый момент, он может быть откатаным назад РезультатЗапроса = ЗапросПоследовательности.Выполнить(); мТаб = РезультатЗапроса.Выгрузить(); Если мТаб.Количество() > 0 Тогда НовыйМомент = мТаб[0].МоментВремени; КонецЕсли; // обработка ошибок Если ЗарегистрироватьКритическуюОшибку Тогда Попытка НачатьТранзакцию(); Для Каждого Сделка из Сделки Цикл УстановитьБлокировкуПоСделке(Сделка); // запишем признак ошибки в регистр РегПар = РегистрыСведений.ПараметрыСделок.СоздатьМенеджерЗаписи(); РегПар.Сделка = Сделка; РегПар.Параметр = ПланыВидовХарактеристик.ВидыПараметровСделок.КритическаяОшибка; РегПар.Значение = Истина; РегПар.Записать(Истина); // создадим оповещение для группы Справочники.ГруппыПользователей.АдминистрированиеТорговли // ** // ** // ** // ** // ** КонецЦикла; ЗафиксироватьТранзакцию(); Исключение // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // нужно остановить регламент !!!! иначе будет крутить по кругу не видя ошибки ОстановитьРегламент(); #Если Клиент Тогда Сообщить("!!! " +ОписаниеОшибки()); #КонецЕсли Если ТранзакцияАктивна() Тогда ОтменитьТранзакцию(); КонецЕсли; КонецПопытки; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции |
|||
91
DCKiller
18.02.15
✎
16:50
|
(71) М-да... У меня одного при виде этого зачесались руки оторвать автору сего высера... его "гениальный" ник и вместо него прикрутить что-то очень похабное?
|
|||
92
GROOVY
18.02.15
✎
16:54
|
(91) Ae,kz, зачем я это увидел. это gbpltw полный.
|
|||
93
Новиков
18.02.15
✎
17:15
|
(73) >>я не пошел работать в 1С (брали в отдел УТ) именно из-за того, что запрещено было обсуждать 1С на форумах.
"все дятлоЭсники - это агрессивные пожиратели желто-красного гав... корма от 1С, для которых хлорка - это творог. Ничего вкуснее они никогда не видели. Тупость клюва компенсируется агрессивностью и частотой долбления корма и умных особей - ибо понимают, что этого уровня им не достичь..." (c) Петр, "у лю 427" |
|||
94
Ник080808
18.02.15
✎
17:46
|
(88) нууууу, в типовой КА запросов куча, хотя это и противоречит стандартам
|
|||
95
Ник080808
18.02.15
✎
17:46
|
(94) запросов в цикле*
|
|||
96
Гений 1С
гуру
18.02.15
✎
18:43
|
(95) запрет на запросы в цикле - это религия а не практика. ;-)
(90) посмотрел, но это не волновое перепроведение. ;-) |
|||
97
Classic
18.02.15
✎
18:59
|
Я такое всегда групповым называл.
И удивлялся, почему в типовом восстановлении последовательности такое не сделано. |
|||
98
Господин ПЖ
18.02.15
✎
19:12
|
>волновое перепроведение
волновой хавнокод... |
|||
99
WebberNSK
18.02.15
✎
19:24
|
(91), (92), (98) высказались бы, почему...
мне например многие вещи в этом коде тоже не нравятся, но как то не обосновывая писать не по пацански |
|||
100
vis_tmp
18.02.15
✎
20:30
|
100
|
|||
101
Злопчинский
18.02.15
✎
20:34
|
(48) вопрос как именно "так" сделано
Ктото начинает тупо считать все выявляя глобальные минуса У меня это "так" реализовано без необходимости всяких просчетов |
|||
102
Зеленый пень
18.02.15
✎
20:53
|
(45) "определяется практически мгновенно" - вот тут я поспорю.
Определить "промежуточный" минус быстро не получится. Например: Приход1 - 10шт Расход1 - 7шт Расход2 - 3шт Приход2 - 5шт Если в Расход1 задним числом ввести 8шт, то для определения возникшего минуса (который возникает после "Расход2") надо проверять остатки после каждого следующего документа (у нас так сделано, даже похоже на алгоритм "гения"). |
|||
103
Злопчинский
18.02.15
✎
20:57
|
(102) ответ - нет
Не надо проверять остатки после каждого документа Время затрачиваемое на ответ соизмеримо со временем получения итогов на сейчас то есть практически мгновенно Ясен пень такая шняга возможна только в гетиповой конфиге |
|||
104
mikecool
18.02.15
✎
21:05
|
Геню разбанили )))
как представил волновое перепроведение как физическое явление - так и обомлел ))) |
|||
105
DCKiller
19.02.15
✎
06:19
|
(99) Ну хотя потому, что запросы в цикле... за одно это надо уже по рукам бить. Если кто-то не понимает почему - советую перечитать ЖКК, а еще лучше букварь.
|
|||
106
rphosts
19.02.15
✎
06:29
|
До пятницы не закрывайте, завтра будет над чем поржать
|
|||
107
yavasya
19.02.15
✎
06:44
|
и к нику добавить "Величайший"
|
|||
108
VladZ
19.02.15
✎
07:14
|
(71) Нда... Если бы мне пришлось дорабатывать такой код - материл бы автора всяческими нехорошими словами...
|
|||
109
WebberNSK
19.02.15
✎
08:09
|
(105) многие не понимают к чему приводит сортировка таблицы значений по ссылке методом Сортировать, без указания второго параметра. И что?
По рукам надо бить если ты что то пишешь и не понимаешь к чему оно приводит. Решение обычно строится основываясь на теорию ограничений - Гений написал алгоритм и хвастается им а не кодом, ясень пень код можно написать более оптимально и красиво. Но на это нужно время (деньги) и т.д. p.s. В последних версиях ЕРП и УТ, многие сложные запросы - размазывались на более мелкие, что приводило и к запросам в цикле в том числе... например, в обработке подбора номенклатуры - это было связано с проблемами в RLS. |
|||
110
vde69
19.02.15
✎
08:48
|
кстати по сабжу
чка поступит алгоритм если у документа будут движения периода отличного от момента документа? пример 01.01.2015 поступление +10 02.01.2015 поступление +10 03.01.2015 реализация -7 04.01.2015 сторно поступления +10 но движения 02.01.2015 а я скажу, что будет, алгоритм зациклится.... жду теоретического ответа :) |
|||
111
Ranger_83
19.02.15
✎
08:49
|
(0) Почему волновое?
|
|||
112
Зеленый пень
19.02.15
✎
10:51
|
(103) Тогда делись секретом.
|
|||
113
Гений 1С
гуру
19.02.15
✎
11:02
|
(110) с какого бы ему зациклиться? ну у меня таких документов нет. ;-)
|
|||
114
Гений 1С
гуру
19.02.15
✎
11:03
|
(103) надо именно после каждого документа, чтобы запретить минус.
Иначе: было +10, -5, +3, +8: 16 убрали +10, стало -5, +3, +8: 6 Все зашибись, да? гыгыгы.. |
|||
115
yavasya
19.02.15
✎
11:05
|
(114) т.е. ты нарушаешь оперативный учет
|
|||
116
vde69
19.02.15
✎
11:06
|
(113) хорошо, что будет если в момент твоей "волны" я влезу и изменю самый первый документ волны?
а будет следующее, твоя "волна" будет фигачить основываясь на старых (уже не актуальных) остатках... а что будет если запустить паралельно две волны по одной номенклатуре? |
|||
117
Гений 1С
гуру
19.02.15
✎
11:14
|
(116) а что, если тебе по голове ударит метеорит. Обычное восстановление партий работает по ночам с даты А по дату Б, когда все спят. Мое проходит больше в 5 раз дней за тот же период и ладно.
|
|||
118
Гений 1С
гуру
19.02.15
✎
11:14
|
(115) я про контроль минусовых остатков как бы, это немного не в тему волнового проведения. я сделал у себя запрет глобальных минусов, да.
|
|||
119
Гений 1С
гуру
19.02.15
✎
11:15
|
(108) а свой код, о Гуру, покажешь?
|
|||
120
Гений 1С
гуру
19.02.15
✎
11:15
|
(105) у вас какая то мания насчет запросов в цикле, чесслово
|
|||
121
vde69
19.02.15
✎
11:19
|
(117) а мой алгоритм работает в режиме он-лайн, то есть в рельной базе при изменении документа задним числом (пол года назад) через 40 минут в базе все приведено в порядок, или есть уведомление администратору учета, что гад юзер сделал бяку в базе.
Чуствуешь разницу сутки и 40 мин? это ОЧЕНЬ критично, так можно отозвать документы и т.д. |
|||
122
2mugik
19.02.15
✎
11:20
|
(0)Если правильно понял - то делал давно в Бух 77 что-то подобное - "приход на минус" - брал остатки на начало шел по движениям доков и "копил" минусы. Делал через ТЗ. Потом первым днем месяца поступление.
|
|||
123
Ёпрст
гуру
19.02.15
✎
11:21
|
(0) вот это тоже почитай, всяко быстрее, чем у тебя
v8: Проведение расходного документа по партиям за 0.045 секунд? |
|||
124
Гёдза
19.02.15
✎
11:38
|
(121) За 40 мин - 100тысяч документов успевает провести?
|
|||
125
vde69
19.02.15
✎
11:50
|
(124) ну не 100, но 50 успевает....
|
|||
126
iamnub
19.02.15
✎
11:51
|
Мда.
1С-ники в своем репертуаре. Решил задачу уровня <junior и устало взял под козырек - Волновое перепроведение - реализовано! В пять раз быстрее, чем обычное? На пересдачу - должно быть в 50 раз быстрее! |
|||
127
Гений 1С
гуру
19.02.15
✎
12:20
|
(121) Когда начнешь работать в РИБ на 100 узлов, а не в одной базе, тогда приходи меня поучать.
|
|||
128
Гений 1С
гуру
19.02.15
✎
12:21
|
(126) я делюсь методиками, ваше дело - употреблять бисер моего ума или нет.
|
|||
129
Господин ПЖ
19.02.15
✎
12:23
|
50 оттенков бисера...
|
|||
132
IШаман
19.02.15
✎
12:33
|
Вде меряется с гением 1с. Эпично.
|
|||
133
Гений 1С
гуру
19.02.15
✎
12:35
|
(130) у меня РИБ в 5 раз больше. ;-)
|
|||
134
IШаман
19.02.15
✎
12:35
|
Вообще по сабжу оно будет конечно работать, но чего это вдруг вопрос быстродействия встал так остро если у нам есть возможность запускать коней в вакуме (то есть обработки в монопольном режиме на длительное время)?
|
|||
135
IШаман
19.02.15
✎
12:37
|
(126) Это же гений, а все гениальное просто. Кстати эта его идея в отличии от других реально хоть что то из себя представляет.
|
|||
136
Гений 1С
гуру
19.02.15
✎
12:38
|
(134) потому что хочется перепроводить период побольше, а не месяц, например
|
|||
137
IШаман
19.02.15
✎
12:40
|
(136) Лучше почаще да понадежней. Опять же проблемы с партионным учетом это в основной своей массе проблемы с организацией а не с работой самих механизмов списания, так что пока все нормально не зарегламентируешь хоть заперепроводись но бардак как был так и останется.
|
|||
138
IШаман
19.02.15
✎
12:41
|
Вы мне лучше расскажите что стало с пожизненным баном гения?
|
|||
139
Vovan1975
19.02.15
✎
12:43
|
(138) ты все пропустил - тут амнистия была
|
|||
140
IШаман
19.02.15
✎
13:06
|
(139) С какой это радости?
|
|||
141
iamnub
19.02.15
✎
13:08
|
(128)
В (123) сказано всё. |
|||
142
y22-k
19.02.15
✎
13:19
|
(105) а вот и не всегда запросы в цикле зло иногда такой объем данных что тупо по другому никак нельзя
|
|||
143
IШаман
19.02.15
✎
13:20
|
(142) А вы не задумывались почему это собственно зло? Или как ТС считаете что это всего лишь религия?
|
|||
144
y22-k
19.02.15
✎
13:21
|
(143) поясите?
|
|||
145
IШаман
19.02.15
✎
13:24
|
(144) А подумать маленько? Опять есть одно правило которое гласит о том что если есть какое то правило суть которого в ыне понимаете то лучше следовать ему.
|
|||
146
y22-k
19.02.15
✎
13:38
|
(145) ничего не понял, резюмирую еще раз иногда задачу можно решить только запросом в цикле, но это не значит что это хорошо и так надо делать всегда
|
|||
147
andreymongol82
19.02.15
✎
13:59
|
(146) У меня какая-то бедная фантазия. За целых 2 минуты так и не смог придумать задачу, которую можно решить только запросом в цикле
|
|||
148
IШаман
19.02.15
✎
14:01
|
(146) "иногда задачу можно решить только запросом в цикле" - не верное утверждение.
|
|||
149
Гёдза
19.02.15
✎
14:02
|
Иногда читабельнее в цикле чем запрос на 100000 строк
|
|||
150
Гёдза
19.02.15
✎
14:03
|
Иногда только в цикле ибо 256 таблиц
|
|||
151
IШаман
19.02.15
✎
14:08
|
(149) Ну иногда просто не умеют запросы писать.
|
|||
152
Domovoi
19.02.15
✎
14:09
|
(0)А разве изначально у 1с не так сделано?
|
|||
153
IШаман
19.02.15
✎
14:10
|
(152) Нет конечно.
|
|||
154
andreymongol82
19.02.15
✎
14:13
|
(150) Да-да. Разыменование, приведение к типу всяких там составных полей - это просто красивые слова.
|
|||
155
Domovoi
19.02.15
✎
14:13
|
Так в 7.7 же рассчитывали итоги на каждый месяц, разве это не тоже самое?
|
|||
156
IШаман
19.02.15
✎
14:14
|
(155) Нет.
|
|||
157
andreymongol82
19.02.15
✎
14:14
|
+(154) И какого же лохматого года СУБД, если до сих пор 256 таблиц?
|
|||
158
vde69
19.02.15
✎
14:20
|
(147)+100
например у меня списание по партиям ИначеЕсли Параметры.ИмяРегистра = "ОстаткиГТД" Тогда Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл НоваяСтрока = Параметры.ТаблицаДвижений.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка); Если НоваяСтрока.Количество > Выборка.КоличествоОстаток Тогда СтрокаСообщения = "Не списано ГТД """ + СокрЛП(Выборка.НомерГТД) + """, для номенклатуры """ + Выборка.Номенклатура + """!"; ОбщегоНазначения.ОшибкаПриПроведении(СтрокаСообщения, Отказ, Заголовок); КонецЕсли; КонецЦикла; КонецЕсли; |
|||
159
Эмбеддер
19.02.15
✎
14:27
|
(0) т.е. в программе будет 2 дублирующихся обработки проведения - обычная и для "волнового" проведения? что делать, если они дадут разный результат?
|
|||
160
IШаман
19.02.15
✎
14:30
|
(159) Написать третью:)
|
|||
161
Domovoi
19.02.15
✎
14:36
|
(0)"Шеф, ничего не понимаю".
Когда это применяется, зачем это? |
|||
162
Гений 1С
гуру
19.02.15
✎
14:38
|
(159) там алгоритмы схожие
|
|||
163
Гений 1С
гуру
19.02.15
✎
14:38
|
(154) вы наивный, иногда 256 таблиц не обходится.
|
|||
164
Гений 1С
гуру
19.02.15
✎
14:39
|
(149) кстати да, это увлечение одним запросом не понимаю. как мантры твердят "без запросов в цикле", просто фанатики.
|
|||
165
IШаман
19.02.15
✎
16:34
|
(164) Я думал что это вопрос как минимум производительности, а нет оказывается результат убеждений. Ты прям я смотрю раскольник от 1с, старообрядец - как в школе научили строки нумеровать и готу писать так до сих пор наверное так делаешь, а все остальное от лукавого.
|
|||
166
WebberNSK
19.02.15
✎
16:46
|
(164) я вот, например, сделал временную таблицу, положил ее в менеджер.
Потом постепенно в цикле выбираю запросом из нее данные с отбором по проиндексированным полям + упорядочиваю. Это зло, ведь "запрос" же в цикле?... Если будешь делать аналогичные манипуляции на сервере приложений с таблицей значений - проиграешь по скорости. и я посмотрю сколько времени у тебя уйдет на написание "быстрой" сортировки найденных строк |
|||
167
Salimbek
19.02.15
✎
16:56
|
(165) Почему же, просто элементарный смысл.
Вот есть у меня загрузка инфы от другой ИС, я ее обработал, по уникальным кодам свернул и осталось у меня 200 строчек. Теперь мне надо по этим кодам найти товары. Варианты: 1) Добавляю колонку в ТЗ рисую цикл и запросом в цикле получаю Номенклатуру - тут же заполняя строку ТЗ 2) Надо выгрузить ТЗ в базу, сделать запрос с соединением и результат запроса выгрузить в ТЗ Разницы между вариантами в скорости - нет. Причины, почему я не должен делать так, как мне здесь и сейчас удобнее, только идеологические. Собственно, что хочу сказать - когда падаванов учить - так по рукам бить надо ибо должны знать как правильно работать, а мозг там еще не оценивает последствия своих без(д)умных действий. Что касаемо - делать всем и всегда только так, а не иначе - не соглашусь, просто думать надо... |
|||
168
IШаман
19.02.15
✎
16:57
|
(167) А когда будет не 2090 позиций, а на 3 порядка больше?
|
|||
169
IШаман
19.02.15
✎
16:58
|
+(168) Почему то если человек привык делать хорошо он как правило в любом случае хорошо делает, а если приык "как удобно" то будет везде так делать, то ему некогда то так все равно почти за то же время отработает и т.д.
|
|||
170
WebberNSK
19.02.15
✎
17:05
|
(167) ну тут ты не прав...
если лениво эту таблицу в СКЛ тащить - написал бы процедуру, которая бы тебе вернула соответствие Ключ - код, Значение - номенклатура |
|||
171
Domovoi
19.02.15
✎
17:11
|
(167)ТЗ в запрос и соединяешь с спр.Номенклатура - изи
религия не противоречит реальности. Запрос в цикле простителен, только когда у вас есть механизм с запросом и вы им воспользовались в другом механизме в котором первый вызывается в цикле и то если станет вопрос производительности, то надо переписывать. Это обычная математика и глупо доказывать что к примеру 10сек медленнее чем 3 мин. |
|||
172
Salimbek
19.02.15
✎
17:12
|
(169) Потому что сверку мне надо закончить до конца недели - объем данных я знаю и могу оценить как мне удобнее. Более того - сначала только по коду работал - искал сам через консоль запросов товар и разбирался, т.к. казалось что все быстро решится. Когда надоело добавил выборку (страшное дело - в цикле!!!) Запускал этот запрос я аж 4 раза, при том что с результатом забитого юзерами бардака разбираюсь уже 3-й день. Вот скажи - есть у меня время вылизывать код и заморачиваться прочими несущественными вещами?
(170) Можно и так. Только всей номенклатуры 80 тыщ, лениво тащить и парсить. Повторюсь - здесь и сейчас оно мне не важно, поэтому можно и так без стонов, что "плохой" код. |
|||
173
Salimbek
19.02.15
✎
17:16
|
(171) Угуг, только лень, добавляя очередную понадобившуюся колонку в ТЗ, правильно разрисовывать ее тип. А без этого красиво ТЗ в запрос не уложишь.
Короче не парьтесь. Делайте всегда правильно - и это будет правильно! |
|||
174
Domovoi
19.02.15
✎
17:18
|
(173)Ну правильно лучше провтыкать в монитор с 10 мин чем потратить 30 сек на доп написание и получить резалт за 30 сек.
|
|||
175
WebberNSK
19.02.15
✎
17:23
|
(173) именно эту точку зрения я в (109) написал
|
|||
176
IШаман
19.02.15
✎
17:26
|
(172) Собственно говоря что и требовалось доказать, вы просто привыкли так работать все вермя завал все время аврал там дурку заткнул там костыль воткнул а бардак как был так и остался и чем дальше тем он больше.
|
|||
177
y22-k
19.02.15
✎
17:40
|
(147) есть регистр по одному измерению справочника в среднем около 100000 записей
элементов справочника около 1000,Надо обработать запросом весь регистр попробуй все объять одним запросом, тупо памяти не хватит |
|||
178
Salimbek
19.02.15
✎
17:41
|
(174) С этим согласен - надо всегда, в любой ситуации и для каждой, даже одноразовой выборки, писать идеальный код, еще пару суток потом доводя его до совершенства.
(175) Угуг, правильно ты заметил, времени то лишнего у меня и нету. (176) Вроде дискуссия была о том, надо ли в каждой ситуации отказываться от запросов в цикле. И в этом споре мое мнение - надо стараться делать правильно, но иногда (в редких случаях) бывает так, что проще/быстрее/удобнее/(или что там еще) решить запросами в цикле. А ваше доказательство о какой-то другой теме. |
|||
179
Domovoi
19.02.15
✎
17:52
|
(177)Баян. Хватит.
|
|||
180
Domovoi
19.02.15
✎
17:53
|
+(179)Каждый день работю и с большими объемами, все за секунды обрабатывается.
|
|||
181
Salimbek
19.02.15
✎
18:09
|
(180) Вот прям миллионами строк итоговая выборка?
А то я ступил тут (да, я тупой 1С-ник, я тормоз прогресса...) - накидал запрос выбравший мне все строки из всех Приходных - сервак и запечалился 20 гиг ОЗУ сразу съел, остальное пошел свопить. Ладно я свой сеанс грохнул... (Даже любопытно стало, сходил, посмотрел, всего-то 19 444 808 строк) |
|||
182
Тюря
20.02.15
✎
08:15
|
(0) Еще рассказать про велосипед изобретенный мной в 1995 году? Отчеты ускорились в 10 раз.
Возможно сейчас это не актуально, тогда винчестеры были медленные, памяти мало и тд. В одной ячейки таблицы сохранял массив значений, соответственно считывал один раз сразу много значений и потом уже их обрабатывал. |
|||
183
vis_tmp
20.02.15
✎
08:18
|
(182)Какие отчёты?
|
|||
184
Тюря
20.02.15
✎
08:49
|
(183) Отчет анализировал остатки, реализацию, прогноз закупок, по сезонно, по дням, по месяцам и тд.
|
|||
185
vis_tmp
24.02.15
✎
10:35
|
(184) Не понятно...
В какой момент что сохранял и когда потом это сохранённое обрабатывал? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |