|
Волновое перепроведение партий - реализовано. | ☑ | ||
---|---|---|---|---|
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) Не понятно...
В какой момент что сохранял и когда потом это сохранённое обрабатывал? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |