Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 14:41

Подсобите с запросом в 8.3, СКД

Автор Opty, 23 июл 2015, 17:58

0 Пользователей и 1 гость просматривают эту тему.

Opty

День добрый уважаемые!

Повторюсь, что по 1С программер я начинающий, но за плечами приличный опыт работы с MySQL, поэтому есть понимание, как строить сложные запросы с выборками, сравнениями и группировками. Но тут уже 2 недели мучаюсь, не могу сделать отчет по ЗП продавцов.
Есть регистр сведений, в котором указаны бонусы для продавцов дверей, в зависимости от количества проданных дверей а так же ЗП за выход на работу в день. Периодически эти сведения могут меняться.

Просто сведения из этого регистра я без проблем получаю запросом
ВЫБРАТЬ
&Дата КАК Дата,
Бонусы.ДверейОт,
Бонусы.ДверейДо,
Бонусы.ЭтоЕжедневнаяЗП,
Бонусы.Стоимость КАК Бонус
ИЗ
РегистрСведений.ЗадатьБонусыНаДату.СрезПоследних(&Дата, ) КАК Бонусы


Далее есть регистр сведений с заказами, в котором указано количество дверей, дата и продавец.

Вывести отдельно сколько продал продавец дверей за каждый день в определенном периоде так же не составляет труда

ВЫБРАТЬ
Двери.Количество,
Двери.Продавец,
Двери.Период,
Двери.Регистратор,
Двери.Регистратор.Дата
ИЗ
РегистрНакопления.Двери КАК Двери
ГДЕ
Двери.Продавец = &Продавец
И Двери.Период МЕЖДУ &НачалоПериода И &КонецПериода


Проблема в том, что я никак не пойму где тут в конфигураторе прописать связку этих двух таблиц.
Т.е. логика запроса такая

  • посчитали количество дверей за день
  • обратились к регистратору бонусов
  • из него выбрали все параметры на дату продажи дверей и
  • потом, пробежав в цикле на нахождение количества проданных дверей в ОТ и ДО, находим бонус продавца
  • прибавили ЗП за день выхода
  • и получили цифру, сколько человек заработал

Пните плиз, куда копать или где что почитать.

Спасибо)

vitasw

Левое соединение.
Не очень комильфо держать в РС разнотипные данные.
ЗП за день и бонусы - это несколько разные вещи, затрахаететсь потом разделять.

Opty

Цитата: vitasw от 23 июл 2015, 18:31
Левое соединение.
да как я только с ним не пробовал левачить)))))))
мне кажется, что левое тут не подойдет, т.к. нет параметра через который эти таблицы можно связать впрямую. тут связка хитрая - на сравнении и дате, поэтому видимо через запрос в запросе, либо два последовательных запроса (это вообще возможно?)
Цитата: vitasw от 23 июл 2015, 18:31
Не очень комильфо держать в РС разнотипные данные.
ЗП за день и бонусы - это несколько разные вещи, затрахаететсь потом разделять.
согласен, но тут программулька узкоспециализированная (для друга делаю), поэтому вполне подойдет и так. у ЗП за день есть же булево свое на эту тему, так что отделить будет несложно.

cska-fanat-kz

Цитата: Opty от 23 июл 2015, 18:38тут программулька узкоспециализированная (для друга делаю), поэтому вполне подойдет и так

а он в последствие задумается, друг ли вы ему ))))))))
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

vitasw

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

Запрос.УстановитьПараметр("КонецДня", КонецДня);
Запрос.УстановитьПараметр("НачалоДня", НачалоДня);
Запрос.УстановитьПараметр("Продавец", Продавец);

Opty

Вроде и я так же делал, видимо где-то натупил. Но стало вырисовываться уже, спасибо! В понедельник продолжу

Opty

А можно очень глупый вопрос, второй день бьюсь и туплю))
Есть 2 записи в регистре сведений - от 1 мая и 5 июня с бонусов в 500 / 555 рублей за количество проданных дверей от 1 до 10



Вот запрос, которым выводится отчет по продавцам

ВЫБРАТЬ
Двери.Продавец,
Бонусы.Стоимость КАК Бонус,
Двери.Количество,
Бонусы.ДверейОт,
Бонусы.ДверейДо,
Двери.Стоимость КАК СтоимостьДверей,
Двери.Регистратор,
Бонусы.Регистратор КАК РегистраторБонусов
ИЗ
РегистрНакопления.Двери КАК Двери
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗадатьБонусыНаДату.СрезПоследних(&ДатаЗапроса, ) КАК Бонусы
ПО (Двери.Количество МЕЖДУ Бонусы.ДверейОт И Бонусы.ДверейДо) И (Бонусы.Регистратор.Дата <= Двери.Регистратор.Дата)


Но на выходе имеем пустые строчки для даты меньшей, чем 5 июня



А ведь там должно выдаваться от 1 до 10 и бонус в размере 500 рублей. Где я ошибся?


Opty

Цитата: vitasw от 28 июл 2015, 14:20
Типовой вопрос.

Спасибо, но я с этой штуки изначально и начал, но не смог закончить, полез спрашивать сюда)
Сейчас снова полез туда - создал два запроса
ДВЕРИ
ВЫБРАТЬ
Двери.Продавец,
Двери.Количество,
Двери.Стоимость КАК СтоимостьДверей,
Двери.Регистратор,
Двери.Период
ИЗ
РегистрНакопления.Двери КАК Двери

и БОНУСЫ
ВЫБРАТЬ
    &Дата КАК Дата,
    Бонусы.Стоимость КАК Бонус,
    Бонусы.ДверейОт,
Бонусы.ДверейДо,
Бонусы.Регистратор КАК РегистраторБонусов
ИЗ
    РегистрСведений.ЗадатьБонусыНаДату.СрезПоследних(&Дата) КАК Бонусы


Потом связал их между собой:


И получилось, что БОНУСЫ на ДАТУ он берет правильно


Но теперь отчет не хочет учитывать вот это условие: Двери.Количество МЕЖДУ Бонусы.ДверейОт И Бонусы.ДверейДо

А его я пробовал и в связи наборов данных по разному прописать и как ЛЕВОЕ СОЕДИНЕНИЕ, но результат плачевный(

Добавлено: 29 июл 2015, 19:03


Немного модифицировал запрос - добавил расчет количества проданных дверей внутри одного заказа, ведь сравнивать ОТ и ДО надо именно по количеству в заказе, а до этого у меня шло сравнение всех позиций подряд

ДВЕРИ
ВЫБРАТЬ
Двери.Продавец,
Двери.Регистратор,
Двери.Период,
СУММА (Двери.Количество) КАК ПроданоДверей,
СУММА (Двери.Стоимость * Двери.Количество) КАК СтоимостьДверей

ИЗ
РегистрНакопления.Двери КАК Двери

СГРУППИРОВАТЬ ПО
Двери.Период,
Двери.Продавец,
Двери.Регистратор


БОНУСЫ
ВЫБРАТЬ
    &Дата КАК Дата,
    Бонусы.Стоимость КАК Бонус,
    Бонусы.ДверейОт,
Бонусы.ДверейДо
ИЗ
    РегистрСведений.ЗадатьБонусыНаДату.СрезПоследних(&Дата) КАК Бонусы

Указал связь между запросами


Стало вот так:



Добавлено: 29 июл 2015, 19:05


Остался вопрос видимо последний - как прописать выборку из БОНУСЫ по количеству дверей?

так не хочет работать)))))))))
Добавлено: 31 июл 2015, 16:47


Думал, думал, увидел такое слово как ПОМЕСТИТЬ и решил попробовать с ним. Если я правильно понял, то это создание временной таблицы, которую потом можно использовать. И вот что получилось:

//--выбираем все бонусы, которые попадают на период отчета
ВЫБРАТЬ
Стоимость КАК Бонус,
ДверейОт,
ДверейДо,
Период,
ЭтоЕжедневнаяЗП
ПОМЕСТИТЬ БонусыВсе
ИЗ
РегистрСведений.ЗадатьБонусыНаДату
ГДЕ
Период МЕЖДУ &НачалоПериода И &КонецПериода;

////////////////////////////////////////////////////////////////////////////////

//--выбираем все двери, попадающие в период отчета с фильтром по продавцу.
//--сразу считаем количество дверей и их суммарную стоимость внутри каждого заказа=регистратора
ВЫБРАТЬ
Двери.Период,
СУММА (Двери.Количество) КАК ПроданоДверей,
СУММА (Двери.Стоимость * Двери.Количество) КАК СтоимостьДверей
ПОМЕСТИТЬ ДвериВсе
ИЗ
РегистрНакопления.Двери КАК Двери
ГДЕ
Двери.Продавец = &Продавец
И Двери.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Двери.Период;

////////////////////////////////////////////////////////////////////////////////

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


Однако, отдельно две временных таблицы работают прекрасно, но как только я начинаю ЛЕВОЕ СОЕДИНЕНИЕ дверей с бонусами, то начинают появляться какие-то дубли

Стал разбираться что это такое - появляются лишние строки: почему-то бонусы присваиваются все, какие есть, т.е. не работает выборка по дате

И еще один важный вопрос - а как сделать так, чтобы в первой выборке временной таблицы у меня группировка шла не по заказам а по дням? Т.е. сколько всего дверей было продано Брежневым за 4 июня?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск