|   |   | 
| 
 | Дерево Значений на экзамене Специалист по платформе | ☑ | ||
|---|---|---|---|---|
| 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 | 
        (78) типа такого - http://forum-1c.ru/index.php?topic=6150.10;msg=48039     | |||
| 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) типовые пишут специально нанятые таджики     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |