|
задача 1.33 | ☑ | ||
---|---|---|---|---|
0
wwwqwert2014
26.06.13
✎
11:00
|
Компания занимается оптовой торговлей. Для минимизации складских запасов закупки товаров происходят согласно предполагаемым продажам. Принят следующий порядок работы:
Поступает заказ покупателя (документ «Заказ покупателя»). На основании существующих заказов покупателей производится закупка оборудования у поставщика (документ «Приходная накладная»). После того, как оборудование поступило, оно может быть отгружено покупателю (документ «Расходная накладная»). При проведении документа «Приходная накладная» необходимо производить анализ неотгруженных товаров, заказанных покупателем. Поступивший товар распределяется но заказам покупателей, исхода из их хронологии (начиная с самого раннего и далее до самого последнего). В том случае, если товара закуплено больше, чем есть неотгруженных заказов покупателей, то избыток составляет «свободный остаток». Отгрузка оборудования по одному заказу покупателя может происходить несколькими документами «Расходная накладная». Следует считать, что оборудование по заказу будет отгружено полностью и отгрузка может происходить только на основании заказа. Себестоимость оборудования рассчитывается как средняя в рамках закупок под заказ покупателя. В первую очередь списывается товар, распределенный на текущий заказ. Если товара не хватает, то можно списать свободный остаток. Если же не хватает и его, то документ не должен проводиться. При закупке следует учитывать, что товар по заказу может быть уже отгружен из свободного остатка. Учет товаров в разрезе складов не ведется. Взгляните, пожалуйста, как я сделал ПриходнуюНакладную. Если я не ошибаюсь, у меня здесь есть ошибка. Проблема копеек. Стоимость везде так расчитывается ДвижениеОстаткиНоменклатуры.Стоимость = ВыборкаНоменклатура.Сумма * ДвижениеОстаткиНоменклатуры.Количество / ВыборкаНоменклатура.Количество; А это не совсем правильно. можете подсказать, как грамотно решить проблему копеек в рамках этой задачи? |
|||
1
Maxus43
26.06.13
✎
11:13
|
рекомендую убрать все лишние буквы, а оставить только последнюю часть, с примером цифр, и собственно задать вопрос. Читать такие простыни никто не будет
|
|||
2
wwwqwert2014
26.06.13
✎
11:14
|
Поступает заказ покупателя (документ «Заказ покупателя»). На основании существующих заказов покупателей производится закупка оборудования у поставщика (документ «Приходная накладная»).
При проведении документа «Приходная накладная» необходимо производить анализ неотгруженных товаров, заказанных покупателем. Поступивший товар распределяется но заказам покупателей, исхода из их хронологии (начиная с самого раннего и далее до самого последнего). В том случае, если товара закуплено больше, чем есть неотгруженных заказов покупателей, то избыток составляет «свободный остаток». |
|||
3
1Cv8_accepted
26.06.13
✎
11:15
|
(0) Себестоимость отражается при поступлении, например, так:
+ Количество: 3 шт + Сумма: 100 руб При списании же, допустим, трёх реализаций происходит следующее: 1) - Количество: 1 шт - Сумма: 100 / 3 = 33 руб 2) - Количество: 1 шт - Сумма: 67 / 2 = 33 руб 3) - Количество: 1 шт - Сумма: 34 / 1 = 34 руб ...Или объяснить? |
|||
4
wwwqwert2014
26.06.13
✎
11:15
|
Как правильно в данном случае решить проблему копеек? В моем примере она не решена.
Процедура ОбработкаПроведения(Отказ, Режим) //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура, | ПриходнаяНакладнаяСписокНоменклатуры.Количество, | ПриходнаяНакладнаяСписокНоменклатуры.Сумма |ПОМЕСТИТЬ ВТ_ТЧ |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ТЧ.Номенклатура КАК Номенклатура, | ВТ_ТЧ.Количество КАК Количество, | ВТ_ТЧ.Сумма КАК Сумма, | ЕСТЬNULL(ЗаказыПокупателейОстатки.ЗаказПокупателя, ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)) КАК ЗаказПокупателя, | ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ | ВТ_ТЧ КАК ВТ_ТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ_ТЧ.Номенклатура | ИЗ | ВТ_ТЧ КАК ВТ_ТЧ)) КАК ЗаказыПокупателейОстатки | ПО ВТ_ТЧ.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ЗаказыПокупателейОстатки.ЗаказПокупателя.МоментВремени |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // Вставить обработку выборки ВыборкаНоменклатура ОсталосьПриходовать = ВыборкаНоменклатура.Количество; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи ДвижениеЗаказыПокупателей = Движения.ЗаказыПокупателей.Добавить(); ДвижениеЗаказыПокупателей.ВидДвижения = ВидДвиженияНакопления.Расход; ДвижениеЗаказыПокупателей.Период = Дата; ДвижениеЗаказыПокупателей.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; ДвижениеЗаказыПокупателей.ЗаказПокупателя = ВыборкаДетальныеЗаписи.ЗаказПокупателя; ДвижениеОстаткиНоменклатуры = Движения.ОстаткиНоменклатуры.Добавить(); ДвижениеОстаткиНоменклатуры.ВидДвижения = ВидДвиженияНакопления.Приход; ДвижениеОстаткиНоменклатуры.Период = Дата; ДвижениеОстаткиНоменклатуры.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; ДвижениеОстаткиНоменклатуры.ЗаказПокупателя = ВыборкаДетальныеЗаписи.ЗаказПокупателя; Если ВыборкаДетальныеЗаписи.КоличествоОстаток >= ОсталосьПриходовать Тогда ДвижениеЗаказыПокупателей.Количество = ОсталосьПриходовать; ДвижениеОстаткиНоменклатуры.Количество = ОсталосьПриходовать; ДвижениеОстаткиНоменклатуры.Стоимость = ВыборкаНоменклатура.Сумма * ДвижениеОстаткиНоменклатуры.Количество / ВыборкаНоменклатура.Количество; ОсталосьПриходовать = 0; Иначе ДвижениеЗаказыПокупателей.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток; ДвижениеОстаткиНоменклатуры.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток; ДвижениеОстаткиНоменклатуры.Стоимость = ВыборкаНоменклатура.Сумма * ДвижениеОстаткиНоменклатуры.Количество / ВыборкаНоменклатура.Количество; ОсталосьПриходовать = ОсталосьПриходовать - ВыборкаДетальныеЗаписи.КоличествоОстаток; КонецЕсли; Если ОсталосьПриходовать = 0 Тогда Продолжить; КонецЕсли; КонецЦикла; //запись в свободные остатки Если ОсталосьПриходовать > 0 Тогда ДвижениеОстаткиНоменклатуры = Движения.ОстаткиНоменклатуры.Добавить(); ДвижениеОстаткиНоменклатуры.ВидДвижения = ВидДвиженияНакопления.Приход; ДвижениеОстаткиНоменклатуры.Период = Дата; ДвижениеОстаткиНоменклатуры.Номенклатура = ВыборкаНоменклатура.Номенклатура; ДвижениеОстаткиНоменклатуры.ЗаказПокупателя = Документы.ЗаказПокупателя.ПустаяСсылка(); ДвижениеОстаткиНоменклатуры.Количество = ОсталосьПриходовать; ДвижениеОстаткиНоменклатуры.Стоимость = ВыборкаНоменклатура.Сумма * ДвижениеОстаткиНоменклатуры.Количество / ВыборкаНоменклатура.Количество; КонецЕсли; КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; // регистр ЗаказыПокупателей Расход Движения.ЗаказыПокупателей.Записывать = Истина; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры |
|||
5
wwwqwert2014
26.06.13
✎
11:16
|
(3) если не трудно, прокомментируй поодробнее
|
|||
6
wwwqwert2014
26.06.13
✎
11:17
|
Со списанием понятно как делать, не совсем понятно как с ЗАПИСЫВАНИЕМ
|
|||
7
1Cv8_accepted
26.06.13
✎
11:17
|
(5) Списывается сумма СЕБЕСТОИМОСТИ ОСТАТКОВ, который рассчитывается как (вся сумма) / (всё количество).
|
|||
8
wwwqwert2014
26.06.13
✎
11:20
|
то есть, по заказу 1 необходимо 3 ручки. но в приходной накладной пользователь указал 7 ручек со стоимостью 100 рублей.
Получается сначала 3 ручки надо запихнуть движением с указанием заказа, а потом оставшиеся 7 запихнуть в РН движением без указания заказа (в свободные остатки). Получается надо где-то хранить оставшуюся сумму, чтобы решить проблему копеек. Правильно? |
|||
9
wwwqwert2014
26.06.13
✎
11:25
|
вот как-то так. теперь нормально решена проблема коппек, как вы думаете?
Процедура ОбработкаПроведения(Отказ, Режим) //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура, | ПриходнаяНакладнаяСписокНоменклатуры.Количество, | ПриходнаяНакладнаяСписокНоменклатуры.Сумма |ПОМЕСТИТЬ ВТ_ТЧ |ИЗ | Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры |ГДЕ | ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ТЧ.Номенклатура КАК Номенклатура, | ВТ_ТЧ.Количество КАК Количество, | ВТ_ТЧ.Сумма КАК Сумма, | ЕСТЬNULL(ЗаказыПокупателейОстатки.ЗаказПокупателя, ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)) КАК ЗаказПокупателя, | ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток |ИЗ | ВТ_ТЧ КАК ВТ_ТЧ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки( | &МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ_ТЧ.Номенклатура | ИЗ | ВТ_ТЧ КАК ВТ_ТЧ)) КАК ЗаказыПокупателейОстатки | ПО ВТ_ТЧ.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ЗаказыПокупателейОстатки.ЗаказПокупателя.МоментВремени |ИТОГИ | МАКСИМУМ(Количество), | МАКСИМУМ(Сумма), | СУММА(КоличествоОстаток) |ПО | Номенклатура"; Запрос.УстановитьПараметр("МоментВремени", МоментВремени()); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл // Вставить обработку выборки ВыборкаНоменклатура ОсталосьПриходовать = ВыборкаНоменклатура.Количество; ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать(); СуммаОсталосьСписать = ВыборкаНоменклатура.Сумма; СтоимостьЕдиницы = ВыборкаНоменклатура.Сумма / ВыборкаНоменклатура.Количество; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи ДвижениеЗаказыПокупателей = Движения.ЗаказыПокупателей.Добавить(); ДвижениеЗаказыПокупателей.ВидДвижения = ВидДвиженияНакопления.Расход; ДвижениеЗаказыПокупателей.Период = Дата; ДвижениеЗаказыПокупателей.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; ДвижениеЗаказыПокупателей.ЗаказПокупателя = ВыборкаДетальныеЗаписи.ЗаказПокупателя; ДвижениеОстаткиНоменклатуры = Движения.ОстаткиНоменклатуры.Добавить(); ДвижениеОстаткиНоменклатуры.ВидДвижения = ВидДвиженияНакопления.Приход; ДвижениеОстаткиНоменклатуры.Период = Дата; ДвижениеОстаткиНоменклатуры.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура; ДвижениеОстаткиНоменклатуры.ЗаказПокупателя = ВыборкаДетальныеЗаписи.ЗаказПокупателя; Если ВыборкаДетальныеЗаписи.КоличествоОстаток >= ОсталосьПриходовать Тогда ДвижениеЗаказыПокупателей.Количество = ОсталосьПриходовать; ДвижениеОстаткиНоменклатуры.Количество = ОсталосьПриходовать; ДвижениеОстаткиНоменклатуры.Стоимость = ВыборкаНоменклатура.Сумма * ДвижениеОстаткиНоменклатуры.Количество / ВыборкаНоменклатура.Количество; СуммаОсталосьСписать = ВыборкаНоменклатура.Сумма - ДвижениеОстаткиНоменклатуры.Стоимость; ОсталосьПриходовать = 0; Иначе ДвижениеЗаказыПокупателей.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток; ДвижениеОстаткиНоменклатуры.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток; ОсталосьПриходовать = ОсталосьПриходовать - ВыборкаДетальныеЗаписи.КоличествоОстаток; Если ОсталосьПриходовать <> 0 Тогда ДвижениеОстаткиНоменклатуры.Стоимость = ВыборкаНоменклатура.Сумма * ДвижениеОстаткиНоменклатуры.Количество / ВыборкаНоменклатура.Количество; СуммаОсталосьСписать = ВыборкаНоменклатура.Сумма - ДвижениеОстаткиНоменклатуры.Стоимость; Иначе ДвижениеОстаткиНоменклатуры.Стоимость = СуммаОсталосьСписать; СуммаОсталосьСписать = 0; КонецЕсли; КонецЕсли; Если ОсталосьПриходовать = 0 Тогда Продолжить; КонецЕсли; КонецЦикла; //запись в свободные остатки Если ОсталосьПриходовать > 0 Тогда ДвижениеОстаткиНоменклатуры = Движения.ОстаткиНоменклатуры.Добавить(); ДвижениеОстаткиНоменклатуры.ВидДвижения = ВидДвиженияНакопления.Приход; ДвижениеОстаткиНоменклатуры.Период = Дата; ДвижениеОстаткиНоменклатуры.Номенклатура = ВыборкаНоменклатура.Номенклатура; ДвижениеОстаткиНоменклатуры.ЗаказПокупателя = Документы.ЗаказПокупателя.ПустаяСсылка(); ДвижениеОстаткиНоменклатуры.Количество = ОсталосьПриходовать; ДвижениеОстаткиНоменклатуры.Стоимость = СуммаОсталосьСписать; КонецЕсли; КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // регистр ОстаткиНоменклатуры Приход Движения.ОстаткиНоменклатуры.Записывать = Истина; // регистр ЗаказыПокупателей Расход Движения.ЗаказыПокупателей.Записывать = Истина; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры |
|||
10
mzelensky
26.06.13
✎
11:29
|
(0) погляди любую видяшку от Чистого. Там объясняется как бороться с твоей проблемой.
|
|||
11
1Cv8_accepted
26.06.13
✎
11:29
|
(8) Оставшаяся сумма и количество товара хранить надо в регистре накопления. Не себестоимость за единицу (100 ни на 3, ни на 7 ровно не делится), а оставшееся количество и стоимость этого количества. И списывать по мере сбыта.
|
|||
12
mzelensky
26.06.13
✎
11:30
|
(9) ты бы еще выгрузил тексты типовой и скопипастил сюда. Зачем сток лишнего...
|
|||
13
mzelensky
26.06.13
✎
11:32
|
(9) ты забыл :
1) Сверни временную таблицу по товару (сгруппируй) 2) Сделай индексацию по соединяемым полям (они это любят) 3) Вот это: Номенклатура В | (ВЫБРАТЬ | ВТ_ТЧ.Номенклатура | ИЗ | ВТ_ТЧ КАК ВТ_ТЧ) Нужно заменить на Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ВТ_ТЧ.Номенклатура | ИЗ | ВТ_ТЧ КАК ВТ_ТЧ) |
|||
14
mzelensky
26.06.13
✎
11:34
|
(14) вместо
Если ОсталосьПриходовать = 0 Тогда Продолжить; КонецЕсли; нужно Если ОсталосьПриходовать = 0 Тогда ПРЕРВАТЬ; КонецЕсли; |
|||
15
mzelensky
26.06.13
✎
11:37
|
(9) в общем косяков в блоке формирования движений тоже хватает. Так что лучший тебе совет -> (10).
Там все доходчиво объясняется. |
|||
16
wwwqwert2014
26.06.13
✎
11:37
|
3) Вот это:
Номенклатура В | (ВЫБРАТЬ | ВТ_ТЧ.Номенклатура | ИЗ | ВТ_ТЧ КАК ВТ_ТЧ) Нужно заменить на Номенклатура В | (ВЫБРАТЬ РАЗЛИЧНЫЕ | ВТ_ТЧ.Номенклатура | ИЗ | ВТ_ТЧ КАК ВТ_ТЧ) Это для оптимизации? |
|||
17
alexkr
26.06.13
✎
11:37
|
(0) учите сначала матчасть...
|
|||
18
alexkr
26.06.13
✎
11:38
|
(0) ну и кроме того, в типовых конфах, со списанием себестоимости проблем фроде как не наюлюдается
|
|||
19
mzelensky
26.06.13
✎
11:39
|
(16) Да. А в твоем случае чтобы баллы не снимали.
|
|||
20
GROOVY
26.06.13
✎
11:54
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |