Имя: Пароль:
1C
1C 7.7
v7: Обработка минусовых остаков
,
0 manatin
 
08.11.12
11:09
Доброго времени суток.
Прошу подсказки в таком вопросе:
Имеется РИБ с товарами, по которым осуществляется приход/расход, проблема в том что в нескольких периферийных базах по некоторым товарам наблюдается такая картина. Например есть товар "Яблоко" фактически которого есть в наличии 3 шт. 1 штука по одной партии и 2 по другой, а при просмотре регистра остатков по вышеуказанному товару можем наблюдать такую картину
Наименование       Партия      Кол-во
Яблоко             111111        1
Яблоко             111111        -1
Яблоко             111222        1
Яблоко             111223        2
Яблоко             111224        1
Яблоко             111224        -1

В сумме все равно получаем кол-во равное 3-м как и есть в реалии, вопрос том как можно победить перекрывающие записи. Для этого написал обработку (вернее документ) для расходования 1 и -1. Суть в том что при переборе всех остатков делаем сравнение текущей записи и предыдущей, если у них наименование и серия совпадают, но количество отличается на -, то добавляем эту информацию в ТЗ, а потом сравниваем еще одним перебором на наличие в ТЗ, если есть до расходуем.  Следующего содержания:
перем НомерСерии_пред;
перем Кол_пред;
перем Серия_пред;
перем ТЗ;  

Функция Очистка(Наим, НомСер, Кол) Далее

Процедура ОбработкаПроведения()
                             
     ТЗ = СоздатьОбъект("ТаблицаЗначений");
     ТЗ.НоваяКолонка("Наименование");
     ТЗ.НоваяКолонка("Серия");
     ТЗ.НоваяКолонка("Количество");
     Сч_ТЗ = 0;    
     
     рег = СоздатьОбъект("Регистр.ДоступныеОстатки");
     Рег.ВыбратьИтоги();                
     
     Пока Рег.ПолучитьИтог() =1 Цикл
         ПечСерт = "";
       СпрСертПарт = СоздатьОбъект("Справочник.СерииПартии");
       СпрСертПарт.ИспользоватьВладельца(Рег.Партия);
       СпрСертПарт.ВыбратьЭлементы();
       СпрСертПарт.ПолучитьЭлемент();
       НомерСерии    = СпрСертПарт.Серия.Наименование;  

       Если (НомерСерии=НомерСерии_пред) и (Рег.Количество = Кол_пред*(-1)) и (Серия_пред=НомерСерии) и (СтрДлина(Строка(НомерСерии))>0) Тогда
           Сч_ТЗ = Сч_ТЗ + 1;
           ТЗ.НоваяСтрока();
           ТЗ.УстановитьЗначение(Сч_ТЗ, "Наименование", Рег.Товар);
           ТЗ.УстановитьЗначение(Сч_ТЗ, "Серия", НомерСерии);
           ТЗ.УстановитьЗначение(Сч_ТЗ, "Количество", Рег.Количество);                      
         КонецЕсли;                    
       
         НомерСерии_пред = НомерСерии;
         Кол_пред = Рег.Количество;
         Серия_пред =НомерСерии;
   
     КонецЦикла;    
                 
     рег = СоздатьОбъект("Регистр.ДоступныеОстатки");
     Рег.ВыбратьИтоги();                
     
     Пока Рег.ПолучитьИтог() =1 Цикл
         ПечСерт = "";
       СпрСертПарт = СоздатьОбъект("Справочник.СерииПартии");
       СпрСертПарт.ИспользоватьВладельца(Рег.Партия);
       СпрСертПарт.ВыбратьЭлементы();
       СпрСертПарт.ПолучитьЭлемент();
       НомерСерии    = СпрСертПарт.Серия.Наименование;  

         а = Очистка(Рег.Товар, НомерСерии, Рег.Количество);
         
         Если (а=1) Тогда
           
           Регистр.ДоступныеОстатки.Товар = Рег.Товар;
             Регистр.ДоступныеОстатки.Партия = Рег.Партия;
             Регистр.ДоступныеОстатки.Отдел = Рег.Отдел;  
             Регистр.ДоступныеОстатки.Единицаизмерения = Рег.Единицаизмерения;
             Регистр.ДоступныеОстатки.Количество = Рег.Количество;  
             Регистр.ДоступныеОстатки.ДвижениеРасходВыполнить();
             
       КонецЕсли          

         
     КонецЦикла;      
     
     
КонецПроцедуры  
 
Функция Очистка (Наим, НомСер, Кол)                          
     ТЗ.ВыбратьСтроки();
     Сч_ТЗ=0;  
     Сч=0;
     Пока ТЗ.ПолучитьСТроку()=1 Цикл                    
         Сч_ТЗ = Сч_ТЗ + 1;
         ТЗ.ТекущаяСтрока(Сч_ТЗ);    
         Т = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(), "Наименование") ;
         С = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(), "Серия");  
         К = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(), "Количество");  
         Если (Т=Наим) и (С=НомСер) и (К=Кол) Тогда    
             Сч=1;    
         КонецЕсли;
     КонецЦикла;
     Возврат Сч;    
КонецФункции

Правилен ли ход мыслей и написанной обработки.
1 Lionee
 
08.11.12
11:20
свернуть партии и все
2 manatin
 
08.11.12
11:35
А по подробнее про это можно?
Моя реализация правильна или только сворачивать партии?
3 Ёпрст
 
08.11.12
11:40
(0) нет
4 Ёпрст
 
08.11.12
11:40
(2) нет
5 varelchik
 
08.11.12
12:05
А последовательность восстанавливать не пытались?
6 vcv
 
08.11.12
12:13
Может быть проще вообще не вести учет партий, чем вести его так? Нет партий, нет проблем с пересортом.
А по большому счету, у (0) наблюдается разруха в головах, которая техническими средствами не лечится.
7 dakrangel
 
08.11.12
12:27
(6) Очень даже хорошо лечится, при правильной настройке в документах.
8 vcv
 
08.11.12
12:41
(7)
Если для учета пофиг партии, нужно их просто не вести и не иметь проблем из-за пересорта партий.
Если партии важны, нужно натаскивать пользователей, а не мудрить всякие процедуры "автозамазывания проблем".
9 dakrangel
 
08.11.12
13:13
(8) не про автозамазывая имел ввиду. Вопрос в том, почему при выборе партий дает выбирать больше, чем есть на самом деле. Или почему при переносе даты документа нет сверки, как поведет себя система... и так далее.
10 vcv
 
08.11.12
13:30
(9) Почему больше? Сколько есть, столько и даёт. Если есть по партии (или может по складу) 10 штук, подбор и покажет 10 штук. А то, что по другой партии (складу/фирме и прочей аналитике) минус пять, так это не его подборово дело.
А контроль "как поведет себя система при переносе даты документа" очень специфичен для каждого клиента и сильно тормозит проведение документов. Вряд ли такое стоит делать типовым решением.
11 dakrangel
 
08.11.12
13:37
(10) Соглашусь. Как говориться, каждый извращается как хочет :)
12 manatin
 
08.11.12
14:24
(6)
Разруха в головах к счастью не у меня, я просто пытаюсь помоч решить проблему
13 manatin
 
08.11.12
14:26
(8)
Партии важны, а по натаскиванию, это не моя задача.
14 Boroda
 
08.11.12
14:36
Я б сделал так.
Выгружаем итоги.
Обнуляем все что получено по "ВыгрузитьИтоги".
Сворачиваем по партиям и делаем приход по свернутой ТЗ.
15 manatin
 
09.11.12
15:00
(14)
Чтобы так сделать, нужно немного покопать.
А чем не правилен мой вариант, на тестовой базе я его проверил, вроде результат то что и нужно получить.