Имя: Пароль:
1C
1С v8
Продажа самого дорогого по приходу товара
0 Klern
 
14.04.15
17:01
Добрый день!
Помогите, пожалуйста, решить задачу: Организация закупает один и тот же товар у разных поставщиков по разным ценам. Продажа осуществляется сначала самого дорогого по приходу товара, затем менее дорогого и.т.д.

У меня уже есть:
!Справочники: Контрагент(Наименование,Код) и Номенклатура(Наименование,Код,Цена,Поставщик)
!Документы: Покупка товара(Реквизиты:Итог; ТЧ_Товары:Номенклатура,Цена,Количество, Сумма, Контрагент) и Продажа товара(Реквизиты:Итог; ТЧ_Товары:Номенклатура,Цена,Количество, Сумма, Контрагент)
!Регистры сведений: ЦеныНоменклатуры(Измерения:Номенклатура,Контрагент; Ресурсы:Цена)
!Регистры накопления:Покупки(Измерения:Номенклатура,Контрагент; Ресурсы:Количство, Сумма)


Я реализовала закупку товара.
Теперь осталась вторая часть задачи: Продажа осуществляется сначала самого дорогого по приходу товара, затем менее дорогого и.т.д. Как это сделать?
1 ДенисЧ
 
14.04.15
17:03
получить все остатки, отсортировать по цене, продавать
2 Klern
 
14.04.15
17:04
ДенисЧ, а можете подсказать код?
3 PR
 
14.04.15
17:19
(2) Мда
4 Klern
 
14.04.15
17:25
PR, может быть Вы мне подскажите, что искать или приведете пример кода?
5 vicof
 
14.04.15
17:26
(4) Без фото топлесс здесь не помогают
6 PR
 
14.04.15
17:28
(4) Разделить по разным товарам для начала. А лучше по характеристикам.
Иначе придется ипаться с сериями, а это ни разу не комильфо.
7 Klern
 
14.04.15
17:30
(5) смешно!
Надеюсь, здесь не все такие, как Вы. А есть люди, которым не сложно подсказать новичку.
8 pessok
 
14.04.15
17:31
(7) ой, зря :D
9 pessok
 
14.04.15
17:32
просто тут не любят вопросы - дайте код. сначала надо попробовать что-то сделать самой
10 Klern
 
14.04.15
17:33
pessok, спасибо, учту!
11 PR
 
14.04.15
17:34
(9) Ну почему же. Можно и просто фотку топлесс.
12 MiniMuk
 
14.04.15
17:36
(0) А зачем она покупает по разным ценам?
А вот скажите мы купили батарейку дюрасал у васи пети коли
по 20-30 и 40р. свалили их в ящик, как продать саму дарагую то?
13 Drac0
 
14.04.15
17:36
(0) В текущих объектах вы корректно задачу не решите. Продал вам ООО Пупкин ручки по 1 рублю ,а через день по полтора рубля еще раз поставил. Как мы будете списывать?
14 asdfg13
 
14.04.15
17:39
(13) Чего пристал к девушке, ей сказали, она и делает)))
15 Drac0
 
14.04.15
17:39
(14) Да это, наверное, учебное задание в ВУЗЕ или техникуме.
16 MiniMuk
 
14.04.15
17:43
(14) давай надеяться что делает фото...
17 asdfg13
 
14.04.15
17:43
(15) печаль, если такие задачи в вузе ставят ((
18 pessok
 
14.04.15
17:43
(15) на самом деле на спеце по платформе есть задача на свой механизм партионки
19 asdfg13
 
14.04.15
17:44
(17) тут топлес уже не отделается))))
20 pessok
 
14.04.15
17:45
мужики, ну что за веснец :) я вот кушать хочу! (0) давай фотки борща)
21 Drac0
 
14.04.15
17:51
(17) нормально учебное задание, ИМХО.
22 bolobol
 
14.04.15
17:51
Остатки по партиям получать надобно, с детализацией до исходных значений, т.к. сама цена нигде не хранится. Разделив в исходных данных сумму на количество - получим цену и сортируем по ней - списываем нужное.

Подпиской, естественно, заменять движения, чтобы в конфу не лезть. Итого - двойное проведение будет.
23 shulerr
 
14.04.15
18:01
(0) они обычно ржут первые 20-30 постов и скоро перестанут. Потом еще постов 10 буду говорить, что тебе это не надо. Пока все это происходит, ты задание сюда выложи
24 bolobol
 
14.04.15
18:05
(23) Как говорил Билли Клинтон: "Эта женщина...", "С этой женщиной...", "Эту женщину..." - мол, не имеет к ней никакого отношения))
25 asdfg13
 
14.04.15
18:05
(22) Оприходовали, но не переместили на продажу, или оприходовали и частично переместили, списали не на продажу, ........... - кажется гемор получается.
26 bolobol
 
14.04.15
18:15
(25) Да ну не - партия - она одна, исходная. Как бы не перемещали.
27 Serginio1
 
14.04.15
18:29
Здесь есть пример универсального списания партий с сортировкой по нужным критериям
http://infostart.ru/public/345658/
28 Drac0
 
14.04.15
23:17
Спугнули девушку, грязные извращенцы. Может гениального 1сника срубили на корню.
29 Джинн
 
15.04.15
00:15
Очередной бред ларечников
30 shulerr
 
15.04.15
00:19
(29) ну теперь-то все точно узнали на сколько ты крут
31 Джинн
 
15.04.15
00:25
(30)  Нет, все в очередной раз убедились в тупости и жадности ...
32 shulerr
 
15.04.15
00:27
(31) чьей тупости и жадности, если не секрет?
33 Klern
 
15.04.15
18:28
(15) да,это лабораторная работа.
Для начала, я  хочу попробовать вытащить максимальную цену из регистра сведений и подставить ее в табличную часть "Товары" при продажи.

Я пыталась изменить вот этот код по возвращению цены, но не знаю как пользоваться функцией МаксимальноеЗначение и куда ее вообще здесь написать.


&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
    ТД = Элементы.Товары.ТекущиеДанные;
    ТД.Цена = ПолучитьЦенуНоменклатуры(ТД.Номенклатура,Объект.Дата);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьЦенуНоменклатуры(Номенклатура,ВыбДата)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ЦеныНоменклатурыСрезПоследних.Цена
|ИЗ
|    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
|    &ВыбДата,
|    Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних";

Запрос.УстановитьПараметр("ВыбДата", ВыбДата);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Возврат ВыборкаДетальныеЗаписи.Цена;
КонецЦикла;
Возврат 0;
КонецФункции
34 Гёдза
 
15.04.15
18:31
Напиши сначала просто любой партионный учет, потом уже прикручивай сортировку по ценам
35 Klern
 
16.04.15
15:27
Пытаюсь написать партионный учет
Вот часть кода при проведение документа Продажа товара:
"ВЫБРАТЬ
        |  Номенклатура,
        |  СУММА(Количество) КАК Количество,
        |  МИНИМУМ(НомерСтроки) КАК НомерСтроки
        |ПОМЕСТИТЬ ДокТЧ
        |ИЗ
        |    Документ.ПродажаТовара.Товары
        |ГДЕ
        |    Ссылка = &Ссылка
        |СГРУППИРОВАТЬ ПО Номенклатура
        |;
        |ВЫБРАТЬ
        |  Остатки.Партия,
        |  ДокТЧ.НомерСтроки,
        |  ДокТЧ.Номенклатура,
        |  ДокТЧ.Количество,
        |  ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
        |  ЕСТЬNULL(Остатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток
        |ИЗ
        |    ДокТЧ КАК ДокТЧ
        |
        |        ЛЕВОЕ СОЕДИНЕНИЕ
        |       РегистрНакопления.ОстаткиТоваров.Остатки(&МоментВремени,Номенклатура В(ВЫБРАТЬ Номенклатура ИЗ ДокТЧ КАК ДокТЧ)) КАК Остатки
        |        ПО ДокТЧ.Номенклатура = Остатки.Номенклатура
        |
        |УПОРЯДОЧИТЬ   ПО Партия.Дата ВОЗР
        |
        |ИТОГИ МИНИМУМ(Количество), МИНИМУМ(НомерСтроки)
        |ПО ДокТЧ.Номенклатура";

                    

    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    Запрос.УстановитьПараметр("Ссылка",Ссылка);

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

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

    Пока Выборка.Следующий() Цикл
    Если Выборка.Количество > Выборка.КоличествоОстаток  Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не хватает товара """ + Выборка.Номенклатура
            + """, из необходимых " +
            Выборка.Количество + " в наличие осталось только " +
            Выборка.КоличествоОстаток;
            Сообщение.Поле =  "Товары[" + (Выборка.НомерСтроки-1) + "].Количество";
            Сообщение.УстановитьДанные(ЭтотОбъект);
            Сообщение.Сообщить();
            
            Отказ = Истина;
            Движения.ОстаткиТоваров.Записывать = Ложь;
        КонецЕсли;
    КонецЦикла;    


При проведение документа ПродажаТовара  ругается на несовпадение типов: Операция сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов.
На отладке видно, что
Выборка.Количество - число
Выборка.КоличествоОстаток - Null
Что нужно исправить, чтобы типы стали одинаковыми?
36 Фрэнки
 
16.04.15
15:31
(20) топлесс фотка борща?! Оо
37 Фрэнки
 
16.04.15
15:37
(35) если я все правильно увидел, то в цикле у тебя первой строкой лезут итоги, в которых нет значения в поле КоличествоОстаток. Может итоги в таком запросе и даром не нужны?
38 Фрэнки
 
16.04.15
15:44
(33) А этот код тоже не совсем понятно... Регистр ЦеныНоменклатуры по каким измерениям хранит значения ресурса Цена? Измерение Партия есть? Если есть, то его надо добавить в запрос и отсортировать по убыванию цены Партии.

Вообще по условию немного не понятно, о каких размерах Партий идет речь: по одной штучке товара в каждой партии? Если по одной то понятно. И возврат максимальной цены можно попробовать сделать функцией в запросе Максимум. Хотя я традиционалист и поставил бы сортировку и выборку из результатов запроса первой строчки.
39 Klern
 
16.04.15
15:49
(38) я сегодня первый раз пробовала писать партионный учет, и возможно итоги там действительно лишние. Я делала, опираясь на http://www.youtube.com/watch?v=_oOSo3oxgms
40 Klern
 
16.04.15
15:52
Измерение Партия у меня есть только в РегистрыНакопления.ОстаткиТоваров (Тип_ДокументСсылка.ПокупкаТовара)
41 Фрэнки
 
16.04.15
15:54
(39) Да я ж не против - пробуют все когда-то первый раз.
Для первого раза это очень замечательный результат.

Просто думаю, что ошибка с выборкой значения NULL возможна там только в строчке с итогами. Потому что во всем другом все внешне в этом запросе правильно (ЕстьNull как раз подставляет числа и не давала бы ошибки).

Без измерения Партия разную цену одной и той же номенклатуре хранить в регистре сведений не получается.
42 Drac0
 
16.04.15
15:56
(33) Так ты хочешь научиться или чтобы за тебя сделали? Если первое, то пиши на почту, помогу, чем смогу. Но вот ни строчки кода писать не буду :)
43 Serginio1
 
16.04.15
15:57
(40) Вот посмотри универсальныую процедуру по списанию партий http://files.rsdn.ru/19608/SpisaniePartiy.zip
44 Klern
 
16.04.15
16:58
(41) я добавила в РегистрыСведений.ЦеныНоменклатуры Измерение Партия(Тип_Тип_ДокументСсылка.ПокупкаТовара) и настроила движение.

При покупке товара я сама ввожу Номенклатуру(из СправочникаНоменклатура), Контрагента(из СправочникаКонтрагент), Цену, Количество и Сумма считается автоматически при изменение количества.
В регистрах ЦеныНомонклатуры и ОстаткиТоваров все верно отображается.


Хочу настроить покупку товара.
Мне нахождение Максимум по цене писать в процедуре ОбработкаПроведения?Или НоменклатураПриИзменении в модуле ФормыДокумента?
45 Klern
 
16.04.15
17:12
(41) а еще попробовала удалить строчки
|ИТОГИ МИНИМУМ(Количество), МИНИМУМ(НомерСтроки)
|ПО ДокТЧ.Номенклатура";

Ошибки больше не было и документ провелся, хотя должен был вывести ошибку, так как я ввела намного больше товара, чем у меня есть
46 icrocodile
 
16.04.15
17:51
(45)
|ИТОГИ МИНИМУМ(Количество), МИНИМУМ(НомерСтроки), Сумма(КоличествоОстаток), Сумма(СуммаОстаток)

и обход выборки по детальным записям я не вижу
47 Serginio1
 
16.04.15
18:17
(45) А чем тебе 43 не понравился?
48 Klern
 
16.04.15
18:53
(47) я не знаю как его открыть(
49 Serginio1
 
16.04.15
19:00
(48) он в зипе. Там внешний отчет
50 Klern
 
16.04.15
19:26
Я распаковала и открываю через конфигуратор
ГлавноеМеню-Файл-Открыть-Выбираю документ
Появляется пустая  форма
51 Klern
 
16.04.15
19:35
(46) вот продолжение кода
Если Отказ Тогда
            Возврат;
        КонецЕсли;

    Выборка.Сбросить();
    
    Пока Выборка.Следующий() Цикл
        
         ОсталосьСписать = Выборка.Количество;
        
         ВыборкаПартии = Выборка.Выбрать();
         Пока ВыборкаПартии.Следующий() И ОсталосьСписать <> 0 Цикл
            
             Списать = Мин (ОсталосьСписать, ВыборкаПартии.КоличествоОстаток);
             Себестоимость = Списать/ ВыборкаПартии.КоличествоОстаток * ВыборкаПартии.СтоимостьОстаток;
             Движение =Движения.ОстаткиТоваров.ДобавитьРасход();
             Движение.Период        = Дата;
             Движение.Номенклатура  = Выборка.Номенклатура;
             Движение.Количество    = Списать;
             Движение.Стоимость     = Себестоимость;
             Движение.Партия        = ВыборкаПартии.Партия;
            
             ОсталосьСписать = ОсталосьСписать - Списать;
         КонецЦикла;

    КонецЦикла;
52 Klern
 
16.04.15
19:36
(46) ругается при добавление Вашей строчки, что не найдено поле СуммаОстаток
53 Фрэнки
 
16.04.15
19:44
(52) дык, в твоем запросе это не СуммаОстаток, а СтоимостьОстаток
54 Klern
 
16.04.15
21:25
Ура! Заработало! Спасибо)

Теперь осталось вытащить максимальную цену продажи)
55 Serginio1
 
17.04.15
10:28
(49) Ты код смотри. Там сделано под конфигурации имеющие документ  РеализацияТоваровУслуг и регистр партии товаров.
Смысл в том, что нужно соединить данные с остатками отсртировать по нужным полям. Например

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