Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Как вытащить предпоследнюю цену в ценник?          
Leks Подменю пользователя
сообщение 10.01.17, 15:18
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

Доброго дня! Товарищи, решил реализовать ценник с двумя ценами (одна из них акционная), для чего требуется вытащить предыдущую цену номенклатуры. Прошу помощи. Либо ткните пальцем где это уже обсуждалось, ибо поиск не дал подходящего результата.

Vofka Подменю пользователя
сообщение 10.01.17, 15:47
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

1) Ознакомьтесь с правилами и, как минимум, укажите то, что сказано в пункте 7. Иначе тема уйдет в корзину.
2) Напишите что вы для этого сделали и что конкретно не получается. Если же вы хотите, что бы это просто сделали за вас, то можно обратиться в сервис удаленной работы 1С. Но там делают за деньги.

Leks Подменю пользователя
сообщение 10.01.17, 15:55
Сообщение #3

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

1) 1С:Предприятие 8.3 (8.3.8.1747), Управление торговым предприятием для Украины", редакция 1.2. (1.2.39.1)
2) Нашёл где лежит обработка. Не могу найти откуда и как берётся цена.

Vofka Подменю пользователя
сообщение 10.01.17, 15:56
Сообщение #4

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цены хранятся в регистре сведений ЦеныНоменклатуры.

sava1 Подменю пользователя
сообщение 10.01.17, 17:08
Сообщение #5

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

Чуйствую, длинная будет тема - запрос-то хитрый.

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ПредПоследнийПериодЦены.Номенклатура,
    ПредПоследнийПериодЦены.Период,
    ЕСТЬNULL(ЦеныНоменклатуры.Цена, 0) КАК ПредыдущаяЦена,
    ПредПоследнийПериодЦены.ТипЦен
ПОМЕСТИТЬ ПредПоследниеЦены
ИЗ
    (ВЫБРАТЬ
        ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
        МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
        ПоследняяЦенаНоменклатур.ТипЦен КАК ТипЦен
    ИЗ
        ПоследняяЦенаНоменклатур КАК ПоследняяЦенаНоменклатур
            ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
            ПО ПоследняяЦенаНоменклатур.Период > ЦеныНоменклатуры.Период
                И ПоследняяЦенаНоменклатур.Номенклатура = ЦеныНоменклатуры.Номенклатура
                И ПоследняяЦенаНоменклатур.ТипЦен = ЦеныНоменклатуры.ТипЦен
    
    СГРУППИРОВАТЬ ПО
        ЦеныНоменклатуры.Номенклатура,
        ПоследняяЦенаНоменклатур.ТипЦен) КАК ПредПоследнийПериодЦены
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ПредПоследнийПериодЦены.ТипЦен = ЦеныНоменклатуры.ТипЦен
            И ЦеныНоменклатуры.Период = ПредПоследнийПериодЦены.Период
            И ЦеныНоменклатуры.Номенклатура = ПредПоследнийПериодЦены.Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    ПоследняяЦенаНоменклатур.Номенклатура,
    ПоследняяЦенаНоменклатур.ТипЦен,
    ПоследняяЦенаНоменклатур.ТекущаяЦена,
    ЕСТЬNULL(ПредПоследниеЦены.ПредыдущаяЦена, 0) КАК ПоследняяЦена
ИЗ
    ПоследняяЦенаНоменклатур КАК ПоследняяЦенаНоменклатур
        ЛЕВОЕ СОЕДИНЕНИЕ ПредПоследниеЦены КАК ПредПоследниеЦены
        ПО ПоследняяЦенаНоменклатур.Номенклатура = ПредПоследниеЦены.Номенклатура
            И ПоследняяЦенаНоменклатур.ТипЦен = ПредПоследниеЦены.ТипЦен

Vlad 1C Подменю пользователя
сообщение 10.01.17, 18:28
Сообщение #6

Общительный
**
Группа: Пользователи
Сообщений: 45
Спасибо сказали: 7 раз
Рейтинг: 0

Leks @ Сегодня, 15:18 * ,
Делали одному клиенту по-другому. Дело в том, что не всегда нужно писать "настоящую" предыдущую цену. Зачастую цена без скидки завышается, чтобы разница казалась ощутимее. Добавили в РС реквизит ПредыдущаяЦена и потом уже с ним работали для вывода на ценник.

Leks Подменю пользователя
сообщение 11.01.17, 12:13
Сообщение #7

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

sava1 @ Вчера, 17:08 * ,для меня это пока тёмный лес.

На данный момент разобрался вот с чем. Есть такая последовательность процедур

Процедура ПриОткрытии()

    Перем ЗаполнитьЦены;

    Перем НастройкиПостроителя;

    Валюта = Справочники.Валюты.НайтиПоКоду("980");
    //Организация = Справочники.Организации.НайтиПоКоду("000000001");
    ПечатьУзкихЦенников = Ложь;
    ОрганизацияПриИзменении(ЭлементыФормы.Организация);
    
    Если Не Константы.ИспользоватьХарактеристикиНоменклатуры.Получить() Тогда
        Колонка                   = ЭлементыФормы.Товары.Колонки.ХарактеристикаНоменклатуры;
        Колонка.Видимость         = Ложь;
        Колонка.ИзменятьВидимость = Ложь;
    КонецЕсли;

    СтруктураНастроек = ВосстановитьЗначение("Обработка.ПечатьЦенников.Настройки");
    Если ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
        //СтруктураНастроек.Свойство("Организация", Организация);
        СтруктураНастроек.Свойство("ТипЦен", ТипЦен);
        СтруктураНастроек.Свойство("Валюта", Валюта);
        СтруктураНастроек.Свойство("ТолькоИмеющиесяВНаличии", ТолькоИмеющиесяВНаличии);
        СтруктураНастроек.Свойство("НастройкиПостроителя", НастройкиПостроителя);
    КонецЕсли;
    //Организация = Справочники.Организации.ПустаяСсылка();
    ЗаполнитьПостроительОтчета();

    Если НастройкиПостроителя <> Неопределено Тогда
        ПостроительОтчета.УстановитьНастройки(НастройкиПостроителя);
    КонецЕсли;

    Если ТипЗнч(Параметр) = Тип("Структура") Тогда
        Параметр.Свойство("ЗаполнитьЦены", ЗаполнитьЦены);

        Если ЗаполнитьЦены = Истина Тогда
            Если ПроверитьПараметрыЗаполненияЦен() Тогда
                ПерезаполнитьЦены();
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры // ПриОткрытии()



Процедура ЗаполнитьПостроительОтчета() Экспорт

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

    ТекстЗапроса = ТекстЗапроса + "
    |УПОРЯДОЧИТЬ ПО
    |    СпрНоменклатура.Номенклатура.Наименование,
    |    СпрНоменклатура.ХарактеристикаНоменклатуры.Наименование
    |";

    // Соответствие имен полей в запросе и их представлений в отчете.
    СтруктураПредставлениеПолей = Новый Структура(
    "Номенклатура,   ХарактеристикаНоменклатуры,    Склад",
    "Номенклатура", "Характеристика номенклатуры", "Склад");

    ПостроительОтчета.Текст = ТекстЗапроса;

    ПостроительОтчета.ЗаполнитьНастройки();

    // Создадим список доступных отборов.
    СоответствиеДоступныхОтборов = Новый Соответствие;
    СоответствиеДоступныхОтборов.Вставить("Номенклатура", 0);
    СоответствиеДоступныхОтборов.Вставить("ХарактеристикаНоменклатуры", 0);
    СоответствиеДоступныхОтборов.Вставить("Склад", 0);

    Для Каждого ДоступноеПоле Из ПостроительОтчета.ДоступныеПоля Цикл
        Если СоответствиеДоступныхОтборов[ДоступноеПоле.Имя] =Неопределено Тогда
            ДоступноеПоле.Отбор = Ложь;
        Иначе
            ДоступноеПоле.Отбор = Истина;
        КонецЕсли;
    КонецЦикла;

    // Создадим массив отборов.
    МассивОтбора = Новый Массив;
    МассивОтбора.Добавить("Номенклатура");
    МассивОтбора.Добавить("ХарактеристикаНоменклатуры");

    Если ТолькоИмеющиесяВНаличии Тогда
        МассивОтбора.Добавить("Склад");
    КонецЕсли;

    Для Каждого ЭлементОтбора Из МассивОтбора Цикл
        Если ПостроительОтчета.Отбор.Найти(ЭлементОтбора) = Неопределено Тогда
            ПостроительОтчета.Отбор.Добавить(ЭлементОтбора);
        КонецЕсли;
    КонецЦикла;

    // Вызовем стандартную процедуру заполнения представлений.
    УправлениеОтчетами.ЗаполнитьПредставленияПолей(СтруктураПредставлениеПолей, ПостроительОтчета);

КонецПроцедуры // ЗаполнитьПостроительОтчета()


Ну и собственно вывод в таблицу.
Процедура ПерезаполнитьЦены() Экспорт

    СтруктураЗначений = Новый Структура;
    СтруктураЗначений.Вставить("НовыйТипЦен", ТипЦен);

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

    ПустаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
    ТипЦенРассчитывается = ТипЦен.Рассчитывается;

    СтруктураКурса = МодульВалютногоУчета.ПолучитьКурсВалюты(Валюта, РабочаяДата);
    Курс = СтруктураКурса.Курс;
    Кратность = СтруктураКурса.Кратность;

    Для Каждого СтрокаТовара Из Товары Цикл
        ХарактеристикаНоменклатуры = СтрокаТовара.ХарактеристикаНоменклатуры;

        СтруктураПоиска = Новый Структура("Номенклатура", СтрокаТовара.Номенклатура);

        СтрокиЦен = ЗапросПоЦенам.НайтиСтроки(СтруктураПоиска);

        СтрокаБезХарактеристики = Неопределено;
        СтрокаСХарактеристикой = Неопределено;

        Для Каждого СтрокаЦен Из СтрокиЦен Цикл
            Если СтрокаЦен.ХарактеристикаНоменклатуры = ПустаяХарактеристика Тогда
                СтрокаБезХарактеристики = СтрокаЦен;
            ИначеЕсли СтрокаЦен.ХарактеристикаНоменклатуры = ХарактеристикаНоменклатуры Тогда
                СтрокаСХарактеристикой = СтрокаЦен;
            КонецЕсли;
        КонецЦикла;

        Если СтрокаСХарактеристикой <> Неопределено Тогда
            НайденнаяСтрока = СтрокаСХарактеристикой;
        ИначеЕсли СтрокаБезХарактеристики <> Неопределено Тогда
            НайденнаяСтрока = СтрокаБезХарактеристики;
        Иначе
            НайденнаяСтрока = Неопределено;
        КонецЕсли;

        Если (НайденнаяСтрока <> Неопределено) И (НайденнаяСтрока.Цена <> 0) Тогда
            Цена = НайденнаяСтрока.Цена * (1 + ?(ТипЦенРассчитывается, НайденнаяСтрока.ПроцентСкидкиНаценки / 100, 0));
            Цена = Ценообразование.ОкруглитьЦену(Цена, ТипЦен.ПорядокОкругления, ТипЦен.ОкруглятьВБольшуюСторону);
            Цена = Ценообразование.ПересчитатьЦенуПриИзмененииВалюты(Цена, НайденнаяСтрока.ВалютаЦены, Валюта, Курс, Кратность);

            СтрокаТовара.ЕдиницаИзмерения = НайденнаяСтрока.ЕдиницаИзмеренияЦены;
        Иначе
            Цена = 0;
        КонецЕсли;

        СтрокаТовара.Цена = Цена;
    КонецЦикла;

КонецПроцедуры // ПерезаполнитьЦены()


А вот куда прикрепить вам написанный запрос, ума не приложу.

sava1 Подменю пользователя
сообщение 11.01.17, 12:54
Сообщение #8

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

весь запрос в текст запроса.
тот который есть - откорректировать соответственно (или последнюю выборку прицепить левым джойном к имеющемуся запросу)

перезаполнитьцены() - выбросить.
если не используете характеристики - упростить запрос.

А проще - скормить запрос СКД, если надо - добавить характеристики и вывести все через СКД, а не построитель.

Leks Подменю пользователя
сообщение 13.01.17, 12:25
Сообщение #9

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

sava1 @ Вчера, 12:54 * ,
что такое СКД? Сейчас пришёл к такому запросу - он считает быстрее. Слабая у меня машина.
ВЫБРАТЬ     ПЕРВЫЕ 2
    ЦеныНоменклатуры.Номенклатура.Код КАК Код,
    ЦеныНоменклатуры.Номенклатура.Наименование КАК Наименование,
    ЦеныНоменклатуры.Цена КАК ПредЦена,
    ЦеныНоменклатуры.ТипЦен.Наименование,
    ЦеныНоменклатуры.Период КАК Период
ПОМЕСТИТЬ втПредЦена    
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.ТипЦен.Наименование = "Розничная"
    И ЦеныНоменклатуры.Номенклатура.Код = "0000001074895"
УПОРЯДОЧИТЬ ПО
    Период УБЫВ
;

ВЫБРАТЬ ПЕРВЫЕ 1
    Период,
    втПредЦена.ПредЦена
ИЗ
втПредЦена
УПОРЯДОЧИТЬ ПО
    Период ВОЗР


Теперь ломаю голову как его вставить в обработку.

sava1 Подменю пользователя
сообщение 13.01.17, 12:30
Сообщение #10

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

Цитата(Leks @ 13.01.17, 12:25) *
он считает быстрее.

Конечно - только по одной номенклатуре.

Мой Вам совет - при таких проблемах обратитесь к специалисту.

Leks Подменю пользователя
сообщение 13.01.17, 12:51
Сообщение #11

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

sava1 @ Сегодня, 12:30 * ,
Не совсем. Я подставлял в ваши запросы такие же условия при выборке по определённому коду и виду цены.
P.S. О проблемах я ни слова не сказал.

sava1 Подменю пользователя
сообщение 13.01.17, 13:10
Сообщение #12

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

Цитата(Leks @ 13.01.17, 12:51) *
О проблемах я ни слова не сказал.


а это что ?
Цитата(Leks @ 13.01.17, 12:25) *
что такое СКД?



Цитата(Leks @ 13.01.17, 12:25) *
Сейчас пришёл к такому запросу - он считает быстрее

А как Вы собираетесь получать цены на всю выборку номенклатуры? Запросом в цикле по каждому товару?

Leks Подменю пользователя
сообщение 13.01.17, 14:26
Сообщение #13

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(sava1 @ 13.01.17, 13:10) *
а это что ?

это незнание смыла аббревиатуры, собственно отсюда и вопрос. Оказывается это система компоновки данных. Не вижу в этом проблемы, так как она мне никак не помогла в написании запроса, точнее, я к ней не обращался.
Цитата(sava1 @ 13.01.17, 13:10) *
А как Вы собираетесь получать цены на всю выборку номенклатуры? Запросом в цикле по каждому товару?

мне не нужно делать выборку на всю номенклатуру, а лишь на ту, которая есть в документе, из которого вызывается печать ценников (это максимум 50 позиций). Буду делать на основе процедуры ПерезаполнитьЦены(), пока только это видится подходящим. Спасибо smile.gif

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 14:25
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!