Имя: Пароль:
1C
1С v8
Хитрые задачи на запросы? ☑
0 Нуф-Нуф
 
23.05.12
✎
13:05
Для повышения собственной самооценки и разминки мозга, предлагайте
хитрые задачи на составление запросов, ОПТИМАЛЬНЫХ запросов.
Будем пробовать решить.
1 Жан Пердежон
 
23.05.12
✎
13:06
www.sql-ex.ru
2 DrShad
 
23.05.12
✎
13:07
ну напиши разделение n количества номенклатуры на m количество складов, например
3 shuhard
 
23.05.12
✎
13:08
4 Нуф-Нуф
 
23.05.12
✎
13:11
(1) интересно
(2) эээ, не догнал...
(3) гляну
5 ptiz
 
23.05.12
✎
13:12
Как получить произведение по колонке таблицы?
А то СУММА() есть, а ПРОИЗВЕДЕНИЕ() нету.
6 1C-band
 
23.05.12
✎
13:13
Таблица с полями:
- ID задачи
- Наименование задачи
- ID предыдущей задачи

Проверить данные (граф?) на зацикленность SQL-запросом.
7 shuhard
 
23.05.12
✎
13:19
(4) [гляну]
погляди,
написанные Глорией 10 лет назад запросы изумительны
8 experimentator76
 
23.05.12
✎
13:29
(7) дык он вероятно просит на ущербных восьмерошных запросах )

(5) присоединяюсь)
9 GROOVY
 
23.05.12
✎
13:34
Пускай есть регистр накопления остатков "ПартииТоваров": Товар, Партия, Количество, Стоимость.
Есть документ "Продажа" в табличной части которого: Товар, Партия, Количество.

Нужно построить запрос который получит данные для партионного списания, причем указанная партия в ТЧ документа списывается всегда первой, а если ее не хватает или она не указала происходит простое партионное списание по методу FIFO.

В ТЧ документа можно указывать один и тот же товар несколько раз с разными партиями или без них.

Задачу нужно решить исключительно запросом. То есть результат запроса должен по сути содержать таблицу движения регистра.
10 serffer
 
23.05.12
✎
13:43
1. Срез последних вручную
2. Остатки и обороты вручную
3. проставить номер строки у списка документов
4. вывести пары контрагентов поставляющие одинаковое число номенклатуры
5. вывести пары контрагентов поставляющие одинаковый перечень номенклатуры
6. грузы максимально равномерно распределить по машинам(задача про ранец)
11 Kashemir
 
23.05.12
✎
15:10
(9) Пусть тебя совесть мучает - оставил меня без обеда :)


ВЫБРАТЬ
   ПродажаТЧ.Товар КАК Товар,
   ПродажаТЧ.Партия КАК Партия,
   СУММА(ПродажаТЧ.Количество) КАК Количество
ПОМЕСТИТЬ ТЧ
ИЗ
   Документ.Продажа.ТЧ КАК ПродажаТЧ
ГДЕ
   ПродажаТЧ.Ссылка = &ДокументПродажи

СГРУППИРОВАТЬ ПО
   ПродажаТЧ.Товар,
   ПродажаТЧ.Партия

ИНДЕКСИРОВАТЬ ПО
   Товар,
   Партия
;

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

ИНДЕКСИРОВАТЬ ПО
   Товар,
   Партия
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТЧ.Товар,
   ТЧ.Партия,
   ТЧ.Количество,
   ВЫБОР
       КОГДА ТЧ.Количество <= ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0)
           ТОГДА ТЧ.Количество
       ИНАЧЕ ОстаткиНаСкладах.КоличествоОстаток
   КОНЕЦ КАК СписаноКоличество,
   ВЫБОР
       КОГДА ТЧ.Количество <= ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0)
           ТОГДА ВЫБОР
                   КОГДА ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0) = 0
                       ТОГДА 0
                   ИНАЧЕ ВЫРАЗИТЬ(ТЧ.Количество * (ОстаткиНаСкладах.СтоимостьОстаток / ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0)) КАК ЧИСЛО(19, 0))
               КОНЕЦ
       ИНАЧЕ ОстаткиНаСкладах.СтоимостьОстаток
   КОНЕЦ КАК СписанаСтоимость
ПОМЕСТИТЬ РаспределеноПоУказаннымПартиям
ИЗ
   ТЧ КАК ТЧ
       ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиНаСкладах КАК ОстаткиНаСкладах
       ПО (ОстаткиНаСкладах.Товар = ТЧ.Товар)
           И (ОстаткиНаСкладах.Партия = ТЧ.Партия)
;

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

СГРУППИРОВАТЬ ПО
   ОстаткиНаСкладах.Товар,
   ОстаткиНаСкладах.Партия

ИМЕЮЩИЕ
   СУММА(ОстаткиНаСкладах.КоличествоОстаток - РаспределеноПоУказаннымПартиям.СписаноКоличество) > 0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   РаспределеноПоУказаннымПартиям.Товар КАК Товар,
   СУММА(РаспределеноПоУказаннымПартиям.Количество - РаспределеноПоУказаннымПартиям.СписаноКоличество) КАК Количество
ПОМЕСТИТЬ ПодлежитДораспределению
ИЗ
   РаспределеноПоУказаннымПартиям КАК РаспределеноПоУказаннымПартиям

СГРУППИРОВАТЬ ПО
   РаспределеноПоУказаннымПартиям.Товар

ИМЕЮЩИЕ
   СУММА(РаспределеноПоУказаннымПартиям.Количество - РаспределеноПоУказаннымПартиям.СписаноКоличество) > 0

ИНДЕКСИРОВАТЬ ПО
   Товар
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Товар,
   ВложенныйЗапрос.Партия,
   ВложенныйЗапрос.КоличествоНакопительныйОстаток,
   ОстаткиЗаВычетомПриоритетыхПартий.КоличествоОстаток,
   ОстаткиЗаВычетомПриоритетыхПартий.СтоимостьОстаток
ПОМЕСТИТЬ НумерованныеПартииСНакопительнымОстатком
ИЗ
   (ВЫБРАТЬ
       ОстаткиЗаВычетомПриоритетыхПартий.Товар КАК Товар,
       ОстаткиЗаВычетомПриоритетыхПартий.Партия КАК Партия,
       СУММА(ОстаткиЗаВычетомПриоритетыхПартий1.КоличествоОстаток) КАК КоличествоНакопительныйОстаток
   ИЗ
       ОстаткиЗаВычетомПриоритетыхПартий КАК ОстаткиЗаВычетомПриоритетыхПартий
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиЗаВычетомПриоритетыхПартий КАК ОстаткиЗаВычетомПриоритетыхПартий1
           ПО ОстаткиЗаВычетомПриоритетыхПартий.Товар = ОстаткиЗаВычетомПриоритетыхПартий1.Товар
               И ОстаткиЗаВычетомПриоритетыхПартий.Партия >= ОстаткиЗаВычетомПриоритетыхПартий1.Партия
   
   СГРУППИРОВАТЬ ПО
       ОстаткиЗаВычетомПриоритетыхПартий.Товар,
       ОстаткиЗаВычетомПриоритетыхПартий.Партия) КАК ВложенныйЗапрос
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиЗаВычетомПриоритетыхПартий КАК ОстаткиЗаВычетомПриоритетыхПартий
       ПО ВложенныйЗапрос.Товар = ОстаткиЗаВычетомПриоритетыхПартий.Товар
           И ВложенныйЗапрос.Партия = ОстаткиЗаВычетомПриоритетыхПартий.Партия
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПодлежитДораспределению.Товар,
   НумерованныеПартииСНакопительнымОстатком.Партия,
   ВЫБОР
       КОГДА ПодлежитДораспределению.Количество >= ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0)
           ТОГДА ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0)
       ИНАЧЕ ПодлежитДораспределению.Количество + ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0) - ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0)
   КОНЕЦ КАК КоличествоСписания,
   ВЫБОР
       КОГДА ПодлежитДораспределению.Количество >= ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0)
           ТОГДА ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.СтоимостьОстаток, 0)
       КОГДА ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0) = 0
           ТОГДА 0
       ИНАЧЕ (ПодлежитДораспределению.Количество + ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0) - ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0)) * (ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.СтоимостьОстаток, 0) / ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0))
   КОНЕЦ КАК СтоимостьСписания
ИЗ
   ПодлежитДораспределению КАК ПодлежитДораспределению
       ЛЕВОЕ СОЕДИНЕНИЕ НумерованныеПартииСНакопительнымОстатком КАК НумерованныеПартииСНакопительнымОстатком
       ПО ПодлежитДораспределению.Товар = НумерованныеПартииСНакопительнымОстатком.Товар
           И (ПодлежитДораспределению.Количество >= ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0)
               ИЛИ ПодлежитДораспределению.Количество > ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоНакопительныйОстаток, 0) - ЕСТЬNULL(НумерованныеПартииСНакопительнымОстатком.КоличествоОстаток, 0))

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   РаспределеноПоУказаннымПартиям.Товар,
   РаспределеноПоУказаннымПартиям.Партия,
   РаспределеноПоУказаннымПартиям.СписаноКоличество,
   РаспределеноПоУказаннымПартиям.СписанаСтоимость
ИЗ
   РаспределеноПоУказаннымПартиям КАК РаспределеноПоУказаннымПартиям
12 Kashemir
 
23.05.12
✎
15:16
+ (10) FIFО забыл

вместо
И ОстаткиЗаВычетомПриоритетыхПартий.Партия >= ОстаткиЗаВычетомПриоритетыхПартий1.Партия

нужно

И (ОстаткиЗаВычетомПриоритетыхПартий.Партия.Дата > ОстаткиЗаВычетомПриоритетыхПартий1.Партия.Дата
                   ИЛИ ОстаткиЗаВычетомПриоритетыхПартий.Партия.Дата = ОстаткиЗаВычетомПриоритетыхПартий1.Партия.Дата
                       И ОстаткиЗаВычетомПриоритетыхПартий.Партия >= ОстаткиЗаВычетомПриоритетыхПартий1.Партия)
13 GROOVY
 
23.05.12
✎
15:17
(12) Ага и партии в ТЧ документа тоже по хорошему сортировать надо.

Вечером гляну по поводу оптимальности, но код мне нравится :)
14 Ненавижу 1С
 
гуру
23.05.12
✎
15:18
коэффициенты СЛАУ и свободные члены заданы таблицами, требуется запросом получить значения решения СЛАУ
15 Kashemir
 
23.05.12
✎
15:46
+(12) таки LIFO получилось ... дубль правка

И (ОстаткиЗаВычетомПриоритетыхПартий.Партия.Дата < ОстаткиЗаВычетомПриоритетыхПартий1.Партия.Дата
                   ИЛИ ОстаткиЗаВычетомПриоритетыхПартий.Партия.Дата = ОстаткиЗаВычетомПриоритетыхПартий1.Партия.Дата
                       И ОстаткиЗаВычетомПриоритетыхПартий.Партия <= ОстаткиЗаВычетомПриоритетыхПартий1.Партия)

+(13) По идее по оптимальности должно быть норм - не думаю что возникнут какие-то сложности. Сортировать партии в тч - это уже тюнинг :)
16 zak555
 
23.05.12
✎
16:01
ВЫБОР
       КОГДА ТЧ.Количество <= ЕСТЬNULL(ОстаткиНаСкладах.КоличествоОстаток, 0)
           ТОГДА ТЧ.Количество
       ИНАЧЕ ОстаткиНаСкладах.КоличествоОстаток
   КОНЕЦ КАК СписаноКоличество


у меня в ТЧ количество 10 штук, а на складе его нет
тогда в СписаноКоличество будет NULL
17 Лефмихалыч
 
23.05.12
✎
16:04
(0) держи:
1. Остатки на каждую дату в запросе
2. Нумерация строк в запросе
3. Получить вторые n записей
4. Из справочника с иерархией элементов получить только те элементы, у которых:
 4.1 нет подчиненных
 4.2 есть подчиненные
18 rs_trade
 
23.05.12
✎
16:06
(0) куцым языком запросов 1С оптимально не попишешь
19 IKSparrow
 
23.05.12
✎
16:09
Хех, поросёнок слился... :))
20 IKSparrow
 
23.05.12
✎
16:10
(18) Полностью согласен. Хотя всё же есть гении/извращенцы умеющие его применять.
21 Axel2009
 
23.05.12
✎
16:10
(0) рассчитать оборачиваемость товара по средним остаткам за месяц, с учетом прогноза продаж на этот месяц, учитывая что прогноз считается по последнйе дате наличия документа продажи.
т.е.
к1 100руб, отчитался 15 числа - прогноз 200 руб.
к2 150руб, отчитался 5 числа - прогноз 900 руб.
22 Kashemir
 
23.05.12
✎
16:41
(16) Если желаешь контроль остатков - сделал дополнительную колонку и сравни итог по списаному/списываему. Такой задачи в исходной постановке нет.
23 Kashemir
 
23.05.12
✎
16:43
+(22) Либо любым другим способом. Эта проблема решается без особых затруднений.
24 fisher
 
23.05.12
✎
17:21
(1) +1
Тема закрыта :)
25 zak555
 
23.05.12
✎
17:53
(22) ты ж используешь левое соединение, а не внутренние => надо учесть
26 Kashemir
 
23.05.12
✎
17:57
(25) Согласен - причем это не единственная мелочь которую стоило бы поправить - лень возиться :)
27 andrewks
 
23.05.12
✎
18:00
(0) преобразование текстовой записи рационального числа в соответствующее число в статическом запросе
28 crazy_killer
 
23.05.12
✎
19:54
*закладка*
29 zak555
 
24.05.12
✎
09:29
GROOVY так и не посмотрел ?
30 sparklemal
 
24.05.12
✎
09:48
привет, есть такая задача: на обработке есть ТабЧасть с двумя колонками (номенклатура, характеристика). Нужно выбрать все документы "ПоступлениеТоваровУслуг" в которых встречается ТОЛЬКО сочетание ВСЕХ записей (номенклатуры,характеристики) из ТабЧасти обработки. Например в ТабЧасти задали Номенкл1, Номенкл2. Если в документе будет Номенкл1,Номенкл2,Номенкл3, то уже данный документ не должен попасть в выборку.
Я так понимаю что можно решить задачу так: загнать ТабЧасть в временную таблицу и искать документы в которых встречается номенклатура из временной таблицы с условием по количеству записей в ТЧ документа и количечству записей во временной таблице. НО, может быть как нить еще можно решить данную задачу?
31 rphosts
 
24.05.12
✎
10:00
Хорошая тема!
Ещё задачки будут?
32 ptrtss
 
24.05.12
✎
10:05
Вот вам, коллеги, на работе делать-то нехрен
33 rphosts
 
24.05.12
✎
10:18
(32) кто сказал, что на раб?
В субб. иду на ДР, в воскр. буду под консоль запросов приходить в чувство.... задача из (9) интересная (делал подобное по аналогам, но там было достаточно при обходе анализировать остаток несписанного) да и другие тоже неплохие есть.
34 Axel2009
 
24.05.12
✎
11:57
(30) не сложная задача
выбрать поступление из документ.поступления внутреннее соединение наборпар
по поступление.номенклатура = наборпар.номенклатура
И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры
сгруппировать по поступление
имеющие количество(*) = (ВЫБРАТЬ количество(*) из наборпар)
35 sparklemal
 
24.05.12
✎
12:00
(34) так с условием по количеству строк я решил, а вот без него как сделать можно?
36 Axel2009
 
24.05.12
✎
12:24
(35) (30) не сложная задача
выбрать поступление из документ.поступления ПОЛНОЕ соединение наборпар
по поступление.номенклатура = наборпар.номенклатура
И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры
сгруппировать по поступление
имеющие максимум(выбор когда поступление.номенклатура есть null или наборпар.номенклатура есть null тогда максимум иначе ложь конец) = ложь
37 Axel2009
 
24.05.12
✎
12:24
(36)+
попутал..
выбрать поступление из документ.поступления ПОЛНОЕ соединение наборпар
по поступление.номенклатура = наборпар.номенклатура
И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры
сгруппировать по поступление
имеющие максимум(выбор когда поступление.номенклатура есть null или наборпар.номенклатура есть null тогда ИСТИНА иначе ложь конец) = ложь
38 FoxFox
 
24.05.12
✎
12:26
(0) в задачнике на спеца платформы полно таких
39 Axel2009
 
24.05.12
✎
12:26
неправильно написал. нужен кроссджоин еще
выбрать поступление из документ.поступления.товары ПОЛНОЕ соединение (выбрать номенклатура, характеристиканоменклатуры, поступление из наборпар, (выбрать поступление из документ.поступления) как таблицапоступлений)
по поступление.номенклатура = наборпар.номенклатура
И поступление.характеристиканоменклатуры = наборпар.характеристиканоменклатуры
И поступление.поступление = наборпар.поступление
сгруппировать по поступление
имеющие максимум(выбор когда поступление.номенклатура есть null или наборпар.номенклатура есть null тогда ИСТИНА иначе ложь конец) = ложь
40 АНДР
 
24.05.12
✎
13:04
(0) Не забудьте в перерыве в типовые глянуть... Например на структуру индексов АдресногоКлассификатора.