Имя: Пароль:
1C
1С v8
Дерево Значений на экзамене Специалист по платформе
, , ,
0 masenshi
 
28.08.14
05:02
Можно ли в разделе оперативный учет при решении задач в проведений расходной накладной пользоваться выгрузкой результата запроса в Дерево Значений вместо Выборки, как это все любят делать?

Не будет ли это ошибкой?
"Выгрузка результата запроса в промежуточную таблицу (например, в таблицу значений) без необходимости". Минус 1 балл.

ДЗ позволяет не строить сложный запрос на 200 строк как в примере решения задачи 1.4 из официального сборника.
6 Wobland
 
28.08.14
05:52
(3) (4) уже принял с утра?
7 Любопытная
 
28.08.14
05:53
(3) А можно прям на примере? Для тех кто в танке :)
8 masenshi
 
28.08.14
06:06
(5) Таки сделано в примере. Так не лучше на мой взгляд, потому что запрос получается слишком сложный (в сборнике, например) для такой простой задачи.

Поэтому возникла эта тема.
9 mehfk
 
28.08.14
06:10
(0) Обходи запрос по группировкам и строй дерево списания партий.
10 masenshi
 
28.08.14
06:10
(5) (6) (7) Если вы знакомы с данной задачей, то должны знать, что в ней вся сложность заключается в том, что партии могут указываться в ТЧ документа Расходная накладная. И списание идет по партиям, указанным в документе, а если количества товара недостаточно (не хватило), то списание осуществляется с учетом учетной политики (фифо, лифо).
11 Любопытная
 
28.08.14
06:13
(10) Знакома. Решала ее в первой попытке, к опер учету вопросов не возникло, но дерево я не использовала точно.  Можешь показать свое решение с деревом?
12 masenshi
 
28.08.14
06:13
(9) я делаю так
ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

и спрашиваю не будет ли это считаться ошибкой на экзамене. а не на практике!

И дерево мне нужно чтобы делать параллельно списание по партиям в ДЗ, и тем самым не загромождать запрос.
13 masenshi
 
28.08.14
06:18
(11) На мыло если только. Ведь решение авторское ))
14 Лодырь
 
28.08.14
06:21
(10) Эта задача стандартная в качестве теста для кандидатов в нашей компании, и я ее проверяю ) Так что уж ее решение знаю как свои 5 пальцев.
15 masenshi
 
28.08.14
06:22
(11) отправил
16 Любопытная
 
28.08.14
06:23
(13) Да боже ж мой, кому оно нужно, кроме вас)) Или боитесь, что засмеют? Решение рабочее? Результат запроса получается и используется единожды? Если в дальнейшем результат запроса не обрабатывается, а используется только для создания движений документа, то (имхо конечно) решение правильное
17 masenshi
 
28.08.14
06:23
(14) иии? Дерево под запретом или нет?
Или только перекрученным на 200 раз запросом, можно сделать обычное списание по партиям?
18 Wobland
 
28.08.14
06:26
(12) а Выгрузить() лучше, чем Выбрать()?
19 masenshi
 
28.08.14
06:28
(16) Проверьте почту. Могу при необходимости ДТ шник отправить.

Что имеется ввиду обрабатывается? Если при списании количества, я параллельно делаю списание в ДЕРЕВЕ. Чтобы в случае, когда мне эта партия попадется снова, то количество остаток было обновленным.
Это актуально в пределах одной конкретной номенклатуры.
20 masenshi
 
28.08.14
06:29
(18) Если с утра принять, то да ))
21 Любопытная
 
28.08.14
06:30
(19) Проверила. Читаю. Как все сложно) У меня, по-моему, запрос проще получился.
22 Любопытная
 
28.08.14
06:31
+(21) Ну и всякая фигня типа Прервать; и Продолжить;  мне не очень нравится. Но это мое личное субъективное понимание мира)
23 masenshi
 
28.08.14
06:31
(21) Можете показать?
24 Любопытная
 
28.08.14
06:33
(23) Сейчас точно нет) На работе решений нет, дт с экзамена я не утащила, воспроизводить сейчас не очень хочется. Вечером могу заново написать.
25 masenshi
 
28.08.14
06:35
(24) так и ваш вердикт? Могут балл минусовать?
26 Лодырь
 
28.08.14
06:42
(17) Решения принимаются всяческие, но решение 1 запросом встречается дай бог у 5% кандидатов. Подавляющее большинство решает обходом выборки.
(25) Я бы минусовал, поскольку использование дерева непонятно зачем, хочешь - обходи выборку по группировкам. Но спрашивать то надо не меня, а конкретного экзаменатора, который тут отсутствует.
27 Любопытная
 
28.08.14
06:46
(25) Отправила вам ответ. Имейте в виду, что я не спец, экзамен я завалила. Правда на расчетной задаче, к опер учету претензий не было.
(26) Одним запросом это в смысле запросом сформировать ТЗ, которую можно напрямую загрузить в движения без пост обработки?
28 Лодырь
 
28.08.14
06:47
(27) Ага, именно так.
29 Любопытная
 
28.08.14
06:49
(28) Не, я так не смогу. Даже пытаться придумать это на данном этапе не буду)) Фантазии не хватит
30 Лодырь
 
28.08.14
06:51
(29) Зачем придумывать? Все необходимое давно уже придумано. Лежит на мисте в книге знаний. Обычное фифо/лифо в запросе, слегка модифицированное для повышения приоритета конкретной партии.
31 masenshi
 
28.08.14
06:52
(30) Ничего подобного. Это высказывание верно к задаче 1.2
32 Любопытная
 
28.08.14
06:54
(30) А ссылку можно? Для общего развития :)
33 Лодырь
 
28.08.14
06:54
(31) Хотите пари?
34 masenshi
 
28.08.14
06:55
(33) Да
35 Лодырь
 
28.08.14
06:57
(34) Ок, что в роли ставки? Не поленюсь, в кои веки решу задачу сам, не просто так же мне выкладывать тут решение?
36 Любопытная
 
28.08.14
06:57
Ребят, ну дайте ссылку на статью в КЗ. Не жадничайте :)
37 Wobland
 
28.08.14
06:58
(35) предлагаю по ведру поп-корна этим добрым люядм:     Admin_Net_1C
    MaxS
    Steini
    Wobland
    masenshi
    twisster
    Лодырь
    Любопытная
38 Лодырь
 
28.08.14
06:58
(36) общий подход можно увидеть набрав в поиске "фифо лифо в запросе"
39 Любопытная
 
28.08.14
07:02
(38) Если б нашла, не спрашивала бы. Поиск говорит "ничего не найдено"
40 masenshi
 
28.08.14
07:03
(35) Чье решение сильнее и правильнее. Тому слава и почет.
Но у вас в (30) было сказано, что
"Обычное фифо/лифо в запросе, слегка модифицированное для повышения приоритета конкретной "

Я не согласен что "слега". Скорее очень сильно модифицированное.

"Слегка" актуально для задачи 1.2
а пари у нас с задачей 1.4
41 Любопытная
 
28.08.14
07:05
Елки, еще б задачи по номерам знать))
42 Лодырь
 
28.08.14
07:10
(40) Если проблема в слове "слегка", то не вижу смысла спорить, поскольку четкие критерии в данном случае неописаны.
(41) v8: FIFO в запросе
43 masenshi
 
28.08.14
07:10
(38) (41) В задаче 1.2 партия указывается в шапке документа.
В задаче 1.4 партии указываются в ТЧ документа и при списании если количества не хватает, тогда списывать нужно согласно учетной политике, т.е. так просто соединиться по партии не получится. Потому что задача подразумевает указание разных партий для одной  номенклатуры в одном документе.
44 Любопытная
 
28.08.14
07:15
(42) Спасибо
45 masenshi
 
28.08.14
07:16
(42) В сборнике пример решения задачи 1.4, о которой мы говорим, имеет запрос содержащий чуть больше 200 строк.
Тогда как в задаче 1.2 в запросе строк 60.

Дело конечно же не в количестве строк, а в сложности самой задачи и в простоте (сложности) ее решения.

Вы путаете задачу 1.2 и 1.4
46 tdm
 
28.08.14
07:25
(0) ну сможете обосновать рискуйте)) - хотя задачи в сборнике насколько помню просты и нет там никаких запросов на 200 строк...хотя если успеете все три задачи решить с вашими мега-запросами за 3 часа почему нет)
ну и имхо идите ТОЛЬКО на очную сдачу, чтобы вы могли с экзаменатором поговорить - на удаленной сдаче замучаетесь письма слать с объяснениями)))
47 masenshi
 
28.08.14
07:32
(46) В том то и дело, что в официальном сборнике присутствует именно пример решения задачи 1.4. И запрос там ацский. В 200 строк по опер. учету.
Я тоже считаю, что так быть не должно. Но это так и есть. 1 безумная задачка на удачу.
48 tdm
 
28.08.14
07:33
(47) огласите уже текст задачи))
49 masenshi
 
28.08.14
07:39
Компания занимается оптовой торговлей. Поступление товаров отражается
документом «Приходная накладная», продажа - «Расходная накладная».
Складской учет товаров не ведется.  
При  проведении  расходной  накладной  при  нехватке  товара  необходимо
выдавать  соответствующее  предупреждение  с  указанием  количества  нехватки  и
не позволять проводить документ.
Списание себестоимости товаров должно быть организовано по партиям, в
зависимости  от  текущего  значения  принятого  на  этот  год  в  учетной  политике
метода  списания  себестоимости (FIFO или LIFO) и  указанной  в  документе (в
табличной части документа) партии. В  первую
очередь  должен  списываться  товар  из  указанной  в  табличной  части  партии.  В
случае  если  товара  по  выбранной  партии  не  хватает (или  нет),  то  товар
списывается в соответствии с текущей учетной политикой.
50 tdm
 
28.08.14
07:43
(49) ну и ?) пакетный запрос и выборка решит проблему...хотя конечно кол-во строк не посчитать в уме))
51 floody
 
28.08.14
07:45
по сути вопроса:  "Выгрузка результата запроса в промежуточную таблицу (например, в таблицу значений) БЕЗ НЕОБХОДИМОСТИ". Минус 1 балл.

Если вам нужно, выгружайте на здоровье.
52 masenshi
 
28.08.14
07:48
(51) Именно об этом в (0) я и спрашивал.

Необходимость она то есть. Посчитает ли так экзаменатор?
53 masenshi
 
28.08.14
07:49
(37) Давай уже по ведру попкорна и закрываем тему.
54 Любопытная
 
28.08.14
07:55
(52) Если на этом построено решение задачи, то минусом это не будет, я вам сразу об этом сказала.
55 masenshi
 
28.08.14
07:56
(54) Спасибо большое!
56 mzelensky
 
28.08.14
08:01
(0)(49) Сразу скажу, что не пробовал прям вот реализовывать данную задачу, но решение видится так. Пакетный запрос:

1) Выбираем данные из документа
2) Левым соединением цепляем остакти по указанной партии
3) Еще одним левым соединением цепляем остатки по всем партиям, кроме указанной. Получаем таблицу с колонками

Номенклатура
КоличествоВДокументе
КоличествоОстатокПоУказаннойПартии
КоличествоОстатокПоОстальнымПартиям

Далее при обхедо анализируем и списывам так, как нужно.

Что я упустил?
57 masenshi
 
28.08.14
08:13
(56)
п. 2. Допустим нет на остатке данной партии или количества не хватает. Что тогда?
п. 3.
Допустим, в документе 3 строки с одной номенклатурой и разными партиями. На остатке, предположим тоже 3 партии. Итого получится 9 строк.
Куча дублей строк. Не сможем правильно списать остатки по партиям.
А если данной партии вообще нет на остатках? Откуда будем списывать?

Тут гадать не получится. Нужно решать. Потом себя проверять.
58 mzelensky
 
28.08.14
08:21
(57) "п. 2. Допустим нет на остатке данной партии или количества не хватает. Что тогда?". Обход:

Если КоличествоВДокументе >= ( КоличествоОстатокПоУказаннойПартии + КоличествоОстатокПоОстальнымПартиям) Тогда

НЕ ХВАТАЕТ ОСТАТКА

Конец


Если КоличествоВДокументе <= КоличествоОстатокПоУказаннойПартии Тогда

Просто списываем с указанной партии КоличествоВДокументе

Иначе

Сперва списываем с указанной партии под ноль, если нужно еще, то списываем с КоличествоОстатокПоОстальнымПартиям

Конец
59 mzelensky
 
28.08.14
08:27
(57) +

п. 3.
Допустим, в документе 3 строки с одной номенклатурой и разными партиями. На остатке, предположим тоже 3 партии. Итого получится 9 строк.
Куча дублей строк. Не сможем правильно списать остатки по партиям.
А если данной партии вообще нет на остатках? Откуда будем списывать?


Я подобный механизм прогонял на практической задаче (не на экзамене, а на практике). На сколько помню заводил дополнительно таблицу значений. При первом появлении номенклатуры добавлял ее в эту ТЗ, прописывал туда общий остаток. Далее списывал остаток с этой ТЗ уже. Т.е. использовал эту ТЗ как буфер для уменьшения общего остатка.
60 masenshi
 
28.08.14
08:36
(59) имхо за такое решение бал снимут точно.
61 masenshi
 
28.08.14
08:36
Ушел отсюда
62 NcSteel
 
28.08.14
08:40
(0) Дерево использовать нельзя, это ошибка.
63 mzelensky
 
28.08.14
08:43
(60) Такое решение будет работать куда лучше этого запроса:

ВЫБРАТЬ
    ВложенныйЗапрос.Ссылка,
    ВложенныйЗапрос.СуммаДокумента,
    ВЫБОР
        КОГДА ВложенныйЗапрос.СуммаДокументаИтог <= &Оплата
            ТОГДА ВложенныйЗапрос.СуммаДокумента
        ИНАЧЕ ВложенныйЗапрос.СуммаДокумента + &Оплата - ВложенныйЗапрос.СуммаДокументаИтог
    КОНЕЦ КАК Оплата
ИЗ
    (ВЫБРАТЬ
        РеализацияТоваровУслуг.Ссылка КАК Ссылка,
        РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента,
        СУММА(РеализацияТоваровУслуг1.СуммаДокумента) КАК СуммаДокументаИтог
    ИЗ
        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг1
            ПО РеализацияТоваровУслуг.МоментВремени >= РеализацияТоваровУслуг1.МоментВремени
    
    СГРУППИРОВАТЬ ПО
        РеализацияТоваровУслуг.Ссылка,
        РеализацияТоваровУслуг.СуммаДокумента) КАК ВложенныйЗапрос
ГДЕ
    ВложенныйЗапрос.СуммаДокументаИтог - ВложенныйЗапрос.СуммаДокумента < &Оплата

УПОРЯДОЧИТЬ ПО
    ВложенныйЗапрос.Ссылка.МоментВремени
64 masenshi
 
28.08.14
09:03
(63) Да откуда вообще взялся этот запрос?
65 masenshi
 
28.08.14
09:05
(62) Досадно. А почему же?
66 ptiz
 
28.08.14
09:09
Делать ФИФО/ЛИФО средствами запроса - это извращение.
Кое-кто известный давным-давно выкладывал списание по партиям, сделанное в чистом SQL (на 7.7, где от 1С осталась только оболочка), но там использовались курсоры.
Если ТЗ и ДЗ позволяют сделать код в разы читабельнее и быстрее - это правильно.
То, что в 1С писают кипятком исключительно от запросов - это говорит о том, что "страшно далеки они от народа".
67 mzelensky
 
28.08.14
09:09
(64) Тебе его еще в (42) Предложили.
68 tdm
 
28.08.14
09:10
(56) есть другой вариант решения - управляемые блокировки)
1.открываем транзакцию; запросом получаем ТЧ документа + соединяем её с партиями - делаем запись в РН;
2. запросом проверяем остатки регистра на минус(с учетом движений документа) - если минус ругаемся отменяем транзакцию, если минуса нет фиксируем транзакцию)
69 mzelensky
 
28.08.14
09:10
(66) +1 Согласен
70 tdm
 
28.08.14
09:13
+(68)- облегчаем себе задачу тем что не пытаемся уже в одном запросе сами себя на остаток проверить)
71 mzelensky
 
28.08.14
09:13
(68) Что-то ты вообще в другую степь ушел. Как я понял, основная проблема задачи в следующем:

Допустим, в документе 3 строки с одной номенклатурой и разными партиями. На остатке, предположим тоже 3 партии. Итого получится 9 строк.
Куча дублей строк. Не сможем правильно списать остатки по партиям.
А если данной партии вообще нет на остатках? Откуда будем списывать?

Т.е. когда несколько разных позиций требуют списания с ОДНОЙ кучи остатков (общей).
72 mzelensky
 
28.08.14
09:15
(71) А открывать транзакцию, записывать в РН, проверять, откатывать транзакицю - это вообще извращение. Еще большее, чем Делать ФИФО/ЛИФО средствами запроса.

Нагрузка колосальная. Вариант возникновения ошибки в разы больше.
73 masenshi
 
28.08.14
09:17
(67) О ужас! Не смотрите на это (42)
74 masenshi
 
28.08.14
09:20
Выкладываю решение, которым пользуется большинство.Чтобы вы меня поняли, что не зря хочу его "обойти"

Запрос.Текст = "ВЫБРАТЬ
                   |//Свернутые записи табличной части проводимого документа
                   |
                   |    РасходнаяНакладнаяТовары.Номенклатура,
                   |    РасходнаяНакладнаяТовары.Партия,
                   |    СУММА(РасходнаяНакладнаяТовары.Количество) КАК Количество,
                   |    СУММА(РасходнаяНакладнаяТовары.Сумма) КАК Сумма
                   |ПОМЕСТИТЬ РасходнаяНакладная
                   |ИЗ
                   |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяТовары
                   |ГДЕ
                   |    РасходнаяНакладнаяТовары.Ссылка = &Ссылка
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    РасходнаяНакладнаяТовары.Номенклатура,
                   |    РасходнаяНакладнаяТовары.Партия
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |//Остатки по всем партиям. Порядок записей должен быть изменен
                   |
                   |ВЫБРАТЬ
                   |    ОстаткиНоменклатурыОстатки.Номенклатура,
                   |    ОстаткиНоменклатурыОстатки.Партия,
                   |    ОстаткиНоменклатурыОстатки.КоличествоОстаток,
                   |    ОстаткиНоменклатурыОстатки.СуммаОстаток
                   |ПОМЕСТИТЬ ВсеОстатки
                   |ИЗ
                   |    РегистрНакопления.ОстаткиНоменклатуры.Остатки(
                   |            &Момент,
                   |            Номенклатура В
                   |                (ВЫБРАТЬ РАЗЛИЧНЫЕ
                   |                    РасходнаяНакладная.Номенклатура
                   |                ИЗ
                   |                    РасходнаяНакладная КАК РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |//Остатки только по партиям, указанным в документе, в количестве не большем, чем в документе
                   |
                   |ВЫБРАТЬ
                   |    ВсеОстатки.Номенклатура,
                   |    ВсеОстатки.Партия,
                   |    ВЫБОР
                   |        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
                   |            ТОГДА РасходнаяНакладная.Количество
                   |        ИНАЧЕ ВсеОстатки.КоличествоОстаток
                   |    КОНЕЦ КАК КоличествоВыбраннойПартии,
                   |    ВЫБОР
                   |        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
                   |            ТОГДА РасходнаяНакладная.Количество * ВсеОстатки.СуммаОстаток / ВсеОстатки.КоличествоОстаток
                   |        ИНАЧЕ ВсеОстатки.СуммаОстаток
                   |    КОНЕЦ КАК СуммаВыбраннойПартии,
                   |    1 КАК ПорядокСортировки
                   |ПОМЕСТИТЬ ПартииДокумента
                   |ИЗ
                   |    РасходнаяНакладная КАК РасходнаяНакладная
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеОстатки КАК ВсеОстатки
                   |        ПО РасходнаяНакладная.Номенклатура = ВсеОстатки.Номенклатура
                   |            И РасходнаяНакладная.Партия = ВсеОстатки.Партия
                   |
                   |ОБЪЕДИНИТЬ ВСЕ
                   |
                   |ВЫБРАТЬ
                   |    ВсеОстатки.Номенклатура,
                   |    ВсеОстатки.Партия,
                   |    ВЫБОР
                   |        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
                   |            ТОГДА ВсеОстатки.КоличествоОстаток - РасходнаяНакладная.Количество
                   |        ИНАЧЕ 0
                   |    КОНЕЦ,
                   |    ВЫБОР
                   |        КОГДА ВсеОстатки.КоличествоОстаток > РасходнаяНакладная.Количество
                   |            ТОГДА ВсеОстатки.СуммаОстаток - РасходнаяНакладная.Количество * ВсеОстатки.СуммаОстаток / ВсеОстатки.КоличествоОстаток
                   |        ИНАЧЕ 0
                   |    КОНЕЦ,
                   |    2
                   |ИЗ
                   |    РасходнаяНакладная КАК РасходнаяНакладная
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеОстатки КАК ВсеОстатки
                   |        ПО РасходнаяНакладная.Номенклатура = ВсеОстатки.Номенклатура
                   |            И РасходнаяНакладная.Партия = ВсеОстатки.Партия
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |// Остатки по оставшимся партиям:
                   |//    1.Остатки только по партиям, указанным в документе, с обратным знаком
                   |
                   |ВЫБРАТЬ
                   |    ПартииДокумента.Номенклатура,
                   |    ПартииДокумента.Партия,
                   |    -ПартииДокумента.КоличествоВыбраннойПартии КАК КоличествоВыбраннойПартии,
                   |    -ПартииДокумента.СуммаВыбраннойПартии КАК СуммаВыбраннойПартии,
                   |    2 КАК ПорядокСортировки
                   |ПОМЕСТИТЬ ОстальныеПартии
                   |ИЗ
                   |    ПартииДокумента КАК ПартииДокумента
                   |
                   |ОБЪЕДИНИТЬ ВСЕ
                   |
                   |//    2.Остатки по всем партиям
                   |
                   |ВЫБРАТЬ
                   |    ВсеОстатки.Номенклатура,
                   |    ВсеОстатки.Партия,
                   |    ВсеОстатки.КоличествоОстаток,
                   |    ВсеОстатки.СуммаОстаток,
                   |    2
                   |ИЗ
                   |    ВсеОстатки КАК ВсеОстатки
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |//    3.Свертка записей
                   |
                   |ВЫБРАТЬ
                   |    ОстальныеПартии.Номенклатура,
                   |    ОстальныеПартии.Партия,
                   |    СУММА(ОстальныеПартии.КоличествоВыбраннойПартии) КАК КоличествоВыбраннойПартии,
                   |    СУММА(ОстальныеПартии.СуммаВыбраннойПартии) КАК СуммаВыбраннойПартии,
                   |    ОстальныеПартии.ПорядокСортировки
                   |ПОМЕСТИТЬ СвернутыеОставшиесяПартии
                   |ИЗ
                   |    ОстальныеПартии КАК ОстальныеПартии
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    ОстальныеПартии.Номенклатура,
                   |    ОстальныеПартии.Партия,
                   |    ОстальныеПартии.ПорядокСортировки
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |//Остатки по всем партиям, упорядоченные необходимым образом
                   |
                   |ВЫБРАТЬ
                   |    ВложенныйЗапрос.Номенклатура,
                   |    ВложенныйЗапрос.Партия,
                   |    СУММА(ВложенныйЗапрос.КоличествоВыбраннойПартии) КАК КоличествоВыбраннойПартии,
                   |    СУММА(ВложенныйЗапрос.СуммаВыбраннойПартии) КАК СуммаВыбраннойПартии,
                   |    ВложенныйЗапрос.ПорядокСортировки
                   |ПОМЕСТИТЬ СвернутыеВсеПартии
                   |ИЗ
                   |    (ВЫБРАТЬ
                   |        ПартииДокумента.Номенклатура КАК Номенклатура,
                   |        ПартииДокумента.Партия КАК Партия,
                   |        ПартииДокумента.КоличествоВыбраннойПартии КАК КоличествоВыбраннойПартии,
                   |        ПартииДокумента.СуммаВыбраннойПартии КАК СуммаВыбраннойПартии,
                   |        ПартииДокумента.ПорядокСортировки КАК ПорядокСортировки
                   |    ИЗ
                   |        ПартииДокумента КАК ПартииДокумента
                   |  
                   |    ОБЪЕДИНИТЬ ВСЕ
                   |  
                   |    ВЫБРАТЬ
                   |        СвернутыеОставшиесяПартии.Номенклатура,
                   |        СвернутыеОставшиесяПартии.Партия,
                   |        СвернутыеОставшиесяПартии.КоличествоВыбраннойПартии,
                   |        СвернутыеОставшиесяПартии.СуммаВыбраннойПартии,
                   |        СвернутыеОставшиесяПартии.ПорядокСортировки
                   |    ИЗ
                   |        СвернутыеОставшиесяПартии КАК СвернутыеОставшиесяПартии) КАК ВложенныйЗапрос
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    ВложенныйЗапрос.Номенклатура,
                   |    ВложенныйЗапрос.Партия,
                   |    ВложенныйЗапрос.ПорядокСортировки
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |//Окончательная таблица
                   |
                   |ВЫБРАТЬ
                   |    Накладная.Номенклатура КАК Номенклатура,
                   |    Накладная.Количество КАК КоличествоВДокументе,
                   |    Накладная.Сумма КАК СуммаВДокументе,
                   |    ЕСТЬNULL(ОстаткиТоваров.Партия, 0) КАК Партия,
                   |    ЕСТЬNULL(ОстаткиТоваров.КоличествоВыбраннойПартии, 0) КАК КоличествоПартии,
                   |    ЕСТЬNULL(ОстаткиТоваров.СуммаВыбраннойПартии, 0) КАК СуммаПартии,
                   |    Накладная.Номенклатура.Представление
                   |ИЗ
                   |    (ВЫБРАТЬ
                   |        РасходнаяНакладная.Номенклатура КАК Номенклатура,
                   |        СУММА(РасходнаяНакладная.Количество) КАК Количество,
                   |        СУММА(РасходнаяНакладная.Сумма) КАК Сумма
                   |    ИЗ
                   |        РасходнаяНакладная КАК РасходнаяНакладная
                   |  
                   |    СГРУППИРОВАТЬ ПО
                   |        РасходнаяНакладная.Номенклатура) КАК Накладная
                   |        ЛЕВОЕ СОЕДИНЕНИЕ СвернутыеВсеПартии КАК ОстаткиТоваров
                   |        ПО Накладная.Номенклатура = ОстаткиТоваров.Номенклатура
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    ОстаткиТоваров.ПорядокСортировки,
                   |    ОстаткиТоваров.Партия.МоментВремени " + ПорядокПартий + "
                   |ИТОГИ
                   |    МАКСИМУМ(КоличествоВДокументе),
                   |    МАКСИМУМ(СуммаВДокументе),
                   |    СУММА(КоличествоПартии),
                   |    СУММА(СуммаПартии)
                   |ПО
                   |    Номенклатура";
75 mzelensky
 
28.08.14
09:20
(74) Это запрос, который рекомендует 1С ?
76 masenshi
 
28.08.14
09:21
(66) Делать ФИФО/ЛИФО средствами запроса - это извращение.
Иногда получается очень красиво
77 masenshi
 
28.08.14
09:22
(75) жесть, не  правда ли?
78 tdm
 
28.08.14
09:23
(71) да в другую))
просто к тому что есть другой вариант не один запрос а два - первым делаем черновую запись в РН а затем вторым запросом контроль на минус); я про методологически другой способ решения не конкретно этой задачи))
79 masenshi
 
28.08.14
09:23
(66) То, что в 1С писают кипятком исключительно от запросов - это говорит о том, что "страшно далеки они от народа".

(74) тут этого кипятка хватило
80 masenshi
 
28.08.14
09:25
(78) Знаю про что ты. Тут не применишь
81 tdm
 
28.08.14
09:26
82 mzelensky
 
28.08.14
09:26
(77)(80) Начало в полне понятное, но начиная с середины в голове уже тяжело это просчитать.

И что в итоге на выходе получается? Покажи еще обработку выборки из запроса.
83 mzelensky
 
28.08.14
09:29
(78) Ты опять не туда. Здесь основаня проблема не в том, чтобы проверить результирующие данные, а в том, чтобы правильно разбросать данные по партиям и сделать это максимвльно в запросе без дополнительных телодвижений.
84 tdm
 
28.08.14
09:30
(80) ок) ну вы уже пол форума убедили - поэтому сможете и экзаменатора убедить, никто же не против))
без необходимости как понимаю - это всё таки когда тупо вместо выборки по строкам ТЗ бегаем, так что не сомневайтесь(ну и вторая бесплатная попытка если что будет)))
удачи вам на сдаче! весело тут у вас но надо работать(((
85 NcSteel
 
28.08.14
09:36
(65) Так как выгрузка в ТЗ и ДЗ это лишняя нагрузка на память, естественно ее необходимо делать только в крайних ситуациях. А в данном случае это не та ситуация.
86 masenshi
 
28.08.14
09:36
(82) Классика

Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("Момент", МоментВремени());
    Запрос.УстановитьПараметр("Склад", Склад);
    
    
    Результат = Запрос.Выполнить();
    ВыборкаНоменклатуры = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    
    Пока ВыборкаНоменклатуры.Следующий() Цикл
        Если ВыборкаНоменклатуры.КоличествоВДокументе > ВыборкаНоменклатуры.КоличествоПартии Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "По " + ВыборкаНоменклатуры.НоменклатураПредставление + " осталось только " + ВыборкаНоменклатуры.КоличествоПартии
                + " необходимо " + ВыборкаНоменклатуры.КоличествоВДокументе;
            Сообщение.Сообщить();
        КонецЕсли;
                
        Если Отказ Тогда
            Продолжить;
        КонецЕсли;
        
        
        ВыборкаПартий = ВыборкаНоменклатуры.Выбрать();
        ОсталосьСписать = ВыборкаНоменклатуры.КоличествоВДокументе;
        
        СуммаСписанногоПоТовару = 0;
        Пока ОсталосьСписать > 0 И ВыборкаПартий.Следующий() Цикл
            
            Если ВыборкаПартий.КоличествоПартии = 0 Тогда
                 Продолжить;
            КонецЕсли;
            
            КоличествоСписания = МИН(ОсталосьСписать, ВыборкаПартий.КоличествоПартии);
            Если ВыборкаПартий.КоличествоПартии > ОсталосьСписать Тогда
                СуммаСписания =  ОсталосьСписать * ВыборкаПартий.СуммаПартии / ВыборкаПартий.КоличествоПартии;
            Иначе
                СуммаСписания = ВыборкаПартий.СуммаПартии;
            КонецЕсли;        
            
            Движение = Движения.ОстаткиНоменклатуры.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Номенклатура = ВыборкаПартий.Номенклатура;
            Движение.Партия = ВыборкаПартий.Партия;
            Движение.Количество = КоличествоСписания;
            Движение.Сумма = СуммаСписания;
            
            ОсталосьСписать = ОсталосьСписать - КоличествоСписания;
            
            СуммаСписанногоПоТовару = СуммаСписанногоПоТовару + Движение.Сумма;
        КонецЦикла;
        
        //Сформируем записи в регистре "Продажи"
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаНоменклатуры.Номенклатура;
        Движение.Количество = ВыборкаНоменклатуры.КоличествоВДокументе;
        Движение.Себестоимость = СуммаСписанногоПоТовару;
        Движение.СуммаПродаж = ВыборкаНоменклатуры.СуммаВДокументе;
        
        ОбщаяСуммаПродаж = ОбщаяСуммаПродаж + Движение.СуммаПродаж;
    КонецЦикла;
87 masenshi
 
28.08.14
09:40
(85) тоже думал о  нагрузке на память. А как определить та или не та эта ситуация?

Ведь загружать движения из таблицы значений, полученной из результата запроса, никто не запрещает.

А тут ситуация похожа.
А в промежутке я их еще и обрабатываю.
88 mzelensky
 
28.08.14
09:41
(86) Блин, надо проверять...а ты прогонял этот запрос для условия:

Допустим, в документе 3 строки с одной номенклатурой и разными партиями. На остатке, предположим тоже 3 партии. Итого получится 9 строк.
Куча дублей строк. Не сможем правильно списать остатки по партиям.
А если данной партии вообще нет на остатках? Откуда будем списывать?

Нормально отрабатывает?
89 masenshi
 
28.08.14
09:43
(88) Проверяли коллеги. В целом рабочее решение, но сложное.
90 masenshi
 
28.08.14
09:46
(85) (88)
Авторское решение с "нагрузкой на память".


Процедура ОбработкаПроведения(Отказ, Режим)
    
    Движения.ОстаткиНоменклатуры.Очистить();
    Движения.ОстаткиНоменклатуры.Записывать = Истина;
    
    Движения.Продажи.Очистить();
    Движения.Продажи.Записывать = Истина;
    
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        Момент = Дата(1,1,1);
        Движения.ОстаткиНоменклатуры.Записать();
    Иначе
        Момент = МоментВремени();
    КонецЕсли;
    
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
    Блокировка.Заблокировать();
    
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    а.Номенклатура КАК Номенклатура,
    |    а.Партия КАК Партия,
    |    СУММА(а.Количество) КАК Количество,
    |    СУММА(а.Сумма) КАК Сумма
    |ПОМЕСТИТЬ вт
    |ИЗ
    |    Документ.РасходнаяНакладная.СписокНоменклатуры КАК а
    |ГДЕ
    |    а.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |    а.Номенклатура,
    |    а.Партия
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура,
    |    Партия
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    а.Номенклатура КАК Номенклатура,
    |    СУММА(а.Количество) КАК Количество,
    |    СУММА(а.Сумма) КАК Сумма
    |ПОМЕСТИТЬ втКолво
    |ИЗ
    |    вт КАК а
    |
    |СГРУППИРОВАТЬ ПО
    |    а.Номенклатура
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    а.Номенклатура КАК Номенклатура,
    |    ПРЕДСТАВЛЕНИЕССЫЛКИ(а.Номенклатура) КАК НоменклатураПредставление,
    |    а.Партия КАК ПартияДок,
    |    б.Партия,
    |    0 КАК Недостаток,
    |    ВЫБОР
    |        КОГДА а.Партия = б.Партия
    |            ТОГДА 1
    |        ИНАЧЕ 2
    |    КОНЕЦ КАК ПорядокСортировки,
    |    г.Количество КАК КолвоДок,
    |    бб.КоличествоОстаток КАК КолвоОстаток,
    |    а.Количество КАК КолвоПартияДок,
    |    г.Сумма КАК СуммаДок,
    |    бб.СуммаОстаток КАК СуммаОстаток,
    |    б.Партия.МоментВремени КАК ПартияМоментВремени
    |ИЗ
    |    вт КАК а
    |        ЛЕВОЕ СОЕДИНЕНИЕ втКолво КАК г
    |        ПО а.Номенклатура = г.Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |                &Момент,
    |                Номенклатура В
    |                    (ВЫБРАТЬ
    |                        а.Номенклатура
    |                    ИЗ
    |                        вт КАК а)) КАК б
    |        ПО а.Номенклатура = б.Номенклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |                &Момент,
    |                Номенклатура В
    |                    (ВЫБРАТЬ
    |                        а.Номенклатура
    |                    ИЗ
    |                        вт КАК а)) КАК бб
    |        ПО а.Номенклатура = бб.Номенклатура
    |
    |УПОРЯДОЧИТЬ ПО
    |    ПорядокСортировки,
    |    ПартияМоментВремени УБЫВ
    |ИТОГИ
    |    МИНИМУМ(КолвоДок) - МИНИМУМ(КолвоОстаток) КАК Недостаток,
    |    МИНИМУМ(КолвоДок),
    |    МИНИМУМ(КолвоОстаток),
    |    МИНИМУМ(СуммаДок),
    |    МИНИМУМ(СуммаОстаток)
    |ПО
    |    Номенклатура";
    
    Если РегистрыСведений.УчетнаяПолитика.ПолучитьПоследнее(Дата).Значение <> Перечисления.УчетнаяПолитика.ЛИФО Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПартияМоментВремени УБЫВ", "ПартияМоментВремени ВОЗР");
    КонецЕсли;
    
    Запрос.УстановитьПараметр("Момент", Момент);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();

    ДЗ = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
    
    Для Каждого Стр0 Из ДЗ.Строки Цикл
        
        Если Стр0.Недостаток > 0 Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не хватает товара: " + Стр0.НоменклатураПредставление + " в количестве: " + Стр0.Недостаток;
            Сообщение.Сообщить();
        КонецЕсли;
        
        Если Отказ Тогда
            Продолжить;
        КонецЕсли;
        
        СебестоимостьПодитог = 0;
        ОсталосьСписать = Стр0.КолвоДок;
        Для Каждого Стр1 Из Стр0.Строки Цикл
            
            Если ОсталосьСписать = 0 Тогда
                Прервать;
            КонецЕсли;
            
            Если Стр1.КолвоОстаток = 0 Тогда
                Продолжить;
            КонецЕсли;
                
            КолвоСписать = Мин(ОсталосьСписать, Стр1.КолвоОстаток);
            
            Движение = Движения.ОстаткиНоменклатуры.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Номенклатура = Стр1.Номенклатура;
            Движение.Партия = Стр1.Партия;
            Движение.Количество = КолвоСписать;
            
            Если КолвоСписать = Стр1.КолвоОстаток Тогда
                Движение.Сумма = Стр1.СуммаОстаток;
            Иначе
                Движение.Сумма = Стр1.СуммаОстаток / Стр1.КолвоОстаток * КолвоСписать;
            КонецЕсли;
            
            ОсталосьСписать = ОсталосьСписать - КолвоСписать;
            СебестоимостьПодитог = СебестоимостьПодитог + Движение.Сумма;
            
            Если ОсталосьСписать > 0 Тогда
                Строки = Стр0.Строки.НайтиСтроки(Новый Структура("Партия", Стр1.Партия));
                Для Каждого НайдСтр Из Строки Цикл
                    НайдСтр.КолвоОстаток = НайдСтр.КолвоОстаток - КолвоСписать;
                    НайдСтр.СуммаОстаток = НайдСтр.СуммаОстаток - Движение.Сумма;
                КонецЦикла;
            КонецЕсли;
            
        КонецЦикла;
        
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = Стр0.Номенклатура;
        Движение.Количество = Стр0.КолвоДок;
        Движение.Продажа = Стр0.СуммаОстаток;
        Движение.Себестоимость = СебестоимостьПодитог;
    КонецЦикла;

    
КонецПроцедуры
91 mzelensky
 
28.08.14
10:43
Надо призвать ГРУВИ - пусть выскажет свое "ФИ" :)
92 alle68
 
28.08.14
12:04
(90) Зачем рисковать выгрузкой, если выборка отработает на том же коде? Хотя "-1 балл" это о другом, я полагаю.
Чем отличается таблица "б" от "бб"?
93 mistеr
 
28.08.14
12:21
(91) Ты что пытаешься нам доказать? Что ты круче методистов 1С? Ну знай себе оба способа, на экзамене покажи запрос, а в работе используй ДЗ. Жизнь рассудит. Зачем такой кипеш тут?
94 mzelensky
 
28.08.14
12:22
(92) Не отработает выборка. Он вот что делает:

Строки = Стр0.Строки.НайтиСтроки(Новый Структура("Партия", Стр1.Партия));
95 mistеr
 
28.08.14
12:25
(93) Извини, это для (90). Ники похожи :)
96 mzelensky
 
28.08.14
12:27
(93) Ты ничего не перепутал? Ты вообще кто такой, чтобы я перед тобой распинался и что-то доказывал, на каком собственно основании?

Во-вторых где ты тут кипишь увидел? Хочешь кипишь - иди в укроветку. Тут лишь люди делятся своими мыслями и опытом

В-третьих про "Что ты круче методистов 1С" - ты считаешь, что "методисты 1С" боги какие-то??? И только они на все 100% правы? Или ты не в курсе, что, например, эти самые методисты сперва били себя пяткой в грудь .что в запросах нужно и правильно обращаться к реквизитам через точку (без разницы какая вложенность), а теперь рекомендуют таки использовать соединения.
97 alle68
 
28.08.14
13:22
(94) Не разглядел строку. За такое точно минус балл.
98 scanduta
 
28.08.14
13:24
(0)Не нужна никаких деревьев и ТЗ.

Эта задача просто через выборку делается как и все задачи из спеца
99 masenshi
 
29.08.14
03:22
Всем спасибо. Буду делать через ВЫБОРКУ. Поработаю над запросом. Возможно, получится его упростить или построить более логичным образом.
100 masenshi
 
29.08.14
04:18
1С ответила, что дерево это плохо. Но и их решение не является единственно возможным.
101 DCKiller
 
29.08.14
07:17
(0) Будет. За дерево сразу баллы снизят. Это если тебя интересует именно ответ на данный вопрос, а не желание убедить всех, что с деревом будет лучше.
102 Wobland
 
29.08.14
10:17
(99) так и не дошло. результат экзамена потом озвучь
103 StaticUnsafe
 
29.08.14
11:25
(12) на экзамене будет минусом. бал снимут, а то и два.
104 H A D G E H O G s
 
29.08.14
11:31
(101) Расскажите это писателям типовых :-)
105 StaticUnsafe
 
29.08.14
12:37
(104) типовые пишут специально нанятые таджики