Имя: Пароль:
1C
 
Волновое перепроведение партий - реализовано.
0 Гений 1С
 
гуру
17.02.15
21:01
Это конечно не партионный учет без перепроведения, но все же нечто.
Рекомендую, ибо у себя уже сделал.
Суть - на начало месяца получаем остатки по всем товарам, далее в запросе получаем все движения по регистру остатков, сортируем их по времени и начинаем списание партий.

Преимущество - не нужно вычислять остатки на каждый документ, как только обработали документ, переходим к следующему, а все остатки по с/сти висят в памяти. Работает раз в 5 быстрее обычного перепроведения по партиям.

Вы такое у себя делали?
2 mm_84
 
17.02.15
21:09
Преимущество - не нужно вычислять остатки на каждый документ. А как мы проверим что не влезли в отрицательный остаток?
3 Lama12
 
17.02.15
21:13
(2) Как я понимаю, это должно быть при оперативном проведении, а не при восстановлееии последовательности.
4 mm_84
 
17.02.15
21:14
(3) а если они заносили реализацию задними числами, а потом запустили это волновое перепроведение.
6 eklmn
 
гуру
17.02.15
21:26
(4) ни 1 нормальный продукт не проверяет бред тупых вводильщиков
7 KUBIK
 
17.02.15
21:28
(0) Конфу + платформу озвучь ещё
8 R41
 
17.02.15
21:30
(0)Ага. Только важный нюанс, проверять что если не было изменений в партиях не выполнять запись - еще получаем прирост производительности.
9 Гений 1С
 
гуру
17.02.15
21:35
(2) а в чем проблемы с минусом? списываем по нулевой с/с
10 Гений 1С
 
гуру
17.02.15
21:36
(7) 8.3, конфа УТ 10.3
11 Гений 1С
 
гуру
17.02.15
21:36
(8) именно так и делаю, но это детали, которые должен любой понимать
12 Гений 1С
 
гуру
17.02.15
21:39
(4) если тебя это беспокоит, начинай с границы последовательности и сдвигай ее при проходе волны
14 Тюря
 
17.02.15
21:43
(0) делал подобное в 2000 году
15 Гений 1С
 
гуру
17.02.15
21:44
(3) понимаешь неправильно, речь идет об остатках по партиям конечно же, чтобы списать их по FIFO/LIFO/среднему.
16 Гений 1С
 
гуру
17.02.15
21:44
(14) а че не делилися ни с кем? мы тут страдали, а он захомячил грамотное решение
17 Гений 1С
 
гуру
17.02.15
21:45
(13) ну-ка, ну-ка, поподробнее.
18 vlandev
 
17.02.15
21:46
На основании рекомендаций в (9) предлагаю штормовое перепроведение партий - все списывать по нулевой с/с , преимущество - не надо вычислять вообще ничего , работать будет раз в 10 быстрей волнового :D
19 DailyLookingOnA Sunse
 
17.02.15
21:49
Зачем вообще эти партии.
Списал по средней в конце месяца одной суммой.
Без входящих требований можно много велосипедов изобрести.
20 Гений 1С
 
гуру
17.02.15
21:53
(18) ну это просто идеальный шторм.
(19) Прибыль простите как будете считать?
21 ОбычныйЧеловек
 
17.02.15
21:55
(19)зачем вообще учет ? Записал в тетрадке циферки (+-) в конце тетрадки посчитал итог - а все эти ваши велосипеды в виде конфигураций....
22 DailyLookingOnA Sunse
 
17.02.15
21:56
(20)
Ты можешь ржать, но это почти реальная рабочая задача.
Только занимался ей не я.
И наша контора скорее всего крупнее твоей.
23 Feanor
 
17.02.15
22:02
(17)
1. открываешь УП2 в конфигураторе
2. находишь общий модуль "ПартионныйУчет"
3. ...
4. Профит1

Там как раз и "партионный учет без перепроведения" реализован
24 Feanor
 
17.02.15
22:03
+(23) ну и в конечном счете выкидываешь УТ10.3 на помойку :)
25 Гений 1С
 
гуру
17.02.15
22:21
(23) а по делу есть чего сказать? Спец спецу может на пальцах объяснить, если есть че объяснять конечно.
26 Feanor
 
17.02.15
22:22
(25) тебе уже все объяснили.

почитай литературу, если открыть конфигуратор не можешь :)
27 Гений 1С
 
гуру
17.02.15
22:26
(22) не ну почему же, допускаю. Если с/с не очень критична, то можно.

Например в начале месяца остаток 5 штук по средней цене 100.

Пришло за месяц 100 штук по цене 200 и 50 штук по цене 300. Всего 150 штук на сумму 35 000.

На конец осталось 8 штук, остальное продалось. Т.е. расход 5 + 150 - 8 = 147 штук.

Значит, на каждый расход приходится 350 00 / 147 = 238 штук.

Для производства норм, для торговли не очень.
28 Гений 1С
 
гуру
17.02.15
22:27
(26) объяснений пока не видил, на слово не поверю.
29 Feanor
 
17.02.15
22:28
(28) не верь, дело твое
30 Гений 1С
 
гуру
17.02.15
22:28
(26) ПУ без перепроведения есть и в УТ 10.3, но там вычисляются остатки на момент каждого документа, экономят на:
1. Таблица движений уже сформирована в регистре Списанные товары.
2. Проводят только по регистру Партий, не трогая другие регистры...
31 Гений 1С
 
гуру
17.02.15
22:28
(29) ты не о том, дядя. Я про волновое проведение. А ты про то, что было еще в УТ 10.3
32 Feanor
 
17.02.15
22:33
(31) УТ 10.3 то тут каким боком? тебе про УТ11 / УП2 толкуют
34 Гений 1С
 
гуру
17.02.15
22:45
(32) Я тебе объяснил, что там не используется волновое проведение партий. по-моему наглядно.
(33) взаимно
35 Feanor
 
17.02.15
22:52
(34) ок ок, я уже понял, что все гамно, кроме твоих волн :)
36 KSN
 
17.02.15
22:56
Гений придумал Рауз... Не прошло и 7лет после его внедрения.
37 Smallrat
 
17.02.15
23:02
блин, я пошутил про торсионные волны, так удалили. Серьезная же тема...
38 Гений 1С
 
гуру
17.02.15
23:30
(36) это не РАУЗ
39 Reaper_1c
 
17.02.15
23:53
А вот и плоды амнистии...
40 Гений 1С
 
гуру
17.02.15
23:55
(39) холодное лето 53-го.
41 mdocs
 
17.02.15
23:59
Нормальная идея, но переделывать типовую придеться сильно.Лень.
42 vde69
 
18.02.15
00:04
у меня уже лет 8 как работает партионный робот который на основе последовательности востанавливает движения в фоне, а в случае ошибки (минуса) шлет письмо администратор учета....

работает как часы...
43 Гений 1С
 
гуру
18.02.15
00:28
(41) зачем переделывать? у меня все делает внешняя обработка. ;-)

(42) ну это немного разное. Ты оптимизируешь имеющееся, я придаю имеющемуся новое высшее качество.
44 Злобный Фей
 
18.02.15
02:44
А как же "мой гений дарит вам"? Стареете, батенька.
45 Злопчинский
 
18.02.15
03:07
(42) и (43) - кривоногия решения, но канают когда нельзя править конфигу. При разрешении править конфигу - вариант ухода в минуса (уход в минуса по сумме возможен только при кривых руках) по количеству определяется практически мгновенно в момент проведения или сразу же после проведения.
46 Злопчинский
 
18.02.15
03:08
(42) у меня - тупо сделано. При попытке исправить задним числом док так, что где-то возникает минус - тупо такое действие блокируется.
47 rphosts
 
18.02.15
05:12
(43) какое ваысшее? Если это сделано в типовых - это типовое.
48 Гений 1С
 
гуру
18.02.15
07:13
(46) у меня тоже так сделано. называется "запрет глобальных минусов". но не всегда помогает. ;-) в распределенных бд все не уконтролируешь
49 Гений 1С
 
гуру
18.02.15
07:13
(47) волновое перепроведение по партиям в типовых не сделано.
50 ОбычныйЧеловек
 
18.02.15
07:28
Вообще забавно читать коменты...Обычно переход на мат (33) это либо зависть,либо чувство собственной неполноценности, либо какие-то комплексы.
Гений 1С - выкладывай на ИСе например, посмотрим, оценим.
51 rphosts
 
18.02.15
07:31
(50) расскажите как до чела донести что это уже реализовано если словам он не верит, а конфигуратор не хочет открывать?
52 ОбычныйЧеловек
 
18.02.15
07:42
(51) А для чего необходимо это до него доносить? даже если предположить, что в типовых конфах это реализовано - то совсем не факт, что лучше чем например ТС реализовал. Лично для меня реализация разработчиками типовых мягко говоря не интересна, поскольку в 99% случаях все сделано через одно место а вот посмотреть на реализацию стороннего разработчика - всегда интересно (опять же имхо)
53 Злобный Фей
 
18.02.15
09:46
(50) Ой-ой-ой, всё пропало! Тушеночная невеста нас тут всех разоблачила!
54 shuhard
 
18.02.15
09:51
(50)[Обычно переход на мат (33) это либо зависть,либо чувство собственной неполноценности, либо какие-то комплексы. ]
или ты ботан и не способен выразиться вменяемо и разводишь сопли
55 vde69
 
18.02.15
09:59
(43) странный ты, у меня контроль остатков и подбор партий реализован в одном запросе, предположитм ты продаешь в документе тушенку, ты расчитал остаток по тушенки а в следующем документе у тебя тушенка и рыба, ты будешь расчитывать рыбу?

если да - то твое "волнение" перерастет в растущее дерево.... и это собственно мой путь с последовательностью...

если "нет" то ты вынужден расчитывать по одной номенклатуре а записывать весь набор, в результате у тебя один документ может перезаписывать весь набор движений многократно, а учитывая всякие тригеры (типа регисрация обмена) ты получишь в отдельных ситуациях жуткие тормоза
56 Stim
 
18.02.15
10:03
если это сделано так же, как и фиксопед по выгрузке начального образа узла риб в немонопольном режиме - то не хочется и смотреть.
глупо тратить свое время на просмотр неоптимальных решений.
57 DCKiller
 
18.02.15
10:03
(0) Это, я так понял, если перепроводить доки какой-то обработкой? Ну тут-то можно, кто бы спорил... А если проведение идет из обработки, встроенной в конфу (той самой, которая из меню "Операции " вызывается, ага)? На все дыры заплатки не налепишь...
58 mdocs
 
18.02.15
10:15
(55) по моему очевидно - выбрать различную номенклатуру из оборотов и получить по всем позициям начальные остатки.
59 Feanor
 
18.02.15
11:07
(52) Партионный учет в УП2 реализован гораздо лучше, чем многие "Кулибины" могут из себя выдавить :)
60 Господин ПЖ
 
18.02.15
11:25
>получаем все движения по регистру остатков, сортируем их по времени

а что, 8-ка перестала в такие запросы "подмешивать" id таблицы документа? иначе в пределах секунды будет "мешанина" сначала все поступления, потом все расходы (в зависимости что раньше в конфигураторе вводилось в методанных)
61 vvp91
 
18.02.15
11:41
(59) Ласковое слово и собаке приятно ;-)
62 vvp91
 
18.02.15
11:47
(60) "Подмешивание" к делу не относится.

В реальности необходимо списывать партии, имеющиеся на остатках на начало расчетного периода, и пришедшие в течении расчетного периода. В типовую заложена такая возможность.

Кроме того, в силу возможной запутанности товародвижений, необходимо правильно определять возможные источники партий для расхода и разрывать циклы перемещений. Это тоже приводит к тому, что подмешивание вообще роли не играет. Такие вещи тоже есть в ERP2/УТ11.
63 Бертыш
 
18.02.15
11:57
(33) Это к модераторам
64 Feanor
 
18.02.15
12:05
(61) Вполне заслуженно :)

Владимир, а новая концепция партионного учета (2.0.7 и выше) тоже результат Вашего труда?
65 rphosts
 
18.02.15
12:12
Офигеть! Тут бывают разрабы последних типовых!!!
66 vvp91
 
18.02.15
12:44
(64) Регистры были спроектированы другими разработчиками, под реализацию партионного расчета в УТ 11.1.1.
Под ERP 2.0.7 и УТ 11.1.9 пришлось сам партионный расчет переписать. Сам партионный расчет (общий модуль ПартионныйУчет, со структурой модуля и математикой) писался с нуля. Структуру регистров было решено не трогать, а обойтись только необходимыми косметическими изменениями.
67 Господин ПЖ
 
18.02.15
12:46
(62) крута... заходите почаще
68 vvp91
 
18.02.15
12:47
Неплохой, на мой взгляд, видео-доклад по внутренней механике ПУ в ERP2 сделал мой коллега из 1С: http://www.youtube.com/watch?v=tiW6NRDvqjk
69 Smallrat
 
18.02.15
12:54
(65) у человека в профиле соцсети написано что работал в 1С по июль 14-ого.
70 Smallrat
 
18.02.15
12:55
(69) хотя это не отменяет крутости, да
71 Гений 1С
 
гуру
18.02.15
13:26
Лучше один раз показать код, чем 100 раз говорить.
Собственно, мой гений вам дарит:

    НачальнаяДата = Дата1;
    Пока Истина Цикл
        Если НачальнаяДата > Дата2 Тогда
            Прервать;
        КонецЕсли;
        //Идем месячными периодами по 30 дней...
        КонечнаяДата = НачальнаяДата + 30*3600*24;
        
        ЗаголовокПериода = "с: " + Формат(НачальнаяДата, "ДФ=dd.MM.yyyy") + " по: " +  Формат(КонечнаяДата, "ДФ=dd.MM.yyyy");
        
        Сообщить("Обработка периода " + ЗаголовокПериода);
        
        Если флСерийныйТовар И флНЕСерийныйТовар Тогда
            УсловиеСерийного = "Истина";
        ИначеЕсли флСерийныйТовар Тогда
            УсловиеСерийного = "ХарактеристикаНоменклатуры <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)";
        Иначе
            УсловиеСерийного = "ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)";
        КонецЕсли;
        
        //Запрос по остаткам на начало периода
        //Получаем срез остатков партий по номенклатуре на начальную дату, исключая саму начальную дату
        З = Новый Запрос(
        "ВЫБРАТЬ
        |    Т.Номенклатура,
        |    Т.ХарактеристикаНоменклатуры,
        |    Т.КоличествоОстаток КАК Количество,
        |    Т.СтоимостьОстаток КАК Стоимость
        |ИЗ
        |    РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Дата, &Условие) КАК Т");
        З.УстановитьПараметр("Дата", Новый Граница(НачальнаяДата, ВидГраницы.Исключая));
        Если ЗначениеЗаполнено(ОтборПоТоварам) Тогда
            ТекУсловие = "Номенклатура В ИЕРАРХИИ (&ОтборПоТоварам)";
            З.УстановитьПараметр("ОтборПоТоварам", ОтборПоТоварам);
        Иначе
            ТекУсловие = "Истина";
        КонецЕсли;
        ТекУсловие = ТекУсловие + " И " + УсловиеСерийного;
        З.Текст = СтрЗаменить(З.Текст, "&Условие", ТекУсловие);
        
        ТЗОстатки = З.Выполнить().Выгрузить();
        Сообщить(Символы.Таб + "Начальный размер таблицы остатков: " + ТЗОстатки.Количество());
        
        //Запрос по оборотам по партиям за период
        З = Новый Запрос(
        "ВЫБРАТЬ
        |    Т.Номенклатура,
        |    Т.ХарактеристикаНоменклатуры,
        |    Т.Количество,
        |    Т.Стоимость,
        |    Т.ВидДвижения,
        |    Т.Период,
        |    Т.Регистратор,
        |    Т.НомерСтроки
        |ИЗ
        |    РегистрНакопления.ПартииТоваровНаСкладах КАК Т
        |ГДЕ
        |    Т.Период МЕЖДУ &Дата1 И &Дата2
        |    И &Условие
        |
        |УПОРЯДОЧИТЬ ПО
        |    Т.Период,
        |    Т.Регистратор");
        З.УстановитьПараметр("Дата1", НачалоДня(НачальнаяДата));
        З.УстановитьПараметр("Дата2", КонецДня(КонечнаяДата));
        Если ЗначениеЗаполнено(ОтборПоТоварам) Тогда
            ТекУсловие = "Номенклатура В ИЕРАРХИИ (&ОтборПоТоварам)";
            З.УстановитьПараметр("ОтборПоТоварам", ОтборПоТоварам);
        Иначе
            ТекУсловие = "Истина";
        КонецЕсли;
        
        ТекУсловие = ТекУсловие + " И " + УсловиеСерийного;
        З.Текст = СтрЗаменить(З.Текст, "&Условие", ТекУсловие);
        ТЗДвижения = З.Выполнить().Выгрузить();
        
        //Поиск будет по индексам быстрее.
        ТЗДвижения.Индексы.Добавить("Номенклатура");
        ТЗДвижения.Индексы.Добавить("ХарактеристикаНоменклатуры");
        ТЗДвижения.Колонки.Добавить("Модифицированность", Новый ОписаниеТипов("Булево"));
        ТЗДвижения.Колонки.Добавить("РезСтоимость");
        ТЗДвижения.Колонки.Добавить("ИсхСтрока");
        
        ТЗДвиженияРегистратора = ТЗДвижения.СкопироватьКолонки();
        Сообщить(Символы.Таб + "Размер таблицы движений: " + ТЗДвижения.Количество());
        
        //Идем по каждому регистратору
        Всего = ТЗДвижения.Количество();
        ИндДвиж = 1;
        Пока ИндДвиж <= Всего Цикл
            ТекРегистратор = ТЗДвижения[ИндДвиж - 1].Регистратор;
            ТЗДвиженияРегистратора.Очистить();
            ИндДвиж2 = ИндДвиж;
            Пока ИндДвиж2 <= Всего Цикл
                Если ТекРегистратор <> ТЗДвижения[ИндДвиж2 - 1].Регистратор Тогда
                    Прервать;
                КонецЕсли;
                НСтр = ТЗДвиженияРегистратора.Добавить();
                ЗаполнитьЗначенияСвойств(НСтр, ТЗДвижения[ИндДвиж2-1]);
                НСтр.ИсхСтрока = ТЗДвижения[ИндДвиж2 - 1];
                ИндДвиж2 = ИндДвиж2 + 1;
            КонецЦикла;
            ИндДвиж = ИндДвиж2;
            
            //Здесь нужно обработать движения регистратора
            Сообщить(Символы.Таб + "Документ: " + ТекРегистратор + ", движений: " + ТЗДвиженияРегистратора.Количество());
            #Если Клиент Тогда
                ОбработкаПрерыванияПользователя();
            #КонецЕсли
            
            //Обрабатываем движения документа
            Модифицированность = ложь; //Были ли изменения
            НЗ = Неопределено;
            Для Каждого СтрокаДвиж ИЗ ТЗДвиженияРегистратора Цикл  
                //Определяем вид движения
                Если СтрокаДвиж.ВидДвижения = ВидДвиженияНакопления.Приход Тогда
                    Знак = +1;
                Иначе
                    Знак = -1;
                КонецЕсли;
                
                //Ищем в остатках остаток по текущему товару
                ИскСтрокиОстатка = ТЗОстатки.НайтиСтроки(Новый Структура("Номенклатура, ХарактеристикаНоменклатуры", СтрокаДвиж.Номенклатура, СтрокаДвиж.ХарактеристикаНоменклатуры));
                Если ИскСтрокиОстатка.Количество() = 0 Тогда
                    ИскСтрока = ТЗОстатки.Добавить();
                    ИскСтрока.Номенклатура = СтрокаДвиж.Номенклатура;
                    ИскСтрока.ХарактеристикаНоменклатуры = СтрокаДвиж.ХарактеристикаНоменклатуры;
                    ИскСтрока.Количество = 0;
                    ИскСтрока.Стоимость = 0;
                Иначе
                    ИскСтрока = ИскСтрокиОстатка[0];
                КонецЕсли;
                
                //Какие у документа количество и стоимость?
                ТекКоличество = СтрокаДвиж.Количество;
                ТекСтоимость = СтрокаДвиж.Стоимость;
                ТекЦена = ?(ТекКоличество = 0, ТекСтоимость, Окр(ТекСтоимость / ТекКоличество, 2));
                
                КорректироватьСС = ложь;
                
                //Возврат товаров от покупателя - особый случай...
                Если Знак = +1 И ТипЗнч(ТекРегистратор) = Тип("ДокументСсылка.ВозвратТоваровОтПокупателя") Тогда  //26.03.2010
                    //Ищем себестоимость продажи
                    
                    ИскСтроки = ТекРегистратор.Товары.НайтиСтроки(Новый Структура("Номенклатура, ХарактеристикаНоменклатуры", СтрокаДвиж.Номенклатура, СтрокаДвиж.ХарактеристикаНоменклатуры));
                    Если ИскСтроки <> Неопределено Тогда
                        ДокументПродажи = ИскСтроки[0].ДокументПартии;
                        Если ЗначениеЗаполнено(ДокументПродажи) Тогда
                            З = Новый Запрос(
                            "ВЫБРАТЬ
                            |    ПартииТоваровНаСкладах.Номенклатура,
                            |    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
                            |    ПартииТоваровНаСкладах.Регистратор,
                            |    ПартииТоваровНаСкладах.Количество,
                            |    ПартииТоваровНаСкладах.Стоимость
                            |ИЗ
                            |    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
                            |ГДЕ
                            |    ПартииТоваровНаСкладах.Регистратор = &Регистратор
                            |    И ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
                            |    И ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры");
                            З.УстановитьПараметр("Номенклатура", СтрокаДвиж.Номенклатура);
                            З.УстановитьПараметр("ХарактеристикаНоменклатуры", СтрокаДвиж.ХарактеристикаНоменклатуры);
                            З.УстановитьПараметр("Регистратор", ДокументПродажи);
                            Выборка = З.Выполнить().Выбрать();
                            Если Выборка.Следующий() Тогда
                                КорректироватьСС = истина;
                                ТекЦенаОстатка = ?(Выборка.Количество = 0, Выборка.Стоимость, Окр(Выборка.Стоимость / Выборка.Количество, 2));
                                ТекЦенаОстатка = Макс(ТекЦенаОстатка, -ТекЦенаОстатка); //По модулю всегда
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
    
                
                Если Знак = -1 Тогда
                    КорректироватьСС = истина;
                    //Если это расход, то проверяем актуальность количества и стоимости
                    ТекЦенаОстатка = ?(ИскСтрока.Количество = 0, ИскСтрока.Стоимость, Окр(ИскСтрока.Стоимость / ИскСтрока.Количество, 2));
                    ТекЦенаОстатка = Макс(ТекЦенаОстатка, -ТекЦенаОстатка); //По модулю всегда
                КонецЕсли;
                
                Если КорректироватьСС Тогда
                    
                    ДельтаЦены = ТекЦенаОстатка - ТекЦена;
                    ДельтаЦЕны = Макс(ДельтаЦЕны, -ДельтаЦены);
                    
                    //Если разница в цене больше 20 копеек, тогда корректируем
                    Если ДельтаЦены > 0.20 Тогда
                        Модифицированность = истина;
                        
                        
                        Если НЗ = Неопределено Тогда
                            НЗ = РегистрыНакопления.ПартииТоваровНаСкладах.СоздатьНаборЗаписей();
                            НЗ.Отбор.Регистратор.Значение = ТекРегистратор;
                            НЗ.Отбор.Регистратор.Использование = истина;
                            НЗ.Прочитать();
                        КонецЕсли;
                        
                        ТекСтоимость = ТекКоличество * ТекЦенаОстатка;
                        
                        СтрокаДвиж.ИсхСтрока.Модифицированность = истина;
                        СтрокаДвиж.ИсхСтрока.РезСтоимость = ТекСтоимость;
                        
                        //На случай параллельных проведений, чтобы не стопорило
                        Если СтрокаДвиж.НомерСтроки <= НЗ.Количество() Тогда
                            МЗ = НЗ[СтрокаДвиж.НомерСтроки - 1];
                            МЗ.Стоимость = ТекСтоимость;
                        КонецЕсли;
                    КонецЕсли;
                КонецЕсли;
                
                //Корректируем волной остатки
                ИскСтрока.Количество = ИскСтрока.Количество + Знак * ТекКоличество;                
                ИскСтрока.Стоимость = ИскСтрока.Стоимость + Знак * ТекСтоимость;                
                
            КонецЦикла;
            
            Если Модифицированность и флЗаписывать Тогда
                НЗ.ОбменДанными.Загрузка = истина; //без контроля прав
                НЗ.Записать();
            КонецЕсли;
            
        КонецЦикла;
        
        Сообщить(Символы.Таб + "Конечный размер таблицы остатков: " + ТЗОстатки.Количество());
        
        Если флПечататьТаблицы Тогда
            САП.ПечатьТЗ(ТЗДвижения, "Период " + ЗаголовокПериода);
        КонецЕсли;
        
        //Переходим к слеующей дате
        НачальнаяДата = КонечнаяДата + 3600*24; //Плюс один день...
    КонецЦикла;
72 Гений 1С
 
гуру
18.02.15
13:28
(59) возможно, возможно, но я УТ 11 не смотрел, а голословным заявлениям, что там реализовано именно волновое перепроведение не верю. Хотя бы потому, что в случае распределения доп.затрат возникают нюансы. У меня такого распределения нет, поэтому я и не парюсь. А разработчики типовых решают задачу в общем виде.
73 Гений 1С
 
гуру
18.02.15
13:29
(65) я не пошел работать в 1С (брали в отдел УТ) именно из-за того, что запрещено было обсуждать 1С на форумах.
74 Господин ПЖ
 
18.02.15
13:39
(71) берет данные из физ. таблицы без отбора по "активность"

дальше можно не читать.

очередная хавноподелка...
75 Гений 1С
 
гуру
18.02.15
14:08
(74) хахаха, технично слил. ;-)
76 DailyLookingOnA Sunse
 
18.02.15
14:09
Я придумал зелёную бухгалтерию.
Она типовая, только в комментариях добавлены мои ники.
И она уже не типовая, а мое генитальное изобретение, потому что еще никто не придумывал зеленую бухгалтерию.
Есть у кого-нибудь зелёная бухгалтерия? То-то.

гкхм
77 Krendel
 
18.02.15
14:16
Пока руками не покупаешь, хрен что- либо поймешь. Боюсь что вычислять волну движения товара намного проблематичнее. Да и в конечном итоге волна должна захватить почти все документы. Т.Е. Говорить о произыодительности 5- раз слишком много, дай бог 2 раза
78 Гений 1С
 
гуру
18.02.15
14:29
(77) ты идею-то понял?
Как вычисляется волна - видно в коде.
Т.е. остатки хранятся в памяти. Каждый новый документ перебирается и по нему делаются движения.
У нас много серийного товара, поэтому все документы затрагиваются редко.
79 Гёдза
 
18.02.15
14:34
вместо
        ТЗДвижения.Индексы.Добавить("Номенклатура");
        ТЗДвижения.Индексы.Добавить("ХарактеристикаНоменклатуры");
нужно
        ТЗДвижения.Индексы.Добавить("Номенклатура, ХарактеристикаНоменклатуры");
80 Гёдза
 
18.02.15
14:35
остальные индексы не нужны.
можно получить ускорение еще в пару раз
81 vis_tmp
 
18.02.15
14:43
(71) Спасибо, посмотрим
82 WebberNSK
 
18.02.15
14:49
(79) угу, с индексами что то запутался Гений... на ТЗОстатки их вообще нет

а памяти на все это добро хватает?
83 GROOVY
 
18.02.15
14:50
А почему "Волновое"?
84 Гений 1С
 
гуру
18.02.15
15:09
(83) ну как же, остатки по товару - это вектор или волна, он меняется при прохождении через каждый документ. (82) (82) Да в принципе хватает, там только таблица Товар + Серийка + Кол-во + Стоимость. ;-)
85 Гений 1С
 
гуру
18.02.15
15:09
(79) спасибо, сперва долго думал, в чем разница, потом понял.
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) Не понятно...
В какой момент что сохранял и когда потом это сохранённое обрабатывал?
Независимо от того, куда вы едете — это в гору и против ветра!