Имя: Пароль:
1C
 
Волновое перепроведение партий - реализовано.
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) Не понятно...
В какой момент что сохранял и когда потом это сохранённое обрабатывал?
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.