Имя: Пароль:
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) Не забудьте в перерыве в типовые глянуть... Например на структуру индексов АдресногоКлассификатора.
AdBlock убивает бесплатный контент. 1Сергей