|
ФИФО Ø (Волшебник 08.05.2018 16:47) | ☑ | ||
---|---|---|---|---|
0
skupidom
08.05.18
✎
09:12
|
Есть регистр накопления «Партии товаров» (остатки):
Измерения: Номенклатура,Партия. Ресурсы: Количество,Сумма. Самописный документ "Расходная накладная" должен делать списание партий по методу ФИФО. Все правильно написано: Процедура ОбработкаПроведения(Отказ,Режим) Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если ПеремКолвоКСписанию = 0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = ВыборкаПартия.Количество; Движение.Сумма = ВыборкаПартия.СуммаОстаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры |
|||
1
Fragster
гуру
08.05.18
✎
09:15
|
по крайней мере вывод ошибки не по БСПшному
|
|||
2
Fragster
гуру
08.05.18
✎
09:15
|
количество и сумма неправильно списываются
|
|||
3
Fragster
гуру
08.05.18
✎
09:15
|
да и вообще, запустить, да проверить
|
|||
4
Ненавижу 1С
гуру
08.05.18
✎
09:18
|
1. количество надо списывать необходимое, а не остаток партии
2. себестоимость списывать пропорционально списываемому количеству к общему остатку партии |
|||
5
rabbidX
08.05.18
✎
09:27
|
+ Блокировку данных бы добавить.
|
|||
6
Buster007
08.05.18
✎
09:29
|
так автор, вроде, утверждает, а не спрашивает... Что вы тут со своими советами?
|
|||
7
skupidom
08.05.18
✎
09:44
|
как это в коде правильно написать:
1. количество надо списывать необходимое, а не остаток партии 2. себестоимость списывать пропорционально списываемому количеству к общему остатку партии |
|||
8
DrShad
08.05.18
✎
09:48
|
а где момент документа?
|
|||
9
Ненавижу 1С
гуру
08.05.18
✎
09:49
|
(7)
1. списывать надо у тебя РезультатКол проверять, что прекратить списывать надо: Если РезультатКол=0 Тогда 2. Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Количество; |
|||
10
skupidom
08.05.18
✎
09:52
|
а количество?
|
|||
11
Ненавижу 1С
гуру
08.05.18
✎
09:53
|
(10) внимательно прочитал в (9)?
|
|||
12
Любопытная
08.05.18
✎
09:56
|
(0) Количество из ТЧ документа вообще не участвует в списании, т.е. что вы списываете - непонятно.
Остатки в запросе всегда получаются на текущий момент времени, т.е. при проведении документа задним числом списываться будут всё равно партии, актуальный на сейчас, а не на тогда. Это что - задача в институте? Или тест при приеме на работу? |
|||
13
DrShad
08.05.18
✎
09:58
|
а если его повторно провести вообще шикарно будет
|
|||
14
skupidom
08.05.18
✎
10:01
|
Процедура ОбработкаПроведения(Отказ,Режим)
Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); Если РезультатКол = 0 Тогда Продолжить; КонецЕсли; // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если ПеремКолвоКСписанию = 0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = РезультатКол; Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры |
|||
15
skupidom
08.05.18
✎
10:02
|
исправил
|
|||
16
DrShad
08.05.18
✎
10:03
|
(14) списывать нужно количество из документа, а не из партии
|
|||
17
Любопытная
08.05.18
✎
10:03
|
> ПеремКолвоКСписанию = ВыборкаНомен.Остаток; - вы списываете весь остаток товара, а не количество, указанное в ТЧ.
Или так и задумано? |
|||
18
Любопытная
08.05.18
✎
10:04
|
Есть же у Чистова расписанный алгоритм списания по партиям, там чуть не каждая строка прокомментирована, что и зачем делается
|
|||
19
skupidom
08.05.18
✎
10:09
|
||||
20
Ненавижу 1С
гуру
08.05.18
✎
10:10
|
(14) условие выхода из цикла не исправил
ну и предыдущие движения надо очистить и записать |
|||
21
skupidom
08.05.18
✎
10:13
|
Процедура ОбработкаПроведения(Отказ,Режим)
Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | И ПартииТоваровОстатки.Партия.Дата <= &ТекДата | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); Если РезультатКол = 0 Тогда Продолжить; КонецЕсли; // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если ПеремКолвоКСписанию = 0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = РезультатКол; Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры как правильно? что дописать? проверка на дату в запросе по документу списания правильная? |
|||
22
DrShad
08.05.18
✎
10:14
|
да выкинь ты его нафиг
|
|||
23
Любопытная
08.05.18
✎
10:15
|
Про параметры виртуальной таблицы не в курсе?
|
|||
24
Любопытная
08.05.18
✎
10:16
|
Вообще, зачем вам весь этот огород? Это во-первых.
А во-вторых, запустите и проверьте, правильно ли оно работает) |
|||
25
skupidom
08.05.18
✎
10:22
|
Процедура ОбработкаПроведения(Отказ,Режим)
Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); Если РезультатКол = 0 Тогда Продолжить; КонецЕсли; // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если ПеремКолвоКСписанию = 0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = РезультатКол; Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры |
|||
26
skupidom
08.05.18
✎
10:23
|
условие выхода из цикла не исправил
ну и предыдущие движения надо очистить и записать поправь пожалуйста; где это исправить нужно |
|||
27
skupidom
08.05.18
✎
10:42
|
Процедура ОбработкаПроведения(Отказ,Режим)
НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей(); НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка); НаборЗаписейПартииТоваров.Записать(); Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); Если РезультатКол = 0 Тогда Продолжить; КонецЕсли; // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если ПеремКолвоКСписанию = 0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = РезультатКол; Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры |
|||
28
skupidom
08.05.18
✎
10:43
|
подправил с очисткой движений,
где это: условие выхода из цикла не исправил ? |
|||
29
Любопытная
08.05.18
✎
10:43
|
Вы думаете, что если 100 раз скопипастить один и тот же текст, народ сдастся и признает, что это правильно?
|
|||
30
Ненавижу 1С
гуру
08.05.18
✎
10:45
|
(27)
вместо: Если ПеремКолвоКСписанию = 0 Тогда надо: Если РезультатКол=0 Тогда |
|||
31
skupidom
08.05.18
✎
10:49
|
еще нужно что-то исправить?
|
|||
32
skupidom
08.05.18
✎
10:49
|
Процедура ОбработкаПроведения(Отказ,Режим)
НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей(); НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка); НаборЗаписейПартииТоваров.Записать(); Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); Если РезультатКол = 0 Тогда Продолжить; КонецЕсли; // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если РезультатКол=0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = РезультатКол; Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры |
|||
33
skupidom
08.05.18
✎
10:50
|
спасибо (27)
|
|||
34
skupidom
08.05.18
✎
10:59
|
не вот так должно быть:
Процедура ОбработкаПроведения(Отказ,Режим) НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей(); НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка); НаборЗаписейПартииТоваров.Записать(); Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки(&ТекДата, ) КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ЗапросТоварыРасход.УстановитьПараметр("ТекДата",Дата); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); Если РезультатКол = 0 Тогда Продолжить; КонецЕсли; // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если ПеремКолвоКСписанию < 0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = РезультатКол; Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры |
|||
35
skupidom
08.05.18
✎
10:59
|
?
|
|||
36
Любопытная
08.05.18
✎
11:05
|
Вы всё еще списываете остатки в регистре, а не количество из ТЧ. Это нормально для вашей задачи?
Список номенклатуры тоже можно заложить в параметры виртуальной таблицы. Вместо даты лучше использовать момент времени документа. Дальше не вчитывалась, но просто я лично не люблю прерывания в тел цикла. Некрасиво это. Но это уже наверное дело вкуса. |
|||
37
skupidom
08.05.18
✎
11:14
|
Подскажите пожалуйста как мне правильно скорректировать списание,чтобы списывалось кол-во из тч документа и сделать условие на Момент времени документа ?
|
|||
38
Ненавижу 1С
гуру
08.05.18
✎
11:16
|
ах да...
вот это: ПеремКолвоКСписанию = ВыборкаНомен.Остаток; бред да надо брать из документа количество |
|||
39
skupidom
08.05.18
✎
11:17
|
с моментом времени сделал так:
Процедура ОбработкаПроведения(Отказ,Режим) НаборЗаписейПартииТоваров = РегистрыНакопления.ПартииТоваров.СоздатьНаборЗаписей(); НаборЗаписейПартииТоваров.Отбор.Регистратор.Установить(Ссылка); НаборЗаписейПартииТоваров.Записать(); Движения.ПартииТоваров.Записывать = Истина; ТЗТовары = Товары.Выгрузить(); ТЗТовары.Свернуть("Номенклатура","Количество,Сумма"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ПартииТоваровОстатки.Номенклатура КАК Номенклатура, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК Остаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки |ГДЕ | ПартииТоваровОстатки.Номенклатура В ИЕРАРХИИ(&СписокНомен) | |СГРУППИРОВАТЬ ПО | ПартииТоваровОстатки.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("СписокНомен",ТЗТовары.ВыгрузитьКолонку("Номенклатура")); ЗапросТоварыРасход.УстановитьПараметр("МоментВр",Ссылка.МоментВремени()); ВыборкаНомен = ЗапросТоварыРасход.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНомен.Следующий() Цикл ПеремКолвоКСписанию = ВыборкаНомен.Остаток; ВыборкаПартия = ВыборкаНомен.Выбрать(); Пока ВыборкаПартия.Следующий() Цикл ОстатокПартии = ВыборкаПартия.Остаток; РезультатКол = Мин(ПеремКолвоКСписанию,ОстатокПартии); Если РезультатКол = 0 Тогда Продолжить; КонецЕсли; // Списание ПеремКолвоКСписанию = ПеремКолвоКСписанию - РезультатКол; Если ПеремКолвоКСписанию < 0 Тогда Прервать; Иначе Движение = Движения.ПартииТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = ВыборкаПартия.Номенклатура; Движение.Партия = ВыборкаПартия.Партия; Движение.Количество = РезультатКол; Движение.Сумма = ВыборкаПартия.СуммаОстаток*РезультатКол/ВыборкаПартия.Остаток; КонецЕсли; КонецЦикла; // Партия <-- Если ПеремКолвоКСписанию <> 0 Тогда Отказ = Истина; ТекстСообщения = " Остатков номенклатуры " + ВыборкаНомен.Номенклатура + " не хватает " + ПеремКолвоКСписанию; Сообщить(ТекстСообщения,СтатусСообщения.Важное); КонецЕсли; КонецЦикла; // Номенклатура <-- КонецПроцедуры |
|||
40
skupidom
08.05.18
✎
11:17
|
как - надо брать из документа количество ?
|
|||
41
Любопытная
08.05.18
✎
11:17
|
(37) В запрос передавайте не список номенклатуры, а таблицу - номенклатура, количество.
Чтобы на выходе у вас была таблица Номенклатура, Количество к списанию, Остаток. Таким образом вы сможете контролировать, хватает ли у вас вообще остатков, а после уже списывать по партиям. |
|||
42
skupidom
08.05.18
✎
11:20
|
В запрос передавайте не список номенклатуры, а таблицу - номенклатура, количество - это сделать через временную таблицу?
|
|||
43
Любопытная
08.05.18
✎
11:23
|
Стаж 7 лет...
Всё, мне стало скучно, да и конфа обновилась. Дальше сама |
|||
44
Buster007
08.05.18
✎
11:29
|
Насколько я помню, в книге Радченко, по основам программирования, есть сквозной пример с фифо.
Еще есть пример задачи из экзамена на спеца по платформе с фифо. В общем в инете полно примеров. P.S. примеров на все случаи жизни в интернете нет. |
|||
45
skupidom
08.05.18
✎
12:14
|
ТЗТовары = Товары.Выгрузить();
ТЗТовары.Свернуть("Номенклатура","Количество"); ЗапросТоварыРасход = Новый Запрос; ЗапросТоварыРасход.Текст = "ВЫБРАТЬ | ВнешняяТаблицаНоменклатуры.Номенклатура КАК Номенклатура, | ВнешняяТаблицаНоменклатуры.Количество КАК Количество |ПОМЕСТИТЬ ВТТаблицаНоменклатуры |ИЗ | &ТЗ КАК ВнешняяТаблицаНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТТаблицаНоменклатуры.Номенклатура КАК Номенклатура, | ВТТаблицаНоменклатуры.Количество КАК Количество, | ПартииТоваровОстатки.Партия КАК Партия, | ПартииТоваровОстатки.КоличествоОстаток КАК КоличествоОстаток, | ПартииТоваровОстатки.СуммаОстаток КАК СуммаОстаток |ИЗ | ВТТаблицаНоменклатуры КАК ВТТаблицаНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки | ПО ВТТаблицаНоменклатуры.Номенклатура = ПартииТоваровОстатки.Номенклатура"; ЗапросТоварыРасход.УстановитьПараметр("ТЗ",ТЗТовары); ЗапросТоварыРасход.УстановитьПараметр("МоментВр",Ссылка.МоментВремени()); |
|||
46
skupidom
08.05.18
✎
12:15
|
правильно ?
|
|||
47
DrShad
08.05.18
✎
12:15
|
(46) нет
|
|||
48
skupidom
08.05.18
✎
12:17
|
в чем ошибся?
|
|||
49
Ненавижу 1С
гуру
08.05.18
✎
12:18
|
ну нельзя же вот так кодить онлайн
|
|||
50
skupidom
08.05.18
✎
12:19
|
я понимаю,но надо правильно составить запрос..
|
|||
51
DrShad
08.05.18
✎
12:19
|
ВТ неправильно собрал
забываешь о характеристике, серии, качестве и складе |
|||
52
Ненавижу 1С
гуру
08.05.18
✎
12:22
|
(51) согласно описанию в (0) нет таких измерений
|
|||
53
skupidom
08.05.18
✎
12:24
|
таблица примитивна, этого: характеристике, серии, качестве и складе - нет
|
|||
54
Fragster
гуру
08.05.18
✎
12:24
|
странно, в (48) мужской род, а в личной карточке - женский...
|
|||
55
triviumfan
08.05.18
✎
12:27
|
(54) транс
|
|||
56
Fragster
гуру
08.05.18
✎
12:29
|
||||
57
mistеr
08.05.18
✎
12:31
|
Бесплатный сервис коллективной отладки на Мисте. Волшебнику пора уже деньги брать с ленивых студентов.
|
|||
58
skupidom
08.05.18
✎
12:52
|
"ВЫБРАТЬ
| ВнешняяТаблицаНоменклатуры.Номенклатура КАК Номенклатура, | ВнешняяТаблицаНоменклатуры.Количество КАК Количество |ПОМЕСТИТЬ ВТТаблицаНоменклатуры |ИЗ | &ТЗ КАК ВнешняяТаблицаНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТТаблицаНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(ВТТаблицаНоменклатуры.Количество) КАК Количество, | ПартииТоваровОстатки.Партия КАК Партия, | СУММА(ПартииТоваровОстатки.КоличествоОстаток) КАК КоличествоОстаток, | СУММА(ПартииТоваровОстатки.СуммаОстаток) КАК СуммаОстаток |ИЗ | ВТТаблицаНоменклатуры КАК ВТТаблицаНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки(&МоментВр, ) КАК ПартииТоваровОстатки | ПО ВТТаблицаНоменклатуры.Номенклатура = ПартииТоваровОстатки.Номенклатура | |СГРУППИРОВАТЬ ПО | ВТТаблицаНоменклатуры.Номенклатура, | ПартииТоваровОстатки.Партия | |УПОРЯДОЧИТЬ ПО | ПартииТоваровОстатки.Партия.МоментВремени |ИТОГИ ПО | Номенклатура"; |
|||
59
skupidom
08.05.18
✎
12:52
|
что не так я делаю в запросе ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |