Имя: Пароль:
1C
1С v8
помогите с запросом
,
0 yanejsh
 
04.07.13
08:52
Есть табличка
номенклатура реквизит1 реквизит2

есть регистр сведений, измерения
1)номенклатура
2)реквизит1 или реквизит2
ресурс Подразделение

Нужно из первой таблицы составить соответствие
номенклатура - подразделение

условие такое нужно задать:
Если есть привязка в РС номенклатуры и реквизит1, то подразделение определяем по ним, если есть привязка в РС номенклатуры и реквизит2, то подразделение определяем по ним. Если не было таких привязок, то подразделение определять только по номенклатуре и пустому второму измерению.

Как это сделать в запросе?
1 Allexe
 
04.07.13
09:02
(0) Первый вложенный запрос с условием Если есть привязка в РС номенклатуры и реквизит1, второй с условием номенклатура и реквизит2. Результаты объединить.
2 Allexe
 
04.07.13
09:03
(0) 2)реквизит1 или реквизит2 не понятно что это значит? у тебя два реквизита? или это один реквизит с двумя разными значениями?
3 yanejsh
 
04.07.13
09:05
(2) это разные реквизиты
4 yanejsh
 
04.07.13
09:06
(1) а если будет две привязки, то результаты не задвоятся при объединении?
5 kosts
 
04.07.13
09:13
Напиши какие сведения хочешь хранить.
6 yanejsh
 
04.07.13
09:18
это не так важно
Номенклатура РамкаКартины ЗадникКартины
РамкаКартины ЗадникКартины - это отдельные реквизиты не связанные с номенклатурой.
7 kosts
 
04.07.13
09:21
(6) А подразделение зачем тут?
8 yanejsh
 
04.07.13
09:24
(7) нужно привязать номенклатуру к подразделению в зависимости от дополнительных реквизитов
9 kosts
 
04.07.13
09:30
(8) Точный, но совершенно бесполезный ответ.
10 yanejsh
 
04.07.13
09:34
(9) у тебя такие же вопросы.
Зачем задавать вопрос, если ответ на него не изменить общую картину?
11 hhhh
 
04.07.13
09:38
Это старый анекдот про консультанта 1с:

Летит человек на воздушном шаре. И вдруг попадает в густой туман. Ничего не видно. Снижается. На земле стоит человек. "Скажите, пожалуйста, где я нахожусь?". Ответ: "Вы находитесь на воздушном шаре, а ваш шар летит в густом тумане".
12 Drac0
 
04.07.13
09:39
(0) Как обрабатывать ситуацию когда регитсре есть записи?:

Товар1   Реквизит1   Подразделение1
Товар1   Реквизит2   Подразделение2
13 yanejsh
 
04.07.13
09:42
(12) брать запись
Товар1   Реквизит1   Подразделение1
то есть реквизит1 первостепенен, на втором месте реквизит2.
если нет ни первого ни второго, то искать просто соответствие
Товар1   Подразделение1
14 kosts
 
04.07.13
09:43
(10) > Зачем задавать вопрос, если ответ на него не изменить общую картину?
Хочется увидеть картинку целиком, т.к. возможно есть проблема выше уровнем.
15 yanejsh
 
04.07.13
09:44
(14) тебе просто скучно :)
подумай пожалуйста только над запросом, не надо залезать выше
16 Drac0
 
04.07.13
09:51
(0) Тогда самый простой вариант через временные таблицы.

ВЫБРАТЬ
  РС.Товар
  РС.Подразделение
ПОМЕСТИТЬ ВТ_Реквизит1
ИЗ
  РегистрСведений КАК РС
ГДЕ
  РС.Реквизит ССЫЛКА Справочник.РамкаКартины

;

ВЫБРАТЬ
  РС.Товар
  РС.Подразделение
ПОМЕСТИТЬ ВТ_Реквизит1
ИЗ
  РегистрСведений КАК РС
     ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Реквизит1 КАК
     ПО НЕ ВТ_Реквизит1.Товар = РС.Товар

ГДЕ
  РС.Реквизит ССЫЛКА Справочник.ЗадникКартины

и для случая с пустым реквизитов, а потом объединить
17 kosts
 
04.07.13
09:51
(15) Над запросом не думаю пока не увижу вашей (пусть и не очень правильной реализации).
> не надо залезать выше
как скажешь
18 hhhh
 
04.07.13
09:53
(15) но вообще, согласись, начсчет измерений ты соврал, ну не может быть такого измерения:


2)реквизит1 или реквизит2

фантастика какая-то. поэтому костс и сомневается.
19 yanejsh
 
04.07.13
09:55
(18) на основании чего ты решил, что я соврал?
что не так в реквизит1 ?
20 Drac0
 
04.07.13
10:14
(18) Что не так с составным типом?
21 yanejsh
 
04.07.13
11:37
(16) как-то не так получается
в первой Вт получится несколько строк, и соединятся со второй ВТ, и произойдет размножение строк второй ВТ на те товары, где НЕ ВТ_Реквизит1.Товар = РС.Товар
22 viktor_vv
 
04.07.13
11:43
(21) А номенклатуру, которой нет в регистре надо выводить ?
23 yanejsh
 
04.07.13
11:53
пока запрос такой
24 yanejsh
 
04.07.13
11:53
ВЫБРАТЬ
ВЫРАЗИТЬ(ТаблицаМатериалов.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
ВЫРАЗИТЬ(ТаблицаМатериалов.ЕдИзм КАК Справочник.ЕдиницыИзмерения) КАК ЕдиницаИзмерения,
ВЫРАЗИТЬ(ТаблицаМатериалов.РамкаКартины КАК Справочник.РамкиКартины) КАК РамкаКартины,
ВЫРАЗИТЬ(ТаблицаМатериалов.ЗадникКартины КАК Справочник.ЗадникиКартины) КАК ЗадникКартины,
ТаблицаМатериалов.Количество КАК Количество
ПОМЕСТИТЬ ТЗ
ИЗ
&ТаблМатериалов КАК ТаблицаМатериалов
;
///////////////////////////////////////////////////////////
ВЫБРАТЬ
МатериалыВПодразделении.Номенклатура,
МатериалыВПодразделении.РамкаКартины КАК РамкаКартины,
МатериалыВПодразделении.Подразделение
ПОМЕСТИТЬ ВТ_РамкаКартины
ИЗ
РегистрСведений.МатериалыВПодразделении КАК МатериалыВПодразделении
ГДЕ
МатериалыВПодразделении.РамкаКартины ССЫЛКА Справочник.РамкиКартины
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МатериалыВПодразделении.Номенклатура,
МатериалыВПодразделении.РамкаКартины КАК ЗадникКартины,
МатериалыВПодразделении.Подразделение
ПОМЕСТИТЬ ВТ_ЗадникиКартины
ИЗ
РегистрСведений.МатериалыВПодразделении КАК МатериалыВПодразделении
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РамкаКартины КАК ВТ_РамкаКартины
ПО (НЕ МатериалыВПодразделении.Номенклатура = ВТ_РамкаКартины.Номенклатура)
ГДЕ
МатериалыВПодразделении.РамкаКартины ССЫЛКА Справочник.ЗадникиКартины
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МатериалыВПодразделении.Номенклатура,
МатериалыВПодразделении.Подразделение
ПОМЕСТИТЬ ВТ_Общая
ИЗ
РегистрСведений.МатериалыВПодразделении КАК МатериалыВПодразделении
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РамкаКартины КАК ВТ_РамкаКартины
ПО (НЕ МатериалыВПодразделении.Номенклатура = ВТ_РамкаКартины.Номенклатура)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЗадникиКартины КАК ВТ_ЗадникиКартины
ПО (НЕ МатериалыВПодразделении.Номенклатура = ВТ_ЗадникиКартины.Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_РамкаКартины.Номенклатура,
ВТ_РамкаКартины.РамкаКартины,
ВТ_РамкаКартины.Подразделение
ИЗ
ВТ_РамкаКартины КАК ВТ_РамкаКартины

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ВТ_ЗадникиКартины.Номенклатура,
ВТ_ЗадникиКартины.ЗадникКартины,
ВТ_ЗадникиКартины.Подразделение
ИЗ
ВТ_ЗадникиКартины КАК ВТ_ЗадникиКартины

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ВТ_Общая.Номенклатура,
NULL,
ВТ_Общая.Подразделение
ИЗ
ВТ_Общая КАК ВТ_Общая
25 yanejsh
 
04.07.13
11:55
(22) номенклатуру надовывести из первой таблицы, ТаблицаМатериалов
а к ней определить какое подразделение из РС
26 yanejsh
 
04.07.13
12:10
хелп, плиз
27 viktor_vv
 
04.07.13
12:21
Можно так еще, не уверен везде ли синтаксис правильный. Ну и по скорости вроде должно быть нормально, там ничего сложного, по идее, нет для планировщика.
И МассивПустыхТипов - это массив типов измерения составного типа. В типовой должна быть функция

Функция МассивПустыхЗначений(ОписаниеТипов) Экспорт

Описание типов можно через метаданные выдернуть, сразу не вспомню точный синтаксис.

   ТекстЗапроса = "
   |Выбрать
   |    СпрНоменклатура.Ссылка КАК Номенклатура,
   |    Выбор
   |        КОГДА Рег1.Номенклатура IS NOT Null Тогда
   |            Рег1.Подразделение
   |        Когда Рег2.Номенклатура IS NOT Null Тогда
   |            Рег2.Подразделение
   |        Иначе
   |            ISNULL(Рег3.Поразделение,Справочник.Подразделения.ПустаяСсылка)
   |    Конец КАК Подразделение
   |ИЗ
   |    Справочник.Номенклатура КАК СпрНоменклатура
   |    Левое соединение РегистрСведений. КАК Рег1
   |        ПО Рег1.Номенклатура = СпрНоменклатура.Ссылка
   |        И Рег1.Измерение2 = СпрНоменклатура.Реквизит1
   |    Левое соединение РегистрСведений. КАК Рег2
   |        ПО Рег2.Номенклатура = СпрНоменклатура.Ссылка
   |        И Рег2.Измерение2 = СпрНоменклатура.Реквизит2    
   |    Левое соединение РегистрСведений. КАК Рег3
   |        ПО Рег3.Номенклатура = СпрНоменклатура.Ссылка
   |        И Рег3.Измерение2 в (&МассивПустыхЗначений)
   |
   |";
28 viktor_vv
 
04.07.13
12:22
* МассивПустыхТипов -> МассивПустыхЗначений
29 viktor_vv
 
04.07.13
12:35
МассивПустыхЗначений = ОбщегоНазначения.МассивПустыхЗначений(Метаданные.РегистрыСведений.ТвойРегистр.Измерения.Измерение2.Тип);
30 yanejsh
 
04.07.13
14:12
(27) спасибо, вроде похоже на правду результат получается.
потестирую дальше
31 Drac0
 
04.07.13
14:14
(21) Не обращай внимание, о чем-то не том думал в это время :)