Имя: Пароль:
1C
1С v8
УТ11: вид цены Себестоимость СКД
,
0 Mikhail Volkov
 
02.06.17
03:42
У клиента в УТ11.2 есть вид цены "Себестоимость", со способом задания "Произвольный запрос к данным ИБ", с СКД "Себестоимость без дополнительных расходов"

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Сегменты.Номенклатура,
    Сегменты.Характеристика,
    ИСТИНА КАК ИспользуетсяОтборПоСегментуНоменклатуры
ПОМЕСТИТЬ ОтборПоСегментуНоменклатуры
ИЗ
    РегистрСведений.НоменклатураСегмента КАК Сегменты
{ГДЕ
    Сегменты.Сегмент.* КАК СегментНоменклатуры,
    Сегменты.Номенклатура.* КАК Номенклатура,
    Сегменты.Характеристика.* КАК Характеристика}

ИНДЕКСИРОВАТЬ ПО
    Сегменты.Номенклатура,
    Сегменты.Характеристика,
    ИспользуетсяОтборПоСегментуНоменклатуры
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    НАЧАЛОПЕРИОДА(ДанныеДокумента.Ссылка.Дата, МЕСЯЦ) КАК ПериодМесяц,
    ДанныеДокумента.Организация КАК Организация,
    ДанныеДокумента.Ссылка.ПредварительныйРасчет КАК ПредварительныйРасчет
ПОМЕСТИТЬ РасчетыСебестоимости
ИЗ
    Документ.РасчетСебестоимостиТоваров.Организации КАК ДанныеДокумента
ГДЕ
    ДанныеДокумента.Ссылка.Проведен
    И ДанныеДокумента.Ссылка.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаДокумента, МЕСЯЦ) И КОНЕЦПЕРИОДА(&ДатаДокумента, МЕСЯЦ)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    1 КАК Коэффициент,
    ВЫБОР
        КОГДА СУММА(СебестоимостьТоваров.Количество) > 0
            ТОГДА ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.Стоимость) / СУММА(СебестоимостьТоваров.Количество) КАК ЧИСЛО(15, 2))
        ИНАЧЕ 0
    КОНЕЦ КАК Цена,
    СебестоимостьТоваров.Номенклатура КАК Номенклатура,
    СебестоимостьТоваров.Характеристика КАК Характеристика,
    ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка) КАК Упаковка,
    Константы.ВалютаУправленческогоУчета КАК Валюта
{ВЫБРАТЬ
    Коэффициент,
    Цена,
    Номенклатура.*,
    Характеристика.*,
    Упаковка.*,
    Валюта.*}
ИЗ
    (ВЫБРАТЬ
        АналитикаНоменклатуры.Номенклатура КАК Номенклатура,
        АналитикаНоменклатуры.Характеристика КАК Характеристика,
        СУММА(ВЫБОР
                КОГДА ЕСТЬNULL(РасчетыСебестоимости.ПредварительныйРасчет, ЛОЖЬ)
                    ТОГДА ВЫБОР
                            КОГДА ВидыЦен.ЦенаВключаетНДС
                                ТОГДА ЕСТЬNULL(СтоимостьНоменклатуры.Стоимость, 0)
                            ИНАЧЕ ЕСТЬNULL(СтоимостьНоменклатуры.СтоимостьБезНДС, 0)
                        КОНЕЦ * СебестоимостьТоваров.Количество
                ИНАЧЕ ВЫБОР
                        КОГДА ВидыЦен.ЦенаВключаетНДС
                            ТОГДА СебестоимостьТоваров.Стоимость
                        ИНАЧЕ СебестоимостьТоваров.СтоимостьБезНДС
                    КОНЕЦ
            КОНЕЦ) КАК Стоимость,
        СУММА(СебестоимостьТоваров.Количество) КАК Количество
    ИЗ
        РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК АналитикаНоменклатуры
            ПО СебестоимостьТоваров.АналитикаУчетаНоменклатуры = АналитикаНоменклатуры.КлючАналитики
            ЛЕВОЕ СОЕДИНЕНИЕ РасчетыСебестоимости КАК РасчетыСебестоимости
            ПО СебестоимостьТоваров.Организация = РасчетыСебестоимости.Организация
                И (НАЧАЛОПЕРИОДА(СебестоимостьТоваров.Период, МЕСЯЦ) = РасчетыСебестоимости.ПериодМесяц)
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтоимостьТоваров КАК СтоимостьНоменклатуры
            ПО СебестоимостьТоваров.АналитикаУчетаНоменклатуры = СтоимостьНоменклатуры.АналитикаУчетаНоменклатуры
                И СебестоимостьТоваров.Организация = СтоимостьНоменклатуры.Организация
                И СебестоимостьТоваров.ВидЗапасов = СтоимостьНоменклатуры.ВидЗапасов
                И (НАЧАЛОПЕРИОДА(СебестоимостьТоваров.Период, МЕСЯЦ) = СтоимостьНоменклатуры.Период)
                И (ЕСТЬNULL(РасчетыСебестоимости.ПредварительныйРасчет, ЛОЖЬ))
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыЦен КАК ВидыЦен
            ПО (ВидыЦен.Ссылка = &ВидЦены)
    ГДЕ
        СебестоимостьТоваров.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаДокумента, МЕСЯЦ) И КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ)
        И СебестоимостьТоваров.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
        И АналитикаНоменклатуры.Склад ССЫЛКА Справочник.Склады
    {ГДЕ
        ((АналитикаНоменклатуры.Номенклатура, АналитикаНоменклатуры.Характеристика) В
                (ВЫБРАТЬ
                    ОтборПоСегментуНоменклатуры.Номенклатура,
                    ОтборПоСегментуНоменклатуры.Характеристика
                ИЗ
                    ОтборПоСегментуНоменклатуры
                ГДЕ
                    ОтборПоСегментуНоменклатуры.ИспользуетсяОтборПоСегментуНоменклатуры = &ИспользуетсяОтборПоСегментуНоменклатуры))}
    
    СГРУППИРОВАТЬ ПО
        АналитикаНоменклатуры.Номенклатура,
        АналитикаНоменклатуры.Характеристика
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        АналитикаНоменклатуры.Номенклатура,
        АналитикаНоменклатуры.Характеристика,
        СУММА(ВЫБОР
                КОГДА ВидыЦен.ЦенаВключаетНДС
                    ТОГДА СебестоимостьТоваров.СтоимостьОстаток
                ИНАЧЕ СебестоимостьТоваров.СтоимостьБезНДСОстаток
            КОНЕЦ),
        СУММА(СебестоимостьТоваров.КоличествоОстаток)
    ИЗ
        РегистрНакопления.СебестоимостьТоваров.Остатки(НАЧАЛОПЕРИОДА(&ДатаДокумента, МЕСЯЦ), {((АналитикаУчетаНоменклатуры.Номенклатура, АналитикаУчетаНоменклатуры.Характеристика) В
                    (ВЫБРАТЬ
                        ОтборПоСегментуНоменклатуры.Номенклатура,
                        ОтборПоСегментуНоменклатуры.Характеристика
                    ИЗ
                        ОтборПоСегментуНоменклатуры
                    ГДЕ
                        ОтборПоСегментуНоменклатуры.ИспользуетсяОтборПоСегментуНоменклатуры = &ИспользуетсяОтборПоСегментуНоменклатуры))}) КАК СебестоимостьТоваров
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК АналитикаНоменклатуры
            ПО СебестоимостьТоваров.АналитикаУчетаНоменклатуры = АналитикаНоменклатуры.КлючАналитики
            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыЦен КАК ВидыЦен
            ПО (ВидыЦен.Ссылка = &ВидЦены)
    
    СГРУППИРОВАТЬ ПО
        АналитикаНоменклатуры.Номенклатура,
        АналитикаНоменклатуры.Характеристика) КАК СебестоимостьТоваров
        ЛЕВОЕ СОЕДИНЕНИЕ Константы КАК Константы
        ПО (ИСТИНА)

СГРУППИРОВАТЬ ПО
    СебестоимостьТоваров.Номенклатура,
    СебестоимостьТоваров.Характеристика,
    Константы.ВалютаУправленческогоУчета

Бывает полезно от нее рассчитывать цены продаж. Например, когда есть большой запас одного товара, но по случаю удалось купить небольшую партию подешевле этого же товара. Пересчитывать цены по закупочной цене последней партии не совсем правильно (можно в убыток наторговать), надо брать себестоимость всех партий в наличии. Но у клиента не тот случай, последняя партия куплена когда на остатке товара не было. Вроде Себестоимость должна равна быть закупочной цене. А начинаешь считать Цены (прайс-лист) она на порядок выше!?
У большинства товаров Себестоимость равна цене Закупочная, а у некоторых в 2-3 раза выше, а то и на порядок!? Откуда берется эта дополнительная составляющая?

В общем хотел приведенный выше СКД запрос разбить на более мелкие составляющие. Как это сделать?
1 Mikhail Volkov
 
02.06.17
07:31
РегистрСведений.НоменклатураСегмента - пустой, не используется. Запрос упрощается, остается Документ.РасчетСебестоимостиТоваров или РегистрНакопления.СебестоимостьТоваров. Тут и там суммы равные цене Закупочная. Откуда тогда такой завышенный результат?
2 PCcomCat
 
02.06.17
08:21
(1) Проверь данные в регистре.
3 Mikhail Volkov
 
02.06.17
10:11
(2) РегистрНакопления.СебестоимостьТоваров проверил, а так же движения Документ.РасчетСебестоимостиТоваров!?
Как-то переделать СКД, чтобы были видны промежуточные результаты.
4 Mikhail Volkov
 
02.06.17
19:42
Когда этот запрос вставил в Консоль запросов для управляемого приложения.epf, то "Цена" в большинстве случаев совпали с тем, что выдает Цены (прайс-лист). Но как раз в сомнительных случаях (в разы отличается "Себестоимость" от "Закупочная") цифры значительно отличаются!?
Есть сомнение, что я правильно достал этот запрос. Когда открываешь имеющийся вид цены "Себестоимость", то кнопка "Редактировать" СКД недоступна. Доступна лишь при создании нового вида цены. Создавал путем копирования имеющийся вид цены "Себестоимость". Но не уверен, что запрос тоже с копировался верно.
В форме на кнопке РедактироватьСхемуКомпоновкиДанных (на всех 3-х) галка Доступность стоит. В модуле ее Доступность не прописана. Как ее сделать доступной?
5 Mikhail Volkov
 
03.06.17
10:47
Наибольший интерес расчета себестоимости представляет эта часть запроса:

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

        ЛЕВОЕ СОЕДИНЕНИЕ
            Справочник.ВидыЦен КАК ВидыЦен
            ПО ВидыЦен.Ссылка = &ВидЦены

    СГРУППИРОВАТЬ ПО
        АналитикаНоменклатуры.Номенклатура,
        АналитикаНоменклатуры.Характеристика

По замыслу его разработчиков, когда есть Документ.РасчетСебестоимостиТоваров.ПредварительныйРасчет, то СтоимостьНоменклатуры берется из РегистрСведений.СтоимостьТоваров. Или из РегистрНакопления.СебестоимостьТоваров.
Далее эта Себестоимость объединяется (?!) с себестоимостью из РегистрНакопления.СебестоимостьТоваров.Остатки. Вот оттуда и берутся цифры в разы большие, чем из Документ.РасчетСебестоимостиТоваров (РегистрСведений.СтоимостьТоваров).
По моему должно быть что-то одно: если нет Документ.РасчетСебестоимостиТоваров (РегистрСведений.СтоимостьТоваров), тогда брать из РегистрНакопления.СебестоимостьТоваров.Остатки. Или как?
6 Mikhail Volkov
 
04.06.17
06:53
Стоимость и Количество вычисленную по остаткам переименовал, по ним считаю Цена, только когда она нулевая:

    ВЫБОР КОГДА СУММА(СебестоимостьТоваров.Количество) > 0 ТОГДА
        ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.Стоимость) / СУММА(СебестоимостьТоваров.Количество) КАК ЧИСЛО(15, 2))
    ИНАЧЕ
        ВЫБОР КОГДА СУММА(СебестоимостьТоваров.КоличествоОстаток) > 0 ТОГДА
            ВЫРАЗИТЬ(СУММА(СебестоимостьТоваров.СтоимостьОстаток) / СУММА(СебестоимостьТоваров.КоличествоОстаток) КАК ЧИСЛО(15, 2))
        ИНАЧЕ
            0
        КОНЕЦ
    КОНЕЦ КАК Цена,

Но как внести мои поправки в существующую вид цены "Себестоимость"? Как сделать кнопку "Редактировать" доступной?
7 Mikhail Volkov
 
05.06.17
03:59
Вставил:
Форма.Элементы.РедактироватьСхемуКомпоновкиДанных.Доступность = Истина; в процедуру выполняемую &НаКлиентеНаСервереБезКонтекста. Хотелось бы еще проверку на Толстый клиент, иначе открывать СКД бесполезно. Есть такая проверка?
8 sFAQer
 
05.06.17
05:31
#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение
#КонецЕсли
9 Mikhail Volkov
 
05.06.17
10:24
(8) Спс, в файловом варианте это работает, а почему в серверном - нет!?
10 Mikhail Volkov
 
05.06.17
17:45
СерверТолстыйКлиентУправляемоеПриложение к сожалению нет? Пришлось заменить на #Если Сервер ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда для УТ11.2
11 Mikhail Volkov
 
06.06.17
04:58
Хорошо, кнопка "Редактировать" теперь доступна, но у Элементы.СхемаКомпоновкиДанных нет кнопки выбора, добавил:
Форма.Элементы.СхемаКомпоновкиДанных.КнопкаВыбора = Истина;
Форма.Элементы.СхемаКомпоновкиДанных.Доступность = Истина;
Теперь кнопки выбора есть, но недоступна!?
12 Mikhail Volkov
 
06.06.17
05:19
Проверяю в конце процедуры ПриОткрытии() Доступность всех Элементы.СхемаКомпоновкиДанных (на форме их 3), у всех Истина. Так же проверяю Элементы.СхемаКомпоновкиДанных.СписокВыбора.Количество() - 9 (у Элементы.СхемаКомпоновкиДанных1.СписокВыбора.Количество() и Элементы.СхемаКомпоновкиДанных2.СписокВыбора.Количество() - по 2). Почему нет доступности, чего еще не хватает?
13 Mikhail Volkov
 
06.06.17
11:29
Докопался, кроме Доступность реквизиты имеют еще свойство запрещающих их менять. Они устанавливаются в:
// подсистема запрета редактирования ключевых реквизитов объектов
ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма);
не блокируются лишь при создании для новых видов цен.

Хорошо, теперь могу вносить свои поправки в СКД. Внес, но обработка Цены (прайс-лист) на мои изменения ни как не реагирует, считает все по старому? В ней не нахожу никаких процедур по расчету цен. Откуда она их берет?
14 Mikhail Volkov
 
07.06.17
09:45
По кнопке "Сформировать" открывается ФормаНастройки. В ней кнопка ЗакрытьИСформировать. По ней выполняется:

Процедура ПерейтиКУстановкеЦенФрагмент()
    
    Если Не УстановкаЦенКлиент.ЗаполненыОбязательныеПараметрыСхемКомпоновкиДанных(ЭтаФорма) Тогда
        Возврат;
    КонецЕсли;
    
    Если УстановкаЦенКлиентСервер.ВыбранныеСтрокиТаблицыВидовЦен(ЭтаФорма).Количество() > 0 Тогда
        
        Если ВидНастройки = "Простой" Тогда
            ПреобразоватьУпрощеннуюНастройкуВРасширенную(ЭтаФорма);
        КонецЕсли;
        
        ОповеститьОВыборе(НастройкиПрайсЛиста());
        
    Иначе
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='Для перехода к установке цен, необходимо выбрать один или несколько видов цен'"),,"ВыбранныеЦены");
    КонецЕсли;
    
КонецПроцедуры

Но сама цены она не рассчитывает, только ОповеститьОВыборе(НастройкиПрайсЛиста()); А сам расчет цен где?
15 Mikhail Volkov
 
07.06.17
13:06
Нашел, в ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора), но и там не считает, а лишь выбирает из РегистрСведений.ЦеныНоменклатуры. Глубже надо копать...
16 Mikhail Volkov
 
09.06.17
09:09
Оказывается обработка ПрайсЛист не предназначена для расчета цен, лишь для просмотра и регистрации. А где и как их рассчитывать?
17 Mikhail Volkov
 
10.06.17
14:29
В УТ11 нет функции типа ПолучитьЗначениеДополнительныхСведений()? Свою написать не проблема, но не хочется дублировать типовые.