|
Дерево Значений на экзамене Специалист по платформе | ☑ | ||
---|---|---|---|---|
0
masenshi
28.08.14
✎
05:02
|
Можно ли в разделе оперативный учет при решении задач в проведений расходной накладной пользоваться выгрузкой результата запроса в Дерево Значений вместо Выборки, как это все любят делать?
Не будет ли это ошибкой? "Выгрузка результата запроса в промежуточную таблицу (например, в таблицу значений) без необходимости". Минус 1 балл. ДЗ позволяет не строить сложный запрос на 200 строк как в примере решения задачи 1.4 из официального сборника. |
|||
1
Wobland
28.08.14
✎
05:06
|
дерево не позволяет строить запрос, оно вообще ничего не знает о запросах
|
|||
2
patria0muerte
28.08.14
✎
05:17
|
(0)Есть же ОбходРезультатаЗапроса.ПоГруппировкам
|
|||
3
masenshi
28.08.14
✎
05:29
|
(1) Для тех кто в танке.
Использование ДЗ позволяет не строить сложный запрос на 200 строк как в примере решения задачи 1.4 из официального сборника. |
|||
4
masenshi
28.08.14
✎
05:30
|
(2) ДЗ нужно чтобы делать вычисления в процессе проведения и хранить их в дереве
|
|||
5
Лодырь
28.08.14
✎
05:42
|
(4) А не лучше сделать все в 1 запросе вообще без использования в дальнейшем выборки? Сформировать запросом таблицу движений сразу и засунуть ее в движения.
|
|||
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) типовые пишут специально нанятые таджики
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |