Имя: Пароль:
1C
1С v8
Запрос с левым соединением
,
0 Djiney
 
19.07.14
21:47
Здравствуйте. Конфигурация 8.2.10, самописная.
В процессе построения запроса у меня возникла проблема, вроде бы не сложная, однако не могу понять что нужно сделать.

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

    Запрос = Новый Запрос("ВЫБРАТЬ
    |    СпрНоменклатура.Ссылка,
    |    ОстаткиОстатки.КоличествоОстаток,
    |    ЦеныОстатки.ЦенаОстаток
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Цены.Остатки КАК ЦеныОстатки
    |        ПО (ЦеныОстатки.Номенклатура = СпрНоменклатура.Ссылка)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |        ПО (ОстаткиОстатки.Номенклатура = СпрНоменклатура.Ссылка)
    |ГДЕ
    |    СпрНоменклатура.Ссылка <> &Ссылка
    |    И (ЦеныОстатки.ТипЦены = &ТипЦены
    | ИЛИ СпрНоменклатура.ЭтоГруппа = &ЭтоГруппа)");

Однако, в регистре цен есть 2 измерения, "Номенклатура" и "ТипЦены", для хранения закупочных цен, розничных цен и т.д., и необходимо, что бы по всем показывались либо заданные цены, либо 0, если записей о такой цене нет.

С остатками это работает, т.е. нулевые остатки выводятся. А вот с ценами не получается, я так понимаю из-за условия.

Пробовал добавлять в ИЛИ комбинации (примерно):
ЦеныОстатки.ТипЦены = Null; ЦеныОстатки.ТипЦены = Неопределено; ЦеныОстатки.ТипЦены = Справочники.ТипЦен.ПустаяСсылка(); ЦеныОстатки.ЦенаОстаток = 0; ЦеныОстатки.ЦенаОстаток = Null
А так же их комбинации. Не сработало.

Подскажите пожалуйста, как правильно задать условие!

P.S. Условие "СпрНоменклатура.ЭтоГруппа = &ЭтоГруппа" нужно для того, что бы в результате так же выводились группы.
1 France
 
19.07.14
21:49
Для цен полное соединение.
И, за рн для цен сейчас истерия будет))
2 DCKiller
 
19.07.14
21:50
У номенклатуры тип цены где хранится? Если в справочнике самой номенклатуры, то сделай соединение с регистром цен еще по типу цены.
3 Djiney
 
19.07.14
21:54
(1) Спасибо, сейчас попробую. Просто заказчик хотел что бы было видно как меняются цены в магазине, пришлось извращаться)

(2) Типы цен хранятся в самом регистре, т.к. для розничных покупателей и оптовиков разные цены на одну и ту же позицию.
4 Djiney
 
19.07.14
22:01
(1) Если просто поменять для цен на полное соединение, то результата никакого, так же позиции не показываются. Полное соединение представляет собой комбинацию левого и правого, но ведь не может быть так, что бы в регистре была ссылка на несуществующий элемент номенклатуры :/
5 DCKiller
 
19.07.14
22:08
Вообще-то, судя по запросу, все должно показываться. ИМХО, или ты сам не знаешь, чего хочешь, или нам чего-то недоговариваешь...
6 Djiney
 
19.07.14
22:14
Вроде все сказал. Попробую так:
Имею:
1) Справочник номенклатуры
2) РН Остатки с 1 измерением (номенклатура)
3) РН Цены с 2 измерениями (номенклатура и тип цен)

Хочу:
Пользователь выбирает тип цены (закупочная, розница и т.д.) и ему по этой цене выводятся ВСЕ элементы номенклатуры с остатками и ценами, в т.ч. и группы (просто названием, разумеется). При чем, если в РН нет записи с такой комбинацией измерений (номенклатура + определенная цена), то должен выводиться 0 (иди хотябы что-нибудь).

Конкретнее сформулировать не могу :(
7 Djiney
 
19.07.14
22:19
Нашел 1 из вариантов решения, запрос делать просто с левым соединением, а тип цен фильтровать в процессе обработки выборки. Однако это весьма долго для 15000 позиций номенклатуры -_-
8 mistеr
 
19.07.14
22:22
(1) Неверно.

(0) Условие на ТипЦены  - в параметры ВТ. Условие на ЭтоГруппа - в мусорку.

Наличие в ГДЕ условий на "правую" сторону левого соединения превращает соединение во внутреннее. Сколько раз можно повторять.
9 France
 
19.07.14
22:24
(8) левое соединение даст на одну запись номенклатуры две записи регистра цен?
10 mistеr
 
19.07.14
22:25
Да, РегистрНакопления.Цены.Остатки это 5+
11 mistеr
 
19.07.14
22:26
(9) С чего вдруг?
12 Wobland
 
19.07.14
22:28
>РегистрНакопления.Цены.Остатки
что это?
13 Wobland
 
19.07.14
22:30
+(12) цены повышаются, их цены постоянно растут. водка разбавляется водой безо всяких мер ©
прогоните Чегракова от компьютера
14 Wobland
 
19.07.14
22:31
(13) *Чигракова
15 DCKiller
 
19.07.14
22:34
(11) А почему нет? если у каждой записи регистра разный тип цен...
16 mistеr
 
19.07.14
22:35
(13) Там у них есть менеджер по повышению цен и менеджер по снижению цен. И вот они целый день колотят параллельно то +10%, то -5%. А те, кто продает, реальные цены поймать не могут. Поэтому (воздевает указательный палец к небу) - Остатки. Все по ТЗ.
17 mistеr
 
19.07.14
22:36
(15) Внимательно читаем сообщение еще раз.
18 Djiney
 
19.07.14
22:36
(10) Хорошо, изучу ВТ. Посоветуйте тогда, пожалуйста, более удобный способ показать заказчику, что сегодня у него цена на железяку 2000р, месяц назад была 2100р, а 5 месяцев назад была 1990р
19 Wobland
 
19.07.14
22:38
(18) запрос предлагать? или только извращения?
20 mistеr
 
19.07.14
22:40
(18) ВТ это виртуальная, не временная. Так, на всякий случай.
21 Wobland
 
19.07.14
22:40
(19) к регистру сведений, конечно. например, срез последних на каждую дату
22 Djiney
 
19.07.14
22:49
(21) а в чем принципиальная разница? Ну, за исключением того что в РН вбивать цены несколько экзотичнее
23 Reaper_1c
 
19.07.14
22:52
(22) В том, что твое приложение просто не будет отвечать на действия пользователя, подернется белой плесенью и будет иметь в диспетчере задач пометку "не отвечает".
24 Wobland
 
19.07.14
22:53
(22) в смысле. цены не накапливаются
25 mistеr
 
19.07.14
22:54
(22) Ага, исправил прошлогоднюю ошибку, перепахиваешь весь год, делаешь десять новых ошибок. Экзотика...
26 Djiney
 
19.07.14
23:01
Ну, учитывая то, что в регистр данные вносятся автоматически путем однократного ввода цены, а затем изменения на +100р и -100р не думаю что возникают подобные неудобства. Хотя, срез последних никогда не использовал, каюсь.
27 Wobland
 
19.07.14
23:09
(26) +100 к 2100 - это будет 2200?
28 France
 
19.07.14
23:15
(11) (11) подумал, прежде чем писать??
29 Djiney
 
19.07.14
23:15
(27) А разве нет?
30 Wobland
 
19.07.14
23:18
(29) да, действительно, проверил на калькуляторе. это я сейчас тебе какие-то _сведения_ рассказал
31 Reaper_1c
 
19.07.14
23:25
(26) А ты попробуй прикрутить теперь:
1. прикрутить к документу закупки автоматическую регистрацию закупочной цены.
2. написать обработку загрузки цен из прайса
3. сделать механизм установки розничной цены наценкой к закупочной.
4. Сравнить цены сегодня и год назад, приведенные к транзитной валюте (цена на золото, к примеру) по курсу на дату установки цены. Результат должен отображать изменение цен в процентном выражении в валюте цен и транзитной валюте для сравнения. Соответственно по всему диапазону номенклатуры, с подведением итогов по иерархии - как расчета медианы от ряда процентов входящего в группу.
32 Wobland
 
19.07.14
23:26
(31) 10 баллов
33 Djiney
 
19.07.14
23:33
(31) 1) Прикручено;
2) Написано, только не из прайса, а из счета фактуры/приходных накладных;
3) На данный момент конфигурация интернет магазина, и цены заказчик устанавливает вручную;
4) Мне кажется это слишком сложно для небольшой фирмы из 6 человек, а на сильно большее я пока и не замахиваюсь.
Да и я в любом случае, прикрутить можно все что угодно и к чему угодно)
34 Wobland
 
19.07.14
23:35
(33) а кто изобрёл РН для цен? что он тогда пил/курил?
35 Wobland
 
19.07.14
23:39
было дело - эмулировал РС на РН. или РН на РС, не помню. требовалось совмещение обеих функциональностей, долго думали... очень хитрый бизнес-процесс
36 R41
 
19.07.14
23:39
Условие левого соединения нужно перенести в условие ПО, иначе это будет внутреннее соединение. Сделай вот так:

    Запрос = Новый Запрос("ВЫБРАТЬ
    |    СпрНоменклатура.Ссылка,
    |    ОстаткиОстатки.КоличествоОстаток,
    |    ЦеныОстатки.ЦенаОстаток
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНоменклатура
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Цены.Остатки КАК ЦеныОстатки
    |        ПО (ЦеныОстатки.Номенклатура = СпрНоменклатура.Ссылка И ЦеныОстатки.ТипЦены = &ТипЦены)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |        ПО (ОстаткиОстатки.Номенклатура = СпрНоменклатура.Ссылка)
    |ГДЕ
    |    СпрНоменклатура.Ссылка <> &Ссылка
    | ");

P.S.
Условие про группу не понял, поэтому убрал....
37 Djiney
 
19.07.14
23:40
(34) Я написал всю конфигурацию с 0, ибо изначально для учета использовалась какая-то мистическая комбинация из 1С 7.7, Excel, Access и админки сайта, и стояла срочная задача запихать все ото всюду в 1С, и думать над особо сложными задачами на будущее как в (31) 4 не было времени)

А так исправлю, я и не утверждал что это правильно, я в этом деле новичок)
38 R41
 
19.07.14
23:41
В самой выборке лучше (но необязательно) использовать ISNULL:
СпрНоменклатура.Ссылка,
ISNULL(ОстаткиОстатки.КоличествоОстаток,0) КАК КоличествоОстаток
ISNULL(ЦеныОстатки.ЦенаОстаток,0) КАК ЦенаОстаток
39 Djiney
 
19.07.14
23:45
(36) Большое спасибо, ваш вариант помог! В (38) тоже полезная информация, благодарю за совет.
40 Reaper_1c
 
19.07.14
23:52
(33) Да что ты, а когда тебя попросят открыть в системе 7й аккаунт ты скажешь: "У вас же не большая фирма! Зачем вам 7й человек? Гоните его в шею, вам больше чем 6 человек на фирме не надо!" - правильно я понимаю?
41 Reaper_1c
 
19.07.14
23:54
(33) Модуль регистрации цены поставщика при поступлении приложи - хоть поржем... это ж надо, сколько у человека лишнего времени то.
42 Djiney
 
20.07.14
00:00
(40) Я конечно извиняюсь, но мне кажется, что у вас почему-то яро бомбит на эту тему. Я же не настаиваю что мой вариант единственно верный и непоколебимый.

Или вы не считаете, что у разных фирм разные потребности? И что немало небольших контор для учета до сих пор пользуются просто тетрадями или экселем, где такое в принципе невозможно, причем им этого достаточно, вам это тоже кажется чем-то нерациональным?
43 Reaper_1c
 
20.07.14
00:15
(42) Мне кажется, ты игноrиrуешь вопrосы, напrямую относящиеся к теме твоего же топика и пытаешься пеrевести rазговоr в плоскость личных оскоrблений...
44 RomanYS
 
20.07.14
00:23
(43) мне кажется ты ошибаешься
ТС задал вопрос и уже получил ответ
А твое желание поржать над решением ТС к теме мало относится
45 Djiney
 
20.07.14
00:24
(43) Т.е. Сообщения (22), (26), (40) и (41), по вашему мнению, напрямую относятся к интересующему меня вопросу? Мне кажется, что в ваших сообщения вы даже не пытались подсказать мне решение моего вопроса, а просто прицепились к РН цен и просто насмехались над этим решением, разве не так?
46 Reaper_1c
 
20.07.14
00:34
(44) О да, ответы просто супер. Помогут спрятать грабли в высокой траве так, чтобы потом с первого раза проломить ТС череп к чертовой матери.

(45) Как бы тебе сказать, что нужно из конфигурации твой регистр удалить к чертовой матери и тебя при этом не обидеть-то, а? Да еще так, чтобы ты сам осознал, какую свинью сам себе подложил?
47 Djiney
 
20.07.14
00:43
(46) Ну, например прямым текстом, как это обычно делают взрослые люди? Что-то вроде "Ваше решение в корне неверно, и, в дальнейшем, могут возникнуть проблемы с обработкой и управлением данными. Лучшим вариантом будет перейти на РС как можно быстрее.".

Безусловно, из данной темы я вынес множество полезной информации, и уже начал перерабатывать конфигурацию под запись цен в РС вместо РН.

Что я могу вам ответить, так это это то, что если вы и пытались мне как-то помочь, то делали это в корне неправильно. Буду надеяться, что вас данное замечание не обидело.
48 Reaper_1c
 
20.07.14
00:51
(47) Это интернет, детка!
49 France
 
20.07.14
00:59
Кхм... из 1 "И, за рн для цен сейчас истерия будет))"
50 Djiney
 
20.07.14
01:01
(48) А жаль, что с интернетом нынче только такая ассоциация.
51 France
 
20.07.14
01:05
(50) все правильно тут делали)) жизнь жестока - надо где люлей получить)) лучше тут, чем от клиент(ов)а
52 Djiney
 
20.07.14
01:16
(51) Ну, для того, чтобы пойти нужным путем не обязательно получать люли. Достаточно ёмкого комментария с намеком на решение. Лично мне, для того, чтобы пересмотреть свое решение, было достаточно (21). Как говорится - "зачем же платить больше?"
53 France
 
20.07.14
01:17
И, чтобы ты успокоился: за не один лям баксов реализовали механизм регистра бухгалтерии на рн для очень крупной металлургической компании. Экспертом выступал сотрудники1с.
Так называемый РАУЗ был реализован для дочки газпрома с подачи сотрудника ДУК, опять таки сотрудник 1с даже там тусовался, и даже перешел в компанию внедренца (Карташов, Кулешов-не помню). РАУЗ успешно используется в одном из лидеров металлургии России
Типовое решение 1с для вузов - опять таки за базу идея той же компании)) (здравствуйте, Марина :))
54 France
 
20.07.14
01:18
(52) ты правильно идёшь. У большинства тут мозги зациклены на типовых..
55 France
 
20.07.14
01:19
(53) + после этого, собственно, рауз в типовых и появился
56 Reaper_1c
 
20.07.14
01:48
(54) Правильно - это когда объект выбирается по совокупности методического назначения и технической реализации, а не потому, что другими объектами не пользовался. Наш ТС тебе вряд ли порядок измерений в регистрах защитить сможет, а ты ему про РАУЗ...
57 К_Дач
 
20.07.14
11:47
(31) это и РН может обеспечить... а вот что будет, если ввести цену в РН задним числом или изменить ранее созданный документ... что будет с последующими ценами - ТС явно не подумал)))
58 Reaper_1c
 
20.07.14
13:08
(57) Я вообще могу все это по тетрадке посчитать, и что?
59 Djiney
 
20.07.14
18:17
(57) Было так:

Допустим, 3 документа по 1 номенклатуре, ставящие цены 100, 110 и 105 рублей. В регистре в таком порядке будет 3 записи:
+100
+10
-5
Т.о. последняя цена 105. Изменяем цену в середине:
+100
+20
-15
В итоге 105. Перепроводим последнюю запись задним числом, получаем.
+105
-5
+10
В итоге 110 (ибо последнее изменение было на 110).

Да, есть проблема в том, что при перепроведении одного документа проводятся остальные, содержащие информацию о данном элементе, однако все работает.

Но данное уже не актуально, т.к. уже все переписал под РС. Собственно, РС удобнее в плане того, что не нужно проводить заново все документы при перепроведении одного, ну и ввод проще, не отрицаю.
60 Wobland
 
20.07.14
18:20
(59) фак мой мозг, как ты это сделал, демон?
61 Drac0
 
20.07.14
18:33
(59) Ничего себе "маленькое" неудобство
62 Djiney
 
20.07.14
19:25
(60) При проведении документа, документ смотрит остатки по цене на время проведения, после чего высчитывает разницу между ценой из остатков и ценой, указанной в нем, после чего разницу записывает в регистр. Соответственно, приход или расход определяет + или - значения разницы цены.
(61) Я и не уточнял размер неудобства) Хотя, это не самое неудобное из того, что приходилось делать в 1С.
63 Wobland
 
20.07.14
19:31
(62) я понимаю, как это сделать технически. я не понимаю, на хрена это сделать по-человечески
64 Djiney
 
20.07.14
19:44
(63) ну как это часто бывает, было мало времени и много работы, первое что пришло в голову, то и было реализовано)
65 Wobland
 
20.07.14
19:48
вот бы у меня с девушками так: первое что пришло в голову - а она уже согласна
66 m-serg74
 
20.07.14
20:41
(1) садись кол
67 m-serg74
 
20.07.14
20:44
(28) сам думал когда (1) писал?
68 Reaper_1c
 
20.07.14
21:34
(64) Ну и как? Меньше времени заняло чем РС сделать?
69 Djiney
 
20.07.14
21:51
(68) Ну, практически так же. В получении данных изменилось только Цены.Остатки на Цены.СрезПоследних, в модулях убрал только 15 строчек из проведения движения и все.
70 m-serg74
 
20.07.14
22:56
(69) дело не в количестве строчек, если ты до сих пор не понял
71 Djiney
 
20.07.14
23:56
(70) К сожалению в данном вопросе  у меня недостаточно опыта, потому причин кроме небольшого усложнения кода и некоторого увеличения времени выполнения определенных задач я не вижу.
72 France
 
25.07.14
00:47
(56) по поводу назначения к 1с и акселоту с конфой управление складом. Наклали на назначения и сделали замечательную конфу (была, по крайней мере)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший