Имя: Пароль:
1C
 
Установка цен на основании перемещения
,
0 itbchern
 
07.05.16
11:58
Здравстуйте
Необходимо иметь возможность делать установку цен на основании номенклатуры
Плюс к этому нужно иметь возможность учитывать стоимость доставки товаров
Пытаюсь реализовать следующее решение: выбирается документ перемещения, из него заполняется номенклатура в установке цен, добавляются цены (закупочная- на основании ПТиУ, себестоимость- закупочная + стоимость 1кг доставки * вес позиции, розничная- себестоимость + 30%)
Документ формируется, все цены встают, но при попытке его проведения ничего не происходит.
Кто может подсказать, в какую сторону копать?

Перем ДокументУстановкиЦен;
Перем ПредыдущаяЦена;
Перем МассивВидовЦен;
Перем ПроблемнаяПозиция;
Перем ТекстОшибки;

&НаСервере
Функция УстановитьЦеныНаСервере()
    ТекстОшибки = "";
    ПроблемнаяПозиция = "НОЛЬ";
    //Определение массива с видами цен
    МассивВидовЦен = Новый Массив(3);
    МассивВидовЦен[0] = Справочники.ВидыЦен.НайтиПоНаименованию("Закупочная");
    МассивВидовЦен[1] = Справочники.ВидыЦен.НайтиПоНаименованию("Себестоимость");
    МассивВидовЦен[2] = Справочники.ВидыЦен.НайтиПоНаименованию("Розничная");
    
    //Заполнение начальный реквизитов документа "Установка Цен Номенклатуры"
    ДокументУстановкиЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    ДокументУстановкиЦен.Дата = ТекущаяДата();
    ДокументУстановкиЦен.Ответственный = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя);
    ДокументУстановкиЦен.Комментарий = "Основание- " + ДокументПеремещения + " /// Создано обработкой <Установка себестоимости по перемещению>";
    
    //Добавление колонок с видами цен
    ДокументУстановкиЦен.ВидыЦен.Добавить();
    ДокументУстановкиЦен.ВидыЦен.Добавить();
    ДокументУстановкиЦен.ВидыЦен.Добавить();
    ДокументУстановкиЦен.ВидыЦен[0].ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Закупочная");
    ДокументУстановкиЦен.ВидыЦен[1].ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Себестоимость");
    ДокументУстановкиЦен.ВидыЦен[2].ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Розничная");
    
    Для Каждого СтрокаТабличнойЧасти Из ДокументПеремещения.Товары Цикл
        ПеремещеннаяПозиция = СтрокаТабличнойЧасти.Номенклатура;
        
        Если ПеремещеннаяПозиция.ВесЧислитель = 0 Тогда
            ПроблемнаяПозиция = ПеремещеннаяПозиция.Ссылка;
            ТекстОшибки = "Для номенклатуры """ + ПроблемнаяПозиция.Наименование + """ не указан вес!";
            Прервать;                
        Иначе
            ДобавитьПозициюНоменклатурыВТабличнуюЧасть(ПеремещеннаяПозиция);
        КонецЕсли;
    КонецЦикла;

    Если ПроблемнаяПозиция = "НОЛЬ" Тогда
        ДокументУстановкиЦен.Записать();
        фф = ДокументУстановкиЦен.Товары.Количество();
        ДокументУстановкиЦенСсылка = ДокументУстановкиЦен.Ссылка;
    Иначе
        Возврат ПроблемнаяПозиция;
    КонецЕсли;
    
    Возврат ДокументУстановкиЦен.Ссылка;
КонецФункции

&НаСервере
Процедура ДобавитьПозициюНоменклатурыВТабличнуюЧасть(ПозицияНоменклатуры)
    Товары = ДокументУстановкиЦен.Товары;
    
    Для счетчик = 0 По 2 Цикл
        
        ИндексПоследнейПозиции = Товары.Количество();
        
        Товары.Добавить();
        Товары[ИндексПоследнейПозиции].Номенклатура = ПозицияНоменклатуры;
        Товары[ИндексПоследнейПозиции].ВидЦены = МассивВидовЦен[счетчик];
        Товары[ИндексПоследнейПозиции].Цена = ПолучитьЦенуДляПозицииСВидомЦены(ПозицияНоменклатуры, МассивВидовЦен[счетчик]);
        
    КонецЦикла
    
КонецПроцедуры

&НаСервере
Функция ПолучитьЦенуДляПозицииСВидомЦены(ПозицияНоменклатуры, ВидЦены)
    Цена = 0;
    
    Если ВидЦены.Идентификатор = "Закупочная" Тогда
        
        НайтиЦену = Новый Запрос;
        НайтиЦену.Текст = "
        |ВЫБРАТЬ ПЕРВЫЕ 1
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних.Цена, РегистрСведений.ЦеныНоменклатуры.СрезПоследних.Упаковка
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних
        |ГДЕ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних.Номенклатура = &Номенклатура
        | И РегистрСведений.ЦеныНоменклатуры.СрезПоследних.ВидЦены = &ВидЦены";
    
        НайтиЦену.УстановитьПараметр("Номенклатура", ПозицияНоменклатуры);
        НайтиЦену.УстановитьПараметр("ВидЦены", ВидЦены.Ссылка);
        Выборка = НайтиЦену.Выполнить().Выбрать();
        
        Если Выборка.Следующий() Тогда
        
            КоэффициентУпаковки = 1;    
            Если Выборка.Упаковка.Числитель <> 0 Тогда
                КоэффициентУпаковки = Выборка.Упаковка.Числитель;        
            КонецЕсли;
            Цена = Выборка.Цена / КоэффициентУпаковки;
        
        Иначе
            Цена = 0;
        КонецЕсли;
        
    КонецЕсли;
    
    Если ВидЦены.Идентификатор = "Себестоимость" Тогда
        Цена = ПредыдущаяЦена + Стоимость1кг * ПозицияНоменклатуры.ВесЧислитель;
    КонецЕсли;
    
    Если ВидЦены.Идентификатор = "Розничная" Тогда
        Цена = Окр(ПредыдущаяЦена * 1.3, 1) + 0.1;
    КонецЕсли;
    
    ПредыдущаяЦена = Цена;
    
    Возврат Цена;
КонецФункции

&НаСервере
Функция ПолучитьНаименование(Номенклатура)
    Возврат Номенклатура.Наименование;
КонецФункции

&НаКлиенте
Процедура УстановитьЦены(Команда)
    ИтоговыйДокумент = УстановитьЦеныНаСервере();
    Если ТипЗнч(ИтоговыйДокумент) = Тип("СправочникСсылка.Номенклатура") Тогда
        Предупреждение("Для номенклатуры """ + ПолучитьНаименование(ИтоговыйДокумент) + """ не указан вес!");
    КонецЕсли;
    ОткрытьЗначение(ИтоговыйДокумент);
КонецПроцедуры

&НаКлиенте
Процедура Поле1ПриИзменении(Элемент)
    Если ЗначениеЗаполнено(Элементы.Поле1.Заголовок) Тогда
        Элементы.Кнопка1.Доступность = Истина;
    Иначе
        Элементы.Кнопка1.Доступность = Ложь;
    КонецЕсли;
КонецПроцедуры
1 itbchern
 
07.05.16
13:22
Конфигурация УТ 11.2.3.108
2 Звездец
 
07.05.16
13:27
чего то велосипед какой-то. Отражай затраты на перемещение на СС товаров, рассчитывай ее предварительно регламентом и делай установку цен с расчетом относительно СС. Весь функционал в УТ если мне не изменяет память есть.
3 itbchern
 
07.05.16
13:43
(2) Так сначала и хотел сделать, но натолкнулся на 2 проблемы
1) Рассчет СС все равно время занимает, а при большом количестве накладных это может занимать значительное количество времени + иногда бывает нужно сразу же после создания перемещения делать установку цен. Ждать регламента не особо вариант, а обучать их вызывать рассчет- очень тяжелое и неблагодарное дело :)
2) Но если первый пункт еще хоть как-то правится, то второй пункт это вообще что-то особенное.
Допустим, пришел товар, 10р/шт, пришло 10 штук. Сумма документа 100р
Перемещаем весь товар на другой склад, создаем в дополнение ПТиУ, в котором указываем услугу "Доставка" и аналитика расходов- документ перемещения. Стоимость, например, 10р/шт. Отсюда себестоимость 1шт становится 20р.
В итоге у нас приход на 1 склад 10 штук, приход на второй склад тоже 10 штук. Суммарно 200р. При этом есть ещё доставка 100р. Отсюда 1С считает, что за 20 штук мы заплатили 300р. Отсюда себестоимость одной штуки- 15р.
Как-то так
Может причина и не совсем такая, но поведение программы, думаю, описал достаточно точно

Насчет обработки- да, не спорю, велосипед. Но велосипед, как ни странно, достаточно удобный. Все данные перед глазами- и закуп, и себестоимость, и розничная. Все можно подправлять и выставлять.
4 itbchern
 
07.05.16
13:45
(3) Про вторую ситуацию дополнение:
Рассчет себестоимости, само собой, перед проверкой цены, вызывал
И проведение партий товаров
И месяц закрывал
Себестоимость нормально так и не встала
5 Звездец
 
07.05.16
13:48
(3) а расход с первого склада куда у тебя пропал? Рекомендую разобраться в штатном механизме, а то ко всем прелестям УТ еще своих костылей наставишь вообще трындец будет
6 Звездец
 
07.05.16
13:49
а про создал перемещение и тут же установка нужна - бред, телепорт ты пока не изобрел, и пока товар перемещается расчет себестоимости сто раз закончится
7 itbchern
 
07.05.16
13:51
(5) Расход-то появился
Там итог следующий:
первый склад: приход-10, расход-10
второй склад: приход-10
Суммарный приход- 20

Я костыли-то и не хочу ставить, я внешнюю обратботку пишу, которая просто на основании перемещения сделает установку цен
А вместо рассчитываемой себестоимости я просто вид цен "Себестоимость" делаю, в цену которой стоимость доставка будет включена
8 Звездец
 
07.05.16
13:51
+(6) просто не усложняй себе жизнь. Если установкой цен и перемещением занимается один человек и просто сразу хочется делать оба дока, то облегчи ему труд, и выведи формирование установки цен в рег задание
9 Звездец
 
07.05.16
13:58
что-то я тебя не совсем понимаю. Я вижу так:

1. Расчет СС - штатно (если не работает, разберись почему)
2. Рассчет цен - штатно

Для заполнения установки цен списком товаров на основании перемещения доработай штатный ввод на основании, при этом все расчеты цены будут производиться штатными методами. А что бы там в СС были учтены все расходы и затраты вызывай 2 регламента: 1 рассчет СС и 2 после завершения 1 - формирование на основании перемещений установок цен
10 Звездец
 
07.05.16
13:58
при этом вся разработка сведется к минимуму кода, и тот связан будет исключительно к вызовам штатных методов
11 itbchern
 
07.05.16
17:45
(10) Я только за такие упрощения, но у меня себестоимость неправильно считается
У меня себестоимость следующая получается: приходная цена + (стоимость услуги "Доставка", накинутая на перемещение / количество перемещений товара)
Может быть я что-то делаю неправильно, но каждый раз после того, как я перемещаю товар и вызываю рассчет СС, то его себестоимость уменьшается
Я только из-за этого в костыли полез :)
12 Звездец
 
07.05.16
17:48
(11) то есть ты сделал перемещение и отразил стоимость доставки. Посчитал СС. Потом еще переместил и посчитал СС. Так? а кто доставку второго перемещения будет отражать?
13 itbchern
 
07.05.16
18:04
(12) В двух словах, присутствует следующая схема:

Товар копится на одном складе (допустим, Транзитный). на этот склад товар попадает через ПТиУ
Потом силами перевозчиков едет в другой город на другой склад (допустим, Основной)
И из того города своими силами развозится по торговым точкам в том же городе

Стоимость перемещения учитывается только при перевозке с Транзитного склада на Основной, потому что только там стоимость доставки значительная (может быть даже больше закупочной цены)
От Основного склада до торговых изменение стоимости незначительное, поэтому не учитываем
14 itbchern
 
07.05.16
18:06
(12) я, если что, уже решил проблему с обработкой- статус документа поставил "Согласовано"- и все заработало (сравнивал свой документ и документ, созданный штатными средствами через выгрузку в XML и нашел расхождение) :)
Но согласен, что это костыль и если получится решить проблему с СС, то, наверное, именно такой вариант и буду использовать
15 Звездец
 
07.05.16
18:09
(14) ты по всей видимости забываешь отражать часть затрат на доставку, вот и уменьшение происходит
AdBlock убивает бесплатный контент. 1Сергей