Имя: Пароль:
1C
1С v8
Непонятная выборка из регистра накопления.
, ,
0 messulete
 
26.11.15
15:58
Собственно задача получить цены покупных комплектующих из спецификации. После того как получаю список покупных комплектующих необходимо получить цены, а в случае если цены нет, то оставить номенклатуру.
В результате запроса, получаю список номенклатуры, которая есть и в тч и в регистре накопления, каким образом можно оставить данные из тч, если нету цен?

    // получим данные табличных частей
    Менеджер = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Менеджер;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ТЧ.Номенклатура,
                   |    ТЧ.Количество,
                   |    ТЧ.Спецификация
                   |ПОМЕСТИТЬ ТЧ
                   |ИЗ
                   |    &ТЧ КАК ТЧ";
    Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия);
    Запрос.Выполнить();
    Запрос.Текст =  "ВЫБРАТЬ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура
                    |ПОМЕСТИТЬ ПокупныеИзделия
                    |ИЗ
                    |    ТЧ КАК ТЧ
                    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
                    |        ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
                    |ГДЕ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка
                    |;
                    |
                    |////////////////////////////////////////////////////////////////////////////////
                    |ВЫБРАТЬ
                    |    ПокупныеИзделия.Номенклатура,
                    |    ПартииТоваровНаСкладах.Период
                    |ИЗ
                    |    ПокупныеИзделия КАК ПокупныеИзделия
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
                    |        ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
                    |ГДЕ
                    |    ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
    Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка);              
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);  // тестовые даты
1 SeraFim
 
26.11.15
16:03
Есть Null
2 anatoly
 
26.11.15
16:06
цены откуда?
если из РС то можно внутреннее соединение по срезу последних.
3 messulete
 
26.11.15
16:43
а можно ткнуть куда нужно поставить есть null? потому что была такая мысль, и пробовал разные варианты, но что - то не срослось.

нет, нужен РН.
4 Nuobu
 
26.11.15
16:49
(3) В условие ГДЕ
5 aleks_default
 
26.11.15
17:18
(4)Тока ЕстьNULL() и в секцию ВЫБРАТЬ :)
6 aleks_default
 
26.11.15
17:20
(0) ты сначала допиши запрос, чтобы понятно стало откуда цены берешь
7 messulete
 
27.11.15
07:33
aleks_default: в смысле? запрос дописан, просто он под code.

попробовал с isnull, результат тот же.

Менеджер = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Менеджер;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ТЧ.Номенклатура,
                   |    ТЧ.Количество,
                   |    ТЧ.Спецификация
                   |ПОМЕСТИТЬ ТЧ
                   |ИЗ
                   |    &ТЧ КАК ТЧ";
    Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия);
    Запрос.Выполнить();
    Запрос.Текст =  "ВЫБРАТЬ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура
                    |ПОМЕСТИТЬ ПокупныеИзделия
                    |ИЗ
                    |    ТЧ КАК ТЧ
                    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
                    |        ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
                    |ГДЕ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка
                    |;
                    |
                    |////////////////////////////////////////////////////////////////////////////////
                    |ВЫБРАТЬ
                    |    ПокупныеИзделия.Номенклатура,
                    |    ПартииТоваровНаСкладах.Стоимость
                    |ИЗ
                    |    ПокупныеИзделия КАК ПокупныеИзделия
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
                    |        ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
                    |ГДЕ
                    |    ЕСТЬNULL(ПартииТоваровНаСкладах.Период, ДАТАВРЕМЯ(1, 1, 1)) МЕЖДУ &ДатаНачала И &ДатаОкончания";
    Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка);              
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);  // тестовые даты
8 patria0muerte
 
27.11.15
08:05
(7) Че хочешь то, не понятно. Говоришь про цену, но за цену в запросе ни слова.

Вообще - тебе не надо ставить отбор по периоду в секции ГДЕ, т.к. сначала у тебя джойнятся записи, а затем происходит отбор. Соответственно те записи к которым из РН Партий не прицепилось ничего отбрасываются по условию из ГДЕ.

Варианта два:
- либо запрос к партиям заворачивай в ВТ, там делай отбор по номенклатуре и периоду, а потом джойни к Покупным изделиям, либо используй Виртуальную таблицу РН Партии и там в условиях виртуальной таблицы ставь отбор по периоду.

А еще лучше - и то и другое сделать. Обращение к реальной таблице РН - в основном не очень быстродейственный вариант
9 SeraFim
 
27.11.15
08:06
Купи у ДенисЧ синтакс-помощник и узнай, что существует "ЕСТЬNULL()" и есть еще "ЕСТЬ NULL"
10 patria0muerte
 
27.11.15
08:07
(9) Да ЕСТЬNULL здесь не главная проблема. Хоть с ним, хоть без него у него останется только та номенклатура, которая в РН есть... а ему всю надо...
11 Горогуля
 
27.11.15
08:08
а что такое левое соединение?
12 patria0muerte
 
27.11.15
08:09
(11) Это когда левой рукой берешь... Для правого соответственно наоборот...
13 Горогуля
 
27.11.15
08:14
а при внутреннем чем берёшь?
14 patria0muerte
 
27.11.15
08:15
(13) Об этом в приличном обществе вслух говорить не принято...
15 messulete
 
27.11.15
08:41
Переделал на таблицу оборотов, отрабатывает как мне надо.
можно ткнуть почему в виртуальной отрабатывает с отбором по периоду, а в реальной нет?
    
// получим данные табличных частей
    Менеджер = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Менеджер;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ТЧ.Номенклатура,
                   |    ТЧ.Количество,
                   |    ТЧ.Спецификация
                   |ПОМЕСТИТЬ ТЧ
                   |ИЗ
                   |    &ТЧ КАК ТЧ";
    Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия);
    Запрос.Выполнить();
    Запрос.Текст =  "ВЫБРАТЬ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура
                    |ПОМЕСТИТЬ ПокупныеИзделия
                    |ИЗ
                    |    ТЧ КАК ТЧ
                    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
                    |        ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
                    |ГДЕ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка
                    |;
                    |
                    |////////////////////////////////////////////////////////////////////////////////
                    |ВЫБРАТЬ
                    |    ПокупныеИзделия.Номенклатура,
                    |    ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход КАК Цена
                    |ИЗ
                    |    ПокупныеИзделия КАК ПокупныеИзделия
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПартииТоваровНаСкладахОбороты
                    |        ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладахОбороты.Номенклатура";
    Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка);              
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);  // тестовые даты
16 patria0muerte
 
27.11.15
08:52
(15) см. (8)
В случае с параметрами в виртуальной таблице - сначала происходит отбор, потом соединение. В случае с отбором в ГДЕ - сначала соединение потом отбор...

Про ЕСТЬNULL не забываем, гражданин...
17 messulete
 
27.11.15
08:57
patria0muerte - спасибо большое за разъяснение.
поправил, так всё верно?

    Менеджер = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Менеджер;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ТЧ.Номенклатура,
                   |    ТЧ.Количество,
                   |    ТЧ.Спецификация
                   |ПОМЕСТИТЬ ТЧ
                   |ИЗ
                   |    &ТЧ КАК ТЧ";
    Запрос.УстановитьПараметр("ТЧ", РезультатРазузлования.ВыходныеИзделия);
    Запрос.Выполнить();
    Запрос.Текст =  "ВЫБРАТЬ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура КАК Номенклатура
                    |ПОМЕСТИТЬ ПокупныеИзделия
                    |ИЗ
                    |    ТЧ КАК ТЧ
                    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
                    |        ПО ТЧ.Спецификация = СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка
                    |ГДЕ
                    |    СпецификацииНоменклатурыИсходныеКомплектующие.ВидВоспроизводства = &Покупка
                    |;
                    |
                    |////////////////////////////////////////////////////////////////////////////////
                    |ВЫБРАТЬ
                    |    ПокупныеИзделия.Номенклатура,
                    |    ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход, 0) КАК Цена
                    |ИЗ
                    |    ПокупныеИзделия КАК ПокупныеИзделия
                    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ПартииТоваровНаСкладахОбороты
                    |        ПО ПокупныеИзделия.Номенклатура = ПартииТоваровНаСкладахОбороты.Номенклатура";
    Запрос.УстановитьПараметр("Покупка", Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка);              
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); // тестовые даты
    Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);  // тестовые даты
18 patria0muerte
 
27.11.15
09:01
(17) Не совсем. Вместо:

ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход, 0)

лучше

ВЫБОР КОГДА ЕСТЬNULL(ПартииТоваровНаСкладахОбороты,0) = 0 ТОГДА 0 ИНАЧЕ ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход, 0) / ПартииТоваровНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Цена
19 patria0muerte
 
27.11.15
09:02
+(18)
Ошибся:

ВЫБОР КОГДА ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоПриход ,0) = 0 ТОГДА 0 ИНАЧЕ ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.СтоимостьПриход, 0) / ПартииТоваровНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Цена
20 patria0muerte
 
27.11.15
09:04
+(20) Даже лучше так:

ВЫБОР КОГДА ЕСТЬNULL(ПартииТоваровНаСкладахОбороты.КоличествоПриход ,0) = 0 ТОГДА 0 ИНАЧЕ ПартииТоваровНаСкладахОбороты.СтоимостьПриход / ПартииТоваровНаСкладахОбороты.КоличествоПриход КОНЕЦ КАК Цена

т.к. если количествоПриход не NULL, то и СтоимостьПриход тоже...
21 aleks_default
 
27.11.15
09:06
(15) еще в первом запросе(где ТЧ со спецификацией соединяешь) добавь ВЫБРАТЬ РАЗЛИЧНЫЕ
22 messulete
 
27.11.15
09:06
ok, ещё раз спасибо.