Имя: Пароль:
1C
1C 7.7
v7: Витрина (продажа последней позиции)
0 monsterZE
 
27.07.11
17:19
вобщем насущная проблема - выписываются расходные накладные, правятся задним числом (т.е. в течении дня может быть переделана неск. раз)
задача, при расходовании товара полностью приписывать в печ.форме слово витрина.
Сделал вот так.. протестил.. но почему-то (у операторов) бывает, что не ставится витрина, когда б по идее должна. =(( Посмотрите, плиз.
Процедура ОбработкаВитрины()
   Док=СоздатьОбъект("Документ."+Вид());    
   регОст = СоздатьОбъект("Регистр.ОстаткиТоваров");
   
   Если (Док.НайтиПоНомеру(НомерДок,ДатаДок)=1) и (Док.ТекущийДокумент().Проведен()=1) Тогда
       // перепроводится
       ВремТаб=СоздатьОбъект("ТаблицаЗначений");
       Док.ВыгрузитьТабличнуюЧасть(ВремТаб,"Товар,Количество");
       ВыбратьСтроки();
       Пока ПолучитьСтроку()=1 Цикл
           стр=ПолучитьПустоеЗначение();
           Если ВремТаб.НайтиЗначение(Товар,стр,"Товар")=1 Тогда
               ВремТаб.ПолучитьСтрокуПоНомеру(стр);
               Если ВремТаб.Количество<>Количество Тогда
                   ПолныйОстаток = регОст.СводныйОстаток(Товар,Склад,"ОстатокТовара");
                   Витрина=?(ПолныйОстаток-Количество+ВремТаб.Количество>0,0,1);
               КонецЕсли;    
           Иначе
               ПолныйОстаток = регОст.СводныйОстаток(Товар,Склад,"ОстатокТовара");
               Витрина=?(ПолныйОстаток-Количество>0,0,1);
           КонецЕсли;        
       КонецЦикла;    
   Иначе // проводится первый раз
       ВыбратьСтроки();
       Пока ПолучитьСтроку()=1 Цикл
           ПолныйОстаток = регОст.СводныйОстаток(Товар,Склад,"ОстатокТовара");
           Витрина=?(ПолныйОстаток-Количество>0,0,1);
       КонецЦикла;        
   КонецЕсли;    
КонецПроцедуры
1 monsterZE
 
27.07.11
17:20
срабатывает при записи документа
2 monsterZE
 
27.07.11
17:22
проверка по количеству, чтобы не писалось, когда не нужно.
т.е. если на момент первого проведения документа остаток был больше нуля, а на момент последующего стал ноль.
3 miki
 
27.07.11
17:22
и что, всякий раз проводите на ТА?
4 monsterZE
 
27.07.11
17:23
выделять "витрину" на отдельный склад не хотят, т.к. товара очень много, и "им будет сложно ее контроллировать"... =(
5 Rie
 
27.07.11
17:24
(3) +1
6 monsterZE
 
27.07.11
17:28
(3) возможно и нет.. но вроде по словам операторов
у них как-то получается такое, что за день выписывал товар только один чел. купил полностью и витрина не приписалась..
7 monsterZE
 
27.07.11
17:29
вот думаю, мож я где накосячил... и ничего чет не придумывается. =) у себя тестирую - работает правильно..
8 monsterZE
 
27.07.11
17:31
как програмно заставить перепроводить на ТА? =) бо операторы жмут кнопки не глядя. =)
9 Tatitutu
 
27.07.11
17:32
ИМХО. код бред - давно такого не видел.

Что будет если у тебя в документе табличной части
будет несколько строк с одинаковым товаром , но с разным количеством

свернуть - попробуй

вот это
на кой
Если (Док.НайтиПоНомеру(НомерДок,ДатаДок)=1) и (Док.ТекущийДокумент().Проведен()=1) Тогда

зачем врем. таблица
вместо временного расчета регистра
про ТА уже сказали
10 miki
 
27.07.11
17:34
и это вот шаманство:
ВремТаб.Количество<>Количество

есть несколько строк с одинаковым товаром? - выгрузи в ТЗ, сверни и сравнивай один раз с остаком...
11 monsterZE
 
27.07.11
17:36
ограничение
несколько строк с одинаковым товаром в ТЧ быть не может.
12 miki
 
27.07.11
17:37
(8)у провести() есть параметр.
13 monsterZE
 
27.07.11
17:37
точнее одинаковый товар, при добавлении сворачивается.
14 monsterZE
 
27.07.11
17:39
(10) Шаманство =) чтобы не ставило витрина, если товар уже закончился к моменту редактирования. Но купил последний товар другой покупатель.
15 Tatitutu
 
27.07.11
17:39
Вот смотри

зашел ты в условие свое нелепое

Если ВремТаб.Количество<>Количество Тогда
Витрина = //вернет результат
КонецЕсли

а если условие не срабатывает
то ничего и не будет
16 monsterZE
 
27.07.11
17:42
(15) для чего это условие:
ищется этот-же документ, если он есть и проведен
выгружается его ТЧ и сравнивается с сохраняемым
если количество товара в редактирыемом документе не изменилось
то витрину приписывать этому товару не нужно
17 Tatitutu
 
27.07.11
17:43
(0) это просто жесть , а не код

ответь по твоему коду

//если ты нашел Док.  его выгружаешь
Док.ВыгрузитьТабличнуюЧасть(ВремТаб,"Товар,Количество");

//то почему перебираешь строки так
       ВыбратьСтроки();
//а не
Док.ВыбратьСтроки();

мой совет : удали всю эту процедуру , покури и напиши заново.Стыдно за такой код должно быть.
18 miki
 
27.07.11
17:43
(16) :))
количество может и не поменяться, а вот остатки (см. (0) " правятся задним числом ") - вполне могут измениться.
19 monsterZE
 
27.07.11
17:45
Tatitutu предложи свою реализацию =)
(17)
мля... =) ВыбратьСтроки() это для записываемого документа а не найденного
20 miki
 
27.07.11
17:45
>>сравнивается с сохраняемым

афайк, к моменту проведения док _ужЕ записан_, так что твоя проверка на изменение кол-ва - фуфел.
21 Tatitutu
 
27.07.11
17:46
(16) ты сам себя слышишь ?

"(15) для чего это условие:
ищется этот-же документ, если он есть и проведен"

и эта процедура вызывается в документе при его записи ????

ты когда домой прийдешь - позвони с городского на сотовый себе и удостоверься что ты домой нормально дошел - поговори с собой.
22 monsterZE
 
27.07.11
17:49
(20) Не понял, почему?
(21) спасибо за коменты. =) больше не нужно, если не по делу.
23 miki
 
27.07.11
17:50
(19)сранивай всегда количество в доке с остаком и всё.

И ещё. Если будешь разрешать переделывать доки задним числом по-любому попадешь на некорректное заполнение витрины. Хоть двигай док на ТА, хоть не двигай.
24 miki
 
27.07.11
17:51
(22)потому что, чтобы провести док, его _сначала_ надо _записать_.
25 Tatitutu
 
27.07.11
17:52
(19)

чему изначально у тебя равна витрина
что это реквизит или переменная ?


ну смотри же сам, как еще намекать
было у тебя в документе
Бублики  54
стало    59

//теперь читай код
ВремТаб.ПолучитьСтрокуПоНомеру(стр);
Если ВремТаб.Количество<>Количество Тогда
//а если было 54 и осталось 54 чему равна Витрина

ПолныйОстаток=регОст.СводныйОстатокТовар,Склад,"ОстатокТовара");
Витрина=?(ПолныйОстаток-Количество+ВремТаб.Количество>0,0,1);
КонецЕсли;
26 monsterZE
 
27.07.11
17:52
(23) (24) или я чего-то не понимаю... =) или криво объясняю..
ща...
27 miki
 
27.07.11
17:57
(26)Объясняю: есть на остатке 1 баран. Ты проводишь док, в котором списываешь этого барана. Пусть, для простоты на ТА. В проведении сравниваешь с остаком. 1 не меньше1. Док провелся. Затем опять открываешь док. Ставишь, что баранов 2. По твоей логике на момент проведения у реквизита дока "Колиечство" будет старое значение "1"? И ты сможешь продать ужЕ двух баранов?
28 monsterZE
 
27.07.11
18:22
(25)
витрина, это реквизит тч расходника
витрина изначально=0, заполняется по вышеприведенной процедуре
и если количество в сохраненном и проведенном ранее документе не отличается от сохранаяемого сейчас, изменяться не должна.
если бублики изначально списали 54 (5 осталось)
а потом исправили на 59 и списали под ноль, должно подняться флажек витрина.
(26)
при проведении, я ничего не сравниваю. процедура вызывается при записи. как ты написал я вобще ничего не понял. =)
с остатками я ничего не сравниваю. сравниваются количества в старом (уже проведенном документе) и в новом, редактируемом. это один и тотже документ.
29 monsterZE
 
27.07.11
18:23
пардон не (26) а (27) =)
30 miki
 
27.07.11
18:28
а проглядел, показалось, что при проведении, сорри.
31 miki
 
27.07.11
18:32
но, всё равно:
>>если количество в сохраненном и проведенном ранее документе не отличается от сохранаяемого сейчас, изменяться не должна

повторю: остатки-то могли измениться?

и сравнивать лучше при проведении - тогда не придется заниматься лишней арифметикой, типа
ПолныйОстаток-Количество+ВремТаб.Количество
32 monsterZE
 
27.07.11
18:41
(31) да. изначально втыкал ее при проведении.. но по каким-то причинам отказался.. и переделал. уже не помню почему =(

вобщем, если правильно понял, стоит добавить в
#Записать? Провести? Закрыть
#Записать? Провести(3)? Закрыть

зы. код может и бред, но приходится подстраиваться под механизм формировавшийся годами.. который не просто изменить. =((
AdBlock убивает бесплатный контент. 1Сергей