Имя: Пароль:
1C
1C 7.7
v7: Работа с регистрами остатков.
0 BORG
 
10.09.12
12:50
Помогите плз.
Необходимо решить задачу актуального отображения остатков на предприятии при подборе товара из документа счет. Задача была мною решена, но видимо как то криво, потому что при расчете этих самых остатков комп подвисает на секунд 10-20, хотя на некоторых компах работает быстро, не могу понять в чем дело, направьте плз на путь истинный, буду очень благодарен.
На предприятии ведется партионный учет, используются два регистра остатков: "Остатки", "Резервы".

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

//Модуль формы подбора справочника номенклатура
//В табличной части формы подбора есть две колонки типа текст для отображения остатков,  в которых вызываются функции Кпродаже() и Резерв()

Перем РегОст, РегРез;

Функция ОстатокСклад()        
   РегОст.УстановитьФильтр(ТекущийЭлемент(),,,,,);
   РассчитатьРегистрыНа(МоментВремени);    
   Ост =    РегОст.СводныйОстаток(ТекущийЭлемент(),,,,,,"Количество");    
   Возврат СокрЛ(Формат(Ост, "Ч15.3."));                              
КонецФункции

Функция РезервСклад()        
   РегРез.УстановитьФильтр(ТекущийЭлемент(),,,,,,);    
   ОстатокРезерв  =    РегРез.СводныйОстаток(ТекущийЭлемент(),,,,,,,"Количество");          
   Возврат СокрЛ(Формат(ОстатокРезерв , "Ч15.3."));  
КонецФункции

Функция КПродаже()    
   Ост =Число(ОстатокСклад());
   Рез =Число(РезервСклад()) ;
   кПродаже = Ост + Рез;    
   Возврат СокрЛ(Формат(кПродаже , "Ч15.3."));    
КонецФункции

Функция Резерв()
   Рез =Число(РезервСклад()) ;    
   Возврат СокрЛ(Формат(рез , "Ч15.3."));    
КонецФункции




РегОст=СоздатьОбъект("Регистр.Остатки");  
РегРез=СоздатьОбъект("Регистр.Резервы");      
РегОст.ВременныйРасчет();            
РегРез.ВременныйРасчет();
1 BigHarry
 
10.09.12
12:52
Для актуальном отображении остатков расчет регистров не нужен, выписка счета задним числом не требует актуальных остатков.
2 ДенисЧ
 
10.09.12
12:52
ТА где стоит? Наверное, далеко впереди?
Если нет, то не нужно считать регистры. Именно расчёт потребляет время.
3 BORG
 
10.09.12
12:53
ТА далеко впереди стоит
4 Simod
 
10.09.12
12:53
(0) Посмотрите как использовать метод РассчитатьРегистрыНа(), хотя бы в той же типовой.
5 BORG
 
10.09.12
12:54
Да я понимаю что расчет потребляет время, учитывая что расчет происходит постоянно
6 Simod
 
10.09.12
12:54
(3) А зачем она далеко впереди?
7 zladenuw
 
10.09.12
12:56
остатки в разрезе фирм или общие ?
8 BORG
 
10.09.12
12:57
сам это удивился как только базу увидел, ответа четкого так и не смог добиться от бухов, говорят что конфигурацию разрабатывали какие то сторонние разработчики и ТА все время сдвинату вперед потому что надо было якобы проводить какие то документы иногда чуть ли не на месяц вперед + в самом справочнике номенклатуры есть такая кнопка как ПоказатьПартии и там за время расчета регистров берется текущая дата + 1 все время
9 BORG
 
10.09.12
12:59
(7) Остатки общие
10 Simod
 
10.09.12
13:04
(8) В этом случае придется смирится с временем расчета остатков. Или разбираться в причинах сдвига ТА в "будущее" и искать решение как его обойти применительно в вашем случае. Ну и переписать фрагмент с расчетом регистров придется обязательно. Иначе о Вас будут такого же мнения, как и о предыдущих разработчиках.
11 Boroda
 
10.09.12
13:05
если ТА и сдвинута какими-то документами,в принципе, можно брать данные по этим регистрам на ТА, не делая временного расчета.  Но надо смотреть, чтоб документы, двинувше ТА вперед не двигали  эти регистры.
12 zladenuw
 
10.09.12
13:05
РегОст.ВременныйРасчет();            
РегРез.ВременныйРасчет();
Замечание:
В один момент времени только по одному объекту регистров каждого вида могут участвовать во временном расчете.
может тут собака зарыта
13 Джинн
 
10.09.12
13:06
(9) С учетом (8) остатки не общие - остатков нет вообще :)
14 zladenuw
 
10.09.12
13:06
(12) ступил
15 Voronve
 
10.09.12
13:07
Жесть в 0
16 Джинн
 
10.09.12
13:08
Ептыть! Глянул код - расчет итогов по всей номенклатуре, без фильтра - это круто!
17 Эльниньо
 
10.09.12
13:08
Что в МоментВремени?
18 Boroda
 
10.09.12
13:09
Вот тут еще непонятно:
кПродаже = Ост + Рез;  
Что, резерв пишется "минусом" что-ли? :)
19 ProProg
 
10.09.12
13:11
ипона мать - сколько у него измерений.....
по остаткам 6
по резервам 7...

ахахах. и это еще все расчитывается.
20 Voronve
 
10.09.12
13:13
(0) Дешевле по накладным расходам будет расчет регистров на МоментВремени при открытии формы, выгрузку в ТЗ, и показ данных из ТЗ.
21 ProProg
 
10.09.12
13:13
(20) дешевле будет на восьмерку перейти....
22 ProProg
 
10.09.12
13:14
с таким количеством измерений долго базы на семерке не живут.
23 aka AMIGO
 
10.09.12
13:16
ВрРег = СоздатьОбъект("Регистры");
   Рег = ВрРег.ОстаткиТоваров;
   Рег1 = ВрРег.ЧугунныйРезерв;
   Рег.УстановитьЗначениеФильтра("Товар",СЗТ,2);
   Рег.УстановитьЗначениеФильтра("Склад",СклТоварВПути,1);

   Рег.ВременныйРасчет(1);
   Рег1.ВременныйРасчет(1);
   Рег.ОбратныйПорядок(1);
   ВрРег.РассчитатьРегистрыНа(ДатаНач);
24 Эльниньо
 
10.09.12
13:16
(22) А 10 в Регистр.Партии не хочешь?
Живут. Годик, два. Потом стремительно умирать начинают.
25 Эльниньо
 
10.09.12
13:17
(23) Что это было?
26 aka AMIGO
 
10.09.12
13:18
(25)это пример к (12)
27 zladenuw
 
10.09.12
13:19
(23) а разница между УстановитьЗначениеФильтра и УстановитьФильтр ?
28 aka AMIGO
 
10.09.12
13:20
(27)есть, пишется имя реквизита и значение
а ином - через запятые, по количеству реквизитов
29 zladenuw
 
10.09.12
13:22
(28) а как видеть при этом сама 1с. что быстрее ? или что лучше использовать
30 aka AMIGO
 
10.09.12
13:23
(29)не измерял.. брал, что поудобнее мне
31 aka AMIGO
 
10.09.12
13:29
+26 для случая ТС:

   ВрРег = СоздатьОбъект("Регистры");
   РегОст = ВрРег.Остатки;
   РегРез = ВрРег.Резервы;
   //тут фильтры
   РегОст.ВременныйРасчет(1);
   РегРез.ВременныйРасчет(1);

   ВрРег.РассчитатьРегистрыНа(МоментВремени);
32 Voronve
 
10.09.12
13:30
(21) Псдеж.
33 BORG
 
10.09.12
13:31
Пример такой реализации как я сделал я брал из одной базы  в  которой реализовано по такому же принципу, возможно я что то не доглядел, и у меня поэтому тормозит, но в той базе расчет происходит менее чем за секунду, и там в отличии от моей базы не 150 наименований товаров а более 3000, база дбф, весит порядка 4-5 гигов, и  работает уже более 5 лет...
34 BORG
 
10.09.12
13:32
фильтр у меня установлен и расчет происходит по одному измерению
35 Ёпрст
 
10.09.12
13:37
(0) это полный ПЭ.
36 Ёпрст
 
10.09.12
13:37
весь код в топку
37 BORG
 
10.09.12
13:38
(36) я не против, в том то и вопрос был как вообще можно организовать актуальное отображение остатков по регистрам в справочнике при подборе, ведь я думаю это много где должно быть реализовано
38 Ёпрст
 
10.09.12
13:40
(37) Для начала, открыть типовой ТиС и переписать код оттуда.

А так, за расчет регистров ДЛЯ КАЖДОГО элемента номенклатуры - даже молоточком по темечку маловато будет
39 Boroda
 
10.09.12
13:41
(34) А какие документы двигают ТА вперед? И двигают ли эти документы регистр остатков и резервов? Возможно, можно будет обойтись без временного расчета и просто использовать куски из типой глСписаниеТМЦ, глСписаниеПартийТМЦ...
40 BORG
 
10.09.12
13:42
(38) можно конечно их рассчитать один раз при открытии формы для подбора, но если через несколько секунд какое то количество товара будет изменено(был проведен какой то документ), то как поддерживать актуальность?
41 zladenuw
 
10.09.12
13:45
(40) наверное перед проведение проверят еще раз. если есть риск что товар ушел.
42 BORG
 
10.09.12
13:45
(39) документ Перемещение, там замуты двигают товар на другие склады, документами дата которых впереди, это все связано с получением каких то отчетов по упр. учету
43 BORG
 
10.09.12
13:48
(40) проверка при проведении есть, это обязательно при работе с регистрами и партионным учетом, но получается делает менеджер счет, открыл форму подбора, минут 5-10 набивал товар,а потом ему пишет сообщение при проведении, что мол тех и тех позиций не хватает. Конечно это нечастые возможно случаи, и должен быть большой товарооборот, чтобы так часто менялись остатки, но при разработке учитывается то что может быть в будущем, а оно реально так может быть, что не успел поставить товар в резерв как его уже другой менеджер забрал
44 Mikeware
 
10.09.12
13:51
(43) тогда тебе нужно работать постоянно в режиме допроведения...
45 Ёпрст
 
10.09.12
13:53
(40) тогда берут поставщик данных в виде прямого запроса + автообновление каждые n..секунд
46 zladenuw
 
10.09.12
13:54
а может сделать подбор другим. менеджер набивает нужно количество. ему выдает по которым нету остатков или нехватка. по которым есть загружаем в документ и проводим его. так наверное будет оптимальней. чем проверять по 1 тмц и проводить док или нет ?
47 Ёпрст
 
10.09.12
13:54
+45 и это никак не гарантирует тот факт, что подобранный товар раньше кто-то не продаст.
48 Simod
 
10.09.12
13:57
(39) Тогда уж лучше посмотреть ИнформацияОНоменклатуре() в модуле формы документа "Реализация" типовой ТиС.

(43) В типовой форме подбора отображаются остатки. Или там переделано?
49 aka AMIGO
 
10.09.12
14:00
(48)а меня мой знакомый попросил сделать к Остаткам еще 2 колонки: Резерв и свободный.
правда, у него фирма маленькая: он один :)
50 Ёпрст
 
10.09.12
14:02
(48) отображаются
51 Simod
 
10.09.12
14:03
(50) Знаю. Вопрос был про переделано.
52 Ёпрст
 
10.09.12
14:05
(51) та не, в типовом тисе всё отображается изначально
53 Simod
 
10.09.12
14:08
(52) Та не, я знаю, что в типовой изначально хоть на дату, хоть на ТА, хоть на документ отображаются остатки. Вопрос был: переделана ли форма или расчет остатков в ней?

:-)
54 aka AMIGO
 
10.09.12
14:10
Запугали ТСа..