Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
14 Дек 2017, 22:09
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Метод ФИФО, ЛИФО,  (Прочитано 4809 раз)

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

Оффлайн Tanya_Lo

  • *
  • Сообщений: 37
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2013-07-19
  • Сайт: 
  • Профессия: Ученик 1С
Есть задание такое :
•   При проведении документа "РасхНакл” необходимо обеспечить контроль наличия товара на складе, списание для одного товара в общем случае более одной партии товара по цене этих партий по одному из трех правил, в зависимости от установленного значения периодической константы "ПорядокСписания”: "FIFO” (первой списывается партия, которая оприходована раньше других) \ "LIFO” (в обратном порядке) \ "вручную” (пользователь сам указывает партии, которые необходимо списать).

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


Оффлайн boobzx

  • ***
  • Сообщений: 124
  • РЕПУТАЦИЯ: 8
  • КПД: 6%
  • Регистрация: 2013-03-07
  • Сайт: 
  • Профессия: Ученик 1С
Ну я бы как сделал, или завел глобальную константу, где указывается по галочкам какой метод использовать, либо в самом документе сделал перечисление состоящее из 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

  • *****
  • Сообщений: 699
  • РЕПУТАЦИЯ: 51
  • КПД: 7%
  • Регистрация: 2013-06-08
  • Сайт: 
  • Профессия: Программист 1С
Беда-печаль.

Оффлайн Besart

  • *****
  • Сообщений: 678
  • РЕПУТАЦИЯ: 142
  • КПД: 21%
  • Регистрация: 2012-12-10
    • Skype: artfa.a
  • Компания: Фрилансер
  • Профессия: Программист 8.1
вам Сюда и если вы не решали подобные задачи, то разобраться срочно не получится


Теги:
 

Не работает метод Сдвинуть() по отношению к программно добавляемой колонке1С:Предприятие 8.3 (8.3.10.2561) Управление производственным предприятием, редакция 1.4 Приветствую, я добавляю программно свою колонку в методе ПриОткрытии() модуля формы, вот так

Автор InsiderРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 290
Последний ответ 21 Сен 2017, 10:33
от Insider
Метод "ВыбратьЭлемент"

Автор GunnerРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 1759
Последний ответ 24 Ноя 2015, 11:29
от Kironten
(Метод "Свойство" у структуры)

Автор GanG031Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 3
Просмотров: 1768
Последний ответ 05 Мар 2016, 13:30
от vitasw
"Свой метод" типа Свернуть

Автор beztrudРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 7
Просмотров: 4385
Последний ответ 17 Окт 2014, 12:44
от beztrud
Проблема "Метод объекта не обнаружен"

Автор aleks159Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 2299
Последний ответ 13 Дек 2016, 16:34
от aleks159

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
184 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
51 Сообщений
alex0402
50 Сообщений
andron81_81
40 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
34 Сообщений
BuhRust
30 Сообщений
Golickoff Golickoff
29 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 327
  • Точка Скрытых: 0
  • Точка Пользователей: 6
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal