|
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)
Чтобы так сделать, нужно немного покопать. А чем не правилен мой вариант, на тестовой базе я его проверил, вроде результат то что и нужно получить. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |