новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Установка цен Управление Торговлей 11. Произвольный запрос к данным ИБ.

  • Добавить свою публикацию
  • для этого требуется регистрация

Для создания и редактирования схем СКД необходимо запустить управление торговлей в толстом клиенте. Создать просто схему СКД это еще не все. Во-первых, итоговая таблица для получения цены должна соответствовать определенному виду и должна иметь следующие поля:

Основные:

  • Номенклатура – тип Справочник.Номенклатура;
  • Валюта – тип Справочник.Валюта;
  • Цена – тип Число;

Дополнительные:

  • Характеристика – тип Справочник.ХарактеристикиНоменклатуры (Если в организации ведется учет по Характеристикам)
  • Упаковка – тип Справочник.УпаковкиНоменклатуры (Если в организации ведется учет по Упаковкам);
  • Коэффициент – тип Число (Если в организации ведется учет по Упаковкам);

Всего итоговая таблица должна содержать как минимум 6 полей.

Самый простой вариант появляется при создании схемы с нуля, при выборе «Произвольной» схемы:

ВЫБРАТЬ
                ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК Номенклатура,
                ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
                ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка) КАК Упаковка,
                1 КАК Коэффициент,
                0 КАК Цена,
                ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка) КАК Валюта
{ВЫБРАТЬ
                Номенклатура.*,
                Характеристика.*,
                Упаковка.*,
                Коэффициент,
                Цена,
                Валюта.*}

Если вы сейчас попытаетесь записать цену, то появится такого рода ошибка: «Схема компоновки данных для заполнения цен должна содержать поле "Валюта" с типом значения "Валюта".» Для ее решения необходимо напрямую указать тип значения для каждого поля СКД.

ТипЗначения СКД

Когда происходит расчет цены, то программно накладывает отбор по Номенклатуре и Характеристике, таким образом не нужны самим накладывать его. Один из вариантов получения номенклатуры:

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

Вариант получения номенклатуры от разработчиков Управление торговлей 11:

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

Существуют также предопределенные параметры, которые можно использовать в запросе:

  • &ВидЦены – содержит вид цены, для которого рассчитывается цена
  • &ДатаДокумента – принимает значение либо дату документа установки цен, либо если идет расчет прайса, то дату в форме, если дата не заполнена, то принимает значение ТекущаяДата()
  • &ИспользуетсяОтборПоСегментуНоменклатуры – принимает значение Ложь или Истина.

Есть параметры, которые доступные только из документа Установка цен:

  • &Основание – содержит документ на основании которого вводится документ Установка Цен, например Поступление товаров и услуг
  • &ЭтоВводНаОсновании – принимает значение Ложь или Истина, в зависимости от того заполнен ли документОснование.

В форме заполнения прайса эти параметры не доступны, для более корректной работы с этими параметрами следует заполнить для них значения по умолчанию на закладке «параметры» СКД, например, &ЭтоВводНаОсновании – значение Ложь.

Для предопределенных параметров следует выставлять ограничение доступности.

Параметры СКД

Для всех остальных параметров, которые вы вводите следует либо заполнять по умолчанию, либо заполнять при первом создании цены и в дальнейшем не менять. Для примера можно посмотреть как реализована «Цена поступления»

Добавлено 28.02.2015

По просьбе моих многочисленных читателей расширяю статью на конкретном примере. Наверное, самым стандартным мерилом цены товара является его себестоимость, и вот рассмотрим простую задачу необходимо получить цену поступления, прибавить к ней доп расходы и прибавить к получившейся цене определенный процент наценки.

Порядок действий

  1. Открываем справочник «Виды цен» добавляем свою цену, называем ее как-то по-особому, например, «моя первая цена» и нажимаем «использовать полные возможности», затем выбираем «Произвольный запрос к данным ИБ» -> Схема компоновки данных «Произвольный» и нажимаем «редактировать»
  2. На открывшейся панели нажимаем «редактировать схему компоновки»

Планируем общую логику работы:

А) Вначале получаем номенклатуру и ее характеристику;

Б) получаем для них последний документ поступления, здесь может быть два варианта, если мы вводим цену из документа установки цен и на основании поступления, то получим поступление очень просто - &Основание, если же оно пустое или вводится из «прайс листа», то необходимо получить последнее проведенное поступление не превышающую даты установки цен (&ДатаДокумента).

3. Получить сколько процентов составляет одна единица номенклатуры от цены поступления и цену номенклатуры (если бы нам нужно было только получить цену поступления, то на этом можно остановиться).

4. Получаем сумму всех поступлений товаров и услуг, где в аналитике указано это поступление товаров и услуг (мы не будем определять, как ложатся расходы на себестоимость – пусть будут пропорционально).

5 Затем получаем цену номенклатуры: цена поступления + процент от поступления * сумма доп расходов.

Начнем по порядку: для получения номенклатуры будем использовать типовую часть запроса через сегменты номенклатуры.

Отдельным запросом введем видцены и его рекзивизит «ЦенаВключаетНДС» - он понадобится для корректной установки цены на поступление, в этом запросе мы используем известный на параметры &ВидЦены, чтобы получить данные по текущей цене.

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
            ВидЦены.Ссылка КАК ВидЦены,
            ВидЦены.ЦенаВключаетНДС
ПОМЕСТИТЬ ВТВидыЦен
ИЗ
            Справочник.ВидыЦен КАК ВидЦены
ГДЕ
            ВидЦены.Ссылка = &ВидЦены
;

Теперь нам нужно получить документ поступления и цену номенклатуры из этого документа. Может быть 2 случая, либо мы вводим установку цен на основании документа поступления и тогда «основание» нам известно, либо устанавливаем через форму прайс листа, где основание неизвестно и нам придется искать последний документ поступления до ввода прайса. Рассмотрим каждый случай по отдельности.

Какие поля нам нужно получить? Это номенклатура, характеристика, упаковка (если ведется учет по упаковкам), валюта (хотя я не буду ее получать, есть более простой способ ее получения), цена (с учетом НДС или без нее) и ПроцентОтПоступления (Процент отношения суммыдокумента от цены на номенклатуры, необходим, чтобы потом получить часть суммы от доп расходов и распределить ее на цену). В первом случае получить документ очень просто:

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
            ПоступлениеТоваровУслугТовары.Ссылка,
            ОтборПоСегментуНоменклатуры.Номенклатура,
            ОтборПоСегментуНоменклатуры.Характеристика,
            ВЫРАЗИТЬ(ВЫБОР
                                   КОГДА ВТВидыЦен.ЦенаВключаетНДС
                                                                       И ПоступлениеТоваровУслугТовары.Ссылка.ЦенаВключаетНДС
                                                           ИЛИ НЕ ВТВидыЦен.ЦенаВключаетНДС
                                                                       И НЕ ПоступлениеТоваровУслугТовары.Ссылка.ЦенаВключаетНДС
                                               ТОГДА ПоступлениеТоваровУслугТовары.Цена
                                   КОГДА ВТВидыЦен.ЦенаВключаетНДС
                                                           И НЕ ПоступлениеТоваровУслугТовары.Ссылка.ЦенаВключаетНДС
                                               ТОГДА (ПоступлениеТоваровУслугТовары.Сумма + ПоступлениеТоваровУслугТовары.СуммаНДС) / ПоступлениеТоваровУслугТовары.Количество
                                   КОГДА НЕ ВТВидыЦен.ЦенаВключаетНДС
                                                           И ПоступлениеТоваровУслугТовары.Ссылка.ЦенаВключаетНДС
                                               ТОГДА (ПоступлениеТоваровУслугТовары.Сумма - ПоступлениеТоваровУслугТовары.СуммаНДС) / ПоступлениеТоваровУслугТовары.Количество
                        КОНЕЦ КАК ЧИСЛО(15, 2)) КАК Цена,
            ВЫБОР
                        КОГДА ПоступлениеТоваровУслугТовары.Цена = 0
                                   ТОГДА 0
                        ИНАЧЕ ВЫРАЗИТЬ(ПоступлениеТоваровУслугТовары.Ссылка.СуммаДокумента / ПоступлениеТоваровУслугТовары.Цена КАК ЧИСЛО(15, 3))
            КОНЕЦ КАК ПроцентОтПоступления,
            ПоступлениеТоваровУслугТовары.Упаковка
ПОМЕСТИТЬ ВТДокументПоступления
ИЗ
            Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтборПоСегментуНоменклатуры КАК ОтборПоСегментуНоменклатуры
                        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ОтборПоСегментуНоменклатуры.Номенклатура
                                   И ПоступлениеТоваровУслугТовары.Характеристика = ОтборПоСегментуНоменклатуры.Характеристика
                                   И (ПоступлениеТоваровУслугТовары.Ссылка = &Основание)
                                   И (&ЭтоВводНаОсновании),
            ВТВидыЦен КАК ВТВидыЦен

Здесь использованы типовые параметры: &Основание и &ЭтоВводНаОсновании – и запрос будет выполняться, когда «ЭтоВводНаОсновании» = Истина;

Теперь получим запрос, который будет исполняться, если «ЭтоВводНаОсновании» = Ложь, а затем объединим его с имеющимся. Второй запрос только отличается тем, что для него рассчитана Дата поступления номенклатуры, а затем она связывается с поступлением, как и Основание в первом запросе, поэтому привожу только код получения последней даты поступления.

 

ВЫБРАТЬ
            ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
            ПоступлениеТоваровУслугТовары.Характеристика КАК Характеристика,
            МАКСИМУМ(ПоступлениеТоваровУслугТовары.Ссылка.Дата) КАК Дата
ИЗ
            Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОтборПоСегментуНоменклатуры КАК ОтборПоСегментуНоменклатуры
                        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ОтборПоСегментуНоменклатуры.Номенклатура
                                   И ПоступлениеТоваровУслугТовары.Характеристика = ОтборПоСегментуНоменклатуры.Характеристика
                                   И (ПоступлениеТоваровУслугТовары.Ссылка.Проведен)
                                   И (НЕ &ЭтоВводНаОсновании)
                                   И (ПоступлениеТоваровУслугТовары.Ссылка.Дата <= ВЫБОР
                                               КОГДА КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ) > &ТекДата
                                                           ТОГДА &ТекДата
                                               ИНАЧЕ КОНЕЦПЕРИОДА(&ДатаДокумента, ДЕНЬ)
                                   КОНЕЦ)
 
СГРУППИРОВАТЬ ПО
            ПоступлениеТоваровУслугТовары.Номенклатура,
            ПоступлениеТоваровУслугТовары.Характеристика

В этом запросе следует обратить внимание на то, что группировка происходит по номенклатуре, хотя по идее можно просто получить максимум от даты без учета номенклатуры, но дело в том, что при программном заполнении СКД попадает не строчка с номенклатурой, а целая таблица, которая содержит все номенклатуры документа установки, из-за этого, если я не буду ставить группировку, то я могу получить дату последнего поступления не нужной нам номенклатуры. Также в этом запросе я использовал новый Параметр &ТекДата – это пользовательский параметр, которому я присвою выражение «ТекущаяДата()». Я ввел этот параметр так как &ДатаДокумента не содержит время, а только дату, это связано с тем, что сам механизм расстановки времени документа Установи цен номенклатуры построен таким образом, что первому документу присваивается дата на 0:00:00, а к следующему прибавляется секунда, поэтому есть даже специальный реквизит, который указывает порядок документа в пределах дня, на самом деле, это количество секунд, прошедшие с нулевой даты.

Осталось получить расходы на поступление – упростим задачу, получим любые документы поступления, содержащие в табличной части ссылку на наш документ поступления, без учета аналитики распределения себестоимости (везде себестоимость будет раскидываться пропорционально). Пишем так:

ВЫБРАТЬ
            СУММА(ВТДокументПоступления.ПроцентОтПоступления * ПоступлениеТоваровУслугТовары.Ссылка.СуммаДокумента) КАК ДопРасход,
            ВТДокументПоступления.Номенклатура,
            ВТДокументПоступления.Характеристика,
            ВТДокументПоступления.Ссылка КАК ДокументПоступления
ПОМЕСТИТЬ ВТДопРасходы
ИЗ
            ВТДокументПоступления КАК ВТДокументПоступления
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                        ПО ВТДокументПоступления.Ссылка = ПоступлениеТоваровУслугТовары.АналитикаРасходов
 
СГРУППИРОВАТЬ ПО
            ВТДокументПоступления.Номенклатура,
            ВТДокументПоступления.Характеристика,
            ВТДокументПоступления.Ссылка
;

 

И остается последний штрих, это связать допрасходы с ценой поступления, добавить валюту и коэффициент упаковки, а также добавить процент наценки; я делаю это так:

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
            ВТДокументПоступления.Номенклатура,
            ВТДокументПоступления.Характеристика,
            (1 + &ПроцентНаценки / 100) * (ВТДокументПоступления.Цена + ЕСТЬNULL(ВТДопРасходы.ДопРасход, 0)) КАК Цена,
            ВТДокументПоступления.Упаковка,
            ЕСТЬNULL(ВТДокументПоступления.Упаковка.Коэффициент, 1) КАК Коэффициент,
            Константы.ВалютаРегламентированногоУчета КАК Валюта
ИЗ
            ВТДокументПоступления КАК ВТДокументПоступления
                        ЛЕВОЕ СОЕДИНЕНИЕ ВТДопРасходы КАК ВТДопРасходы
                        ПО ВТДокументПоступления.Ссылка = ВТДопРасходы.ДокументПоступления
                                   И ВТДокументПоступления.Номенклатура = ВТДопРасходы.Номенклатура
                                   И ВТДокументПоступления.Характеристика = ВТДопРасходы.Характеристика
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Константы КАК Константы
                        ПО (ИСТИНА)

Запрос готов, теперь нам остается: проставить типы для полей на закладке «наборы данных», как я говорил ранее. Проставить для всех параметров, кроме ПроцентНаценки,  ограничение доступности. Проставить для &ТекДата выражение «ТекущаяДата()».

После всего этого нажимаем «ОК». На закладке «Параметры» ставим желаемый процент наценки и Записываем цену. Наша цена готова.

 

 
0
≡ к списку статей