Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 07:50

Метод ФИФО, ЛИФО,

Автор Tanya_Lo, 16 авг 2013, 18:42

0 Пользователей и 1 гость просматривают эту тему.

Tanya_Lo

Есть задание такое :
•   При проведении документа "РасхНакл" необходимо обеспечить контроль наличия товара на складе, списание для одного товара в общем случае более одной партии товара по цене этих партий по одному из трех правил, в зависимости от установленного значения периодической константы "ПорядокСписания": "FIFO" (первой списывается партия, которая оприходована раньше других) \ "LIFO" (в обратном порядке) \ "вручную" (пользователь сам указывает партии, которые необходимо списать).

Подскажите есть где нибудь подробно как это реализовать? Может кинете ссылку на литературу ...... Надо разобраться срочно .....

boobzx

Ну я бы как сделал, или завел глобальную константу, где указывается по галочкам какой метод использовать, либо в самом документе сделал перечисление состоящее из 3 методов, и далее в процедуре проведения документа, уже завел бы 3 процедуры и в зависимости от условий код. Ниже я представлю код, по фифо с учетом не только номенклатуры, но и также если у номенклатуры есть характеристика, получается обходит нужно 2 группировки.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| ЕСТЬNULL(ВложенныйЗапрос.Количество, 0) КАК Количество,
| ВложенныйЗапрос.Характеристика КАК Характеристика,
| ОстаткиТовараОстатки.Товар КАК ФактТовар,
| ЕСТЬNULL(ОстаткиТовараОстатки.КоличествоОстаток, 0) КАК ФактКол,
| ЕСТЬNULL(ОстаткиТовараОстатки.СуммаОстаток, 0) КАК ФактСум,
| ОстаткиТовараОстатки.Партия КАК Партия,
| ОстаткиТовараОстатки.Подразделение КАК Подразделение,
| ОстаткиТовараОстатки.ХарактеристикаТовара КАК ХарактеристикаТовара,
| ОстаткиТовараОстатки.Организация
|ИЗ
| (ВЫБРАТЬ
| СписаниеТовары.Товар КАК Товар,
| СУММА(СписаниеТовары.Количество) КАК Количество,
| СписаниеТовары.Характеристика КАК Характеристика
| ИЗ
| Документ.Списание.Товары КАК СписаниеТовары
| ГДЕ
| СписаниеТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| СписаниеТовары.Товар,
| СписаниеТовары.Характеристика) КАК ВложенныйЗапрос
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТовара.Остатки(
| &МоментВремени,
| Товар В (&СписокНоменклатуры)
| И Подразделение В (&Подразделение)
| И Организация В (&Организация)) КАК ОстаткиТовараОстатки
| ПО ВложенныйЗапрос.Товар = ОстаткиТовараОстатки.Товар
| И ВложенныйЗапрос.Характеристика = ОстаткиТовараОстатки.ХарактеристикаТовара
|
|ДЛЯ ИЗМЕНЕНИЯ
| РегистрНакопления.ОстаткиТовара.Остатки
|
|УПОРЯДОЧИТЬ ПО
| Товар,
| ОстаткиТовараОстатки.Партия.Дата
|ИТОГИ
| МИНИМУМ(Количество),
| СУММА(ФактКол)
|ПО
| Товар,
| Характеристика";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "Списание", ВидДокумента);
//СписокНоменклатуры
ТЗ = Товары.Выгрузить();
ТЗ.Свернуть("Товар","");

// Параметры запроса
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени);
Запрос.УстановитьПараметр("СписокНоменклатуры", ТЗ);
Запрос.УстановитьПараметр("Подразделение", Подразделение);
Запрос.УстановитьПараметр("Организация", Организация);

Результат = Запрос.Выполнить();

Движения.ОстаткиТовара.Очистить();

ХватаетКоличества = Истина;
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);    //ОбходРезультатаЗапроса.ПоГруппировкам   (Этот комент нужно вставить прямо в скобки)
Пока Выборка.Следующий() Цикл

Выборка2 = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка2.Следующий() Цикл

Ном = Выборка2.Товар;
Кол = Выборка2.Количество;
ХарТов = Выборка2.Характеристика;
ФактКол = Выборка2.ФактКол; //обПроверкаНаNULL( Выборка.КоличествоОстаток );
Подр = Выборка2.Подразделение;                   
ХарТовВБаз = Выборка2.ХарактеристикаТовара;
Орг = Выборка2.Организация;

Попытка
Если Кол > ФактКол Тогда
ХватаетКоличества = Ложь;
Сообщить("Товар: """ + Ном + " - " + ХарТов + """ полностью списать невозможно. Списывается количество " + Мин(Кол) +
" с организации """ + Организация + """ и с подразделения """ + Подразделение + """, а в наличии " + Строка(ФактКол) +
" в организации """ + Организация + """ на подразделении """ + Подразделение + """");
Отказ = Истина;
КонецЕсли;
Исключение
Сообщить("В данной организации """ + Организация + """, на данном подразделении """ + Подразделение +
""" нет товара: """ + Ном + " - " + ХарТов + """");
Отказ = Истина;
ХватаетКоличества = Ложь;
КонецПопытки;


// просмотр результата запроса в ТЗ
//Результат.Выгрузить().ВыбратьСтроку("Контроль запроса по партиям");

НужноСписать = Кол;
Выборка3 = Выборка2.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка3.Следующий() Цикл

Если НужноСписать = 0 Тогда
Прервать;
КонецЕсли;

// данные выборки
Партия = Выборка3.Партия;
ФактКол = Выборка3.ФактКол; //обПроверкаНаNULL( Выборка2.КоличествоОстаток );
ФактСум = Выборка3.ФактСум; //обПроверкаНаNULL( Выборка2.СуммаОстаток );

// если нет остатка партии - нет смысла что-то делать
Если ФактКол = 0 Тогда
Продолжить;
КонецЕсли;

СпишемИзТекущейПартии = Мин(НужноСписать, ФактКол);
Если СпишемИзТекущейПартии = ФактКол Тогда
// чтобы из-за округления не "зависли" копейки
СуммаСписания = ФактСум;
Иначе
СуммаСписания = СпишемИзТекущейПартии * ( ФактСум / ФактКол );
КонецЕсли;

// регистр ОстаткиТовара Расход

Движение = Движения.ОстаткиТовара.Добавить();
Если ВидДокумента = "Списание" Тогда
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Организация = Организация;
Движение.Подразделение = Подразделение;
Движение.Товар = Выборка2.Товар;
Движение.ХарактеристикаТовара = Выборка2.Характеристика;
Движение.Партия = Партия;
Движение.Количество = СпишемИзТекущейПартии;
Движение.Сумма = СуммаСписания;

НужноСписать = НужноСписать - СпишемИзТекущейПартии;

ИначеЕсли ВидДокумента = "РеализацияТовара" Тогда

// регистр ОстаткиТовара Приход
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Организация = Организация;
Движение.Подразделение = Подразделение;
Движение.Товар = Выборка2.Товар;
Движение.ХарактеристикаТовара = Выборка2.Характеристика;
Движение.Партия = Партия;
Движение.Количество = СпишемИзТекущейПартии;
Движение.Сумма = СуммаСписания;

НужноСписать = НужноСписать - СпишемИзТекущейПартии;

ИначеЕсли ВидДокумента = "ПеремещениеТовара" Тогда

// регистр ОстаткиТовара Расход
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Организация = Организация;
Движение.Подразделение = Подразделение;
Движение.Товар = Выборка2.Товар;
Движение.ХарактеристикаТовара = Выборка2.Характеристика;
Движение.Партия = Партия;
Движение.Количество = СпишемИзТекущейПартии;
Движение.Сумма = СуммаСписания;

// регистр ОстаткиТовара Приход
Движение = Движения.ОстаткиТовара.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Организация = Организация;
Движение.Подразделение = ПодразделениеКуда;
Движение.Товар = Выборка2.Товар;
Движение.ХарактеристикаТовара = Выборка2.Характеристика;
Движение.Партия = Партия;
Движение.Количество = СпишемИзТекущейПартии;
Движение.Сумма = СуммаСписания;

ИначеЕсли ВидДокумента = "ЧекККМ" Тогда

// регистр ОстаткиТовара Приход
Если Ссылка.ТипЧека = Перечисления.ТипЧека.Продажа Тогда
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Иначе
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
КонецЕсли;
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Организация = Организация;
Движение.Подразделение = Подразделение;
Движение.Товар = Выборка2.Товар;
Движение.ХарактеристикаТовара = Выборка2.Характеристика;
Движение.Партия = Партия;
Движение.Количество = СпишемИзТекущейПартии;
Движение.Сумма = СуммаСписания;

НужноСписать = НужноСписать - СпишемИзТекущейПартии;

ИначеЕсли ВидДокумента = "ОтчетККМ" Тогда

// регистр ОстаткиТовара Расход

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Организация = Организация;
Движение.Подразделение = Подразделение;
Движение.Товар = Выборка2.Товар;
Движение.ХарактеристикаТовара = Выборка2.Характеристика;
Движение.Партия = Партия;
Движение.Количество = СпишемИзТекущейПартии;
Движение.Сумма = СуммаСписания;

НужноСписать = НужноСписать - СпишемИзТекущейПартии;

ИначеЕсли ВидДокумента = "ВозвратПоставщику" Тогда

// регистр ОстаткиТовара Расход

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Регистратор = Ссылка;
Движение.Организация = Организация;
Движение.Подразделение = Подразделение;
Движение.Товар = Выборка2.Товар;
Движение.ХарактеристикаТовара = Выборка2.Характеристика;
Движение.Партия = Партия;
Движение.Количество = СпишемИзТекущейПартии;
Движение.Сумма = СуммаСписания;

НужноСписать = НужноСписать - СпишемИзТекущейПартии;

КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецЦикла;

// анализ режима проведения документа
Проведем = Истина;
Если Режим = РежимПроведенияДокумента.Оперативный ИЛИ
Режим = РежимПроведенияДокумента.Неоперативный Тогда
Если ХватаетКоличества = Ложь Тогда
Проведем = Ложь;
КонецЕсли;
КонецЕсли;

Если Проведем Тогда
// записываем движения регистров
Движения.ОстаткиТовара.Записать();
Отказ = Ложь;

Возврат Отказ;
Иначе
Отказ = Истина;
Возврат Отказ;
КонецЕсли;


Ну примерно как-то так:)

GRADUS


Besart

вам Сюда и если вы не решали подобные задачи, то разобраться срочно не получится

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск