[Запросы 1С] Отбор документов по заданным условиям
Добрый день.
Мне необходимо вывести за год покупателей по Расходным накладным по следующим условиям:
1) "новых" покупателей, то есть тех, по которым первая расходная накладная проведена не раньше месяца
2) "ушедших" - по которым последняя расходная накладная проведена более полугода назад
3) "вернувшихся" - по которым разница даты проведения между расходками была более полугода
4) "постоянных" - в каждом месяце есть хотя бы одна проведенная расходка
Условия скажем так относительные, мне важно понять как прописывать подобное условия, может кто подсказать?
В данном коде выводятся все расходки за год. Покупатель = РасходнаяНакладная.Покупатель.Телефон
Мне необходимо вывести за год покупателей по Расходным накладным по следующим условиям:
1) "новых" покупателей, то есть тех, по которым первая расходная накладная проведена не раньше месяца
2) "ушедших" - по которым последняя расходная накладная проведена более полугода назад
3) "вернувшихся" - по которым разница даты проведения между расходками была более полугода
4) "постоянных" - в каждом месяце есть хотя бы одна проведенная расходка
Условия скажем так относительные, мне важно понять как прописывать подобное условия, может кто подсказать?
В данном коде выводятся все расходки за год. Покупатель = РасходнаяНакладная.Покупатель.Телефон
ВЫБРАТЬ
РасходнаяНакладная.Покупатель.Телефон КАК ПокупательТелефон,
РасходнаяНакладная.Ссылка КАК ПокупкиЗаГод
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
НЕ РасходнаяНакладная.ПометкаУдаления
И НЕ РасходнаяНакладная.Фирма.ПометкаУдаления
И РасходнаяНакладная.Проведен
И РасходнаяНакладная.Дата МЕЖДУ &НачалоГода И &КонецГода
И РасходнаяНакладная.Фирма.ВидФилиала = &ВидФилиала
И НЕ РасходнаяНакладная.Покупатель.Телефон ЕСТЬ NULL
И РасходнаяНакладная.Фирма.Город = &Город
СГРУППИРОВАТЬ ПО
РасходнаяНакладная.Покупатель.Телефон
РасходнаяНакладная.Ссылка
УПОРЯДОЧИТЬ ПО
ПокупкиЗаГод УБЫВ
ПоказатьПо теме из базы знаний
- Программисту на заметку: автозаполнение реквизитов документов и справочников
- Методика оптимизации программного кода 1С: проведение документов
- Выявляем и оптимизируем ресурсоемкие запросы 1С:Предприятия
- Загрузка чеков в 1С из ФНС в документы БП, УНФ, ERP, КА и УТ
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
Найденные решения
(1) а в чем сложность то? Вот вам пример по п.2
ВЫБРАТЬ
РасходнаяНакладная.Контрагент КАК Контрагент,
РасходнаяНакладная.Ссылка
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РасходнаяНакладная.Контрагент КАК Контрагент,
МАКСИМУМ(РасходнаяНакладная.Дата) КАК Дата
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
РасходнаяНакладная.Проведен
И РасходнаяНакладная.Дата МЕЖДУ &ДатаНачалоГода И &ДатаКонецГода
СГРУППИРОВАТЬ ПО
РасходнаяНакладная.Контрагент) КАК ВложенныйЗапрос
ПО РасходнаяНакладная.Дата = ВложенныйЗапрос.Дата
И РасходнаяНакладная.Контрагент = ВложенныйЗапрос.Контрагент
ГДЕ
РасходнаяНакладная.Дата МЕЖДУ &ДатаНачалоГода И &ДатаКонецГода
И РасходнаяНакладная.Проведен
И РАЗНОСТЬДАТ(РасходнаяНакладная.Дата, &ДатаКонецГода, МЕСЯЦ) >= 6
УПОРЯДОЧИТЬ ПО
Контрагент
АВТОУПОРЯДОЧИВАНИЕ
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) а в чем сложность то? Вот вам пример по п.2
ВЫБРАТЬ
РасходнаяНакладная.Контрагент КАК Контрагент,
РасходнаяНакладная.Ссылка
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РасходнаяНакладная.Контрагент КАК Контрагент,
МАКСИМУМ(РасходнаяНакладная.Дата) КАК Дата
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
РасходнаяНакладная.Проведен
И РасходнаяНакладная.Дата МЕЖДУ &ДатаНачалоГода И &ДатаКонецГода
СГРУППИРОВАТЬ ПО
РасходнаяНакладная.Контрагент) КАК ВложенныйЗапрос
ПО РасходнаяНакладная.Дата = ВложенныйЗапрос.Дата
И РасходнаяНакладная.Контрагент = ВложенныйЗапрос.Контрагент
ГДЕ
РасходнаяНакладная.Дата МЕЖДУ &ДатаНачалоГода И &ДатаКонецГода
И РасходнаяНакладная.Проведен
И РАЗНОСТЬДАТ(РасходнаяНакладная.Дата, &ДатаКонецГода, МЕСЯЦ) >= 6
УПОРЯДОЧИТЬ ПО
Контрагент
АВТОУПОРЯДОЧИВАНИЕ
Показать
(2) подскажите, правильно ли я понял принцип?
1. во вложенном запросе мы отбираем последнюю проведенную расходку по контрагенту
2. далее мы отбираем те последние расходки, которые были проведены более чем 6 месяцев назад
Получается, по п.1 я могу пойти по такому же принципу? только отбираю не функцией макс, а мин
с п.3 уже возникают сложности, потому тут не сравнивается с первой или последней расходкой, а с рандомной, нет мыслей как прописать условие
по п.4, к сожалению, также нет мыслей
1. во вложенном запросе мы отбираем последнюю проведенную расходку по контрагенту
2. далее мы отбираем те последние расходки, которые были проведены более чем 6 месяцев назад
Получается, по п.1 я могу пойти по такому же принципу? только отбираю не функцией макс, а мин
с п.3 уже возникают сложности, потому тут не сравнивается с первой или последней расходкой, а с рандомной, нет мыслей как прописать условие
по п.4, к сожалению, также нет мыслей
(7)
п.3 необязательно между последними, главное чтобы за год между последующими друг за другом расходками было больше 6 месяцев.
Допустим, "какая-нибудь расходка" проведена 10 января 2019, а именно последующая только 15 июня 2019
п.4 достаточно перечня контрагентов
п.3 необязательно между последними, главное чтобы за год между последующими друг за другом расходками было больше 6 месяцев.
Допустим, "какая-нибудь расходка" проведена 10 января 2019, а именно последующая только 15 июня 2019
п.4 достаточно перечня контрагентов
(7) по п.3 получилось выполнить проверку среди всех расходок контрагента, но как выполнить проверку по последующим друг за другом расходкам, нет мыслей
ВЫБРАТЬ
РасходнаяНакладная.Покупатель.Телефон КАК ПокупательТелефон,
РасходнаяНакладная.Ссылка КАК ПокупкиЗаГод,
РасходнаяНакладная.Дата КАК Дата1
ПОМЕСТИТЬ Т1
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
НЕ РасходнаяНакладная.ПометкаУдаления
И НЕ РасходнаяНакладная.Фирма.ПометкаУдаления
И РасходнаяНакладная.Проведен
И РасходнаяНакладная.Дата МЕЖДУ &НачалоГода И &КонецГода
И РасходнаяНакладная.Фирма.ВидФилиала = &ВидФилиала
И НЕ РасходнаяНакладная.Покупатель.Телефон ЕСТЬ NULL
И РасходнаяНакладная.Фирма.Город = &Город
СГРУППИРОВАТЬ ПО
РасходнаяНакладная.Покупатель.Телефон,
РасходнаяНакладная.Ссылка,
РасходнаяНакладная.Дата
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
РасходнаяНакладная.Покупатель.Телефон КАК ПокупательТелефон,
РасходнаяНакладная.Ссылка КАК ПокупкиЗаГод,
РасходнаяНакладная.Дата КАК Дата2
ПОМЕСТИТЬ Т2
ИЗ
Документ.РасходнаяНакладная КАК РасходнаяНакладная
ГДЕ
НЕ РасходнаяНакладная.ПометкаУдаления
И НЕ РасходнаяНакладная.Фирма.ПометкаУдаления
И РасходнаяНакладная.Проведен
И РасходнаяНакладная.Дата МЕЖДУ &НачалоГода И &КонецГода
И РасходнаяНакладная.Фирма.ВидФилиала = &ВидФилиала
И НЕ РасходнаяНакладная.Покупатель.Телефон ЕСТЬ NULL
И РасходнаяНакладная.Фирма.Город = &Город
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Т1.ПокупательТелефон КАК ПокупательТелефон,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т1.ПокупкиЗаГод) КАК ПокупкиЗаГод
ИЗ
Т1 КАК Т1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Т2 КАК Т2
ПО Т1.ПокупательТелефон = Т2.ПокупательТелефон
ГДЕ
РАЗНОСТЬДАТ(Т1.Дата1, Т2.Дата2, МЕСЯЦ) >= 6
СГРУППИРОВАТЬ ПО
Т1.ПокупательТелефон
Показать
как вариант - каждое из условий в отдельный запрос и все объединяется
типа так
// запрос по условию 1
ВЫБРАТЬ....
ГДЕ ...
ОБЪЕДИНИТЬ
// запрос по условию 2
ВЫБРАТЬ ...
ГДЕ...
ОБЪЕДИНИТЬ... и т.д.
тоже самое можно сделать и через временные таблицы
типа так
// запрос по условию 1
ВЫБРАТЬ....
ГДЕ ...
ОБЪЕДИНИТЬ
// запрос по условию 2
ВЫБРАТЬ ...
ГДЕ...
ОБЪЕДИНИТЬ... и т.д.
тоже самое можно сделать и через временные таблицы
Выбрать Различные
Расходная.Контрагент, НачалоМесяца(Расходная.Дата)
ПОМЕСТИТЬ Доки
Из Документ.РасходнаяНакладная Как Расходная
ГДЕ Расходная.Дата Между &Начало и &Конец
;
Выбрать
"Новые"
Доки.Контрагент
Из Доки Как Доки
Имеющие Минимум(Доки.Дата) > &НачалоТекущегоМесяца
Объединить Все
Выбрать
"Ушли"
Доки.Контрагент
Из Доки Как Доки
Имеющие Максимум(Доки.Дата) > &Середина
Объединить Все
Выбрать
"Вернувшиеся Что то вроде "
Доки.Контрагент,
Из Доки Как Доки
Левое соединение (Выбрать * Из Доки Как Доки) Как ВЗ
Где
РазностьДат(ВТ.Дата, ВЗ.Дата, Месяц) >6
Объединить все
Выбрать
"Постоянные"
Доки.Контрагент
Из Доки Как Доки
Имеющие Количество(Различные Доки.Дата) =12
Расходная.Контрагент, НачалоМесяца(Расходная.Дата)
ПОМЕСТИТЬ Доки
Из Документ.РасходнаяНакладная Как Расходная
ГДЕ Расходная.Дата Между &Начало и &Конец
;
Выбрать
"Новые"
Доки.Контрагент
Из Доки Как Доки
Имеющие Минимум(Доки.Дата) > &НачалоТекущегоМесяца
Объединить Все
Выбрать
"Ушли"
Доки.Контрагент
Из Доки Как Доки
Имеющие Максимум(Доки.Дата) > &Середина
Объединить Все
Выбрать
"Вернувшиеся Что то вроде "
Доки.Контрагент,
Из Доки Как Доки
Левое соединение (Выбрать * Из Доки Как Доки) Как ВЗ
Где
РазностьДат(ВТ.Дата, ВЗ.Дата, Месяц) >6
Объединить все
Выбрать
"Постоянные"
Доки.Контрагент
Из Доки Как Доки
Имеющие Количество(Различные Доки.Дата) =12
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот