Имя: Пароль:
1C
1С v8
Советы по написанию запроса.
0 dns-omsk
 
11.06.13
09:20
Начало было тут http://www.forum.mista.ru/topic.php?id=668426
Выслушал ваши советы, переделал. Выскажете мнение пожалуйста, что так, что не так.

Процедура ДокументыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
   // Заполнение таблицы документов дополнительных расходов
   ТаблДокументовДопРасходов.Очистить();
   Запрос = Новый Запрос("ВЫБРАТЬ
                         |    СвязанныеДокументы.Ссылка
                         |ИЗ
                         |    КритерийОтбора.СвязанныеДокументы(&Док) КАК СвязанныеДокументы");
   Запрос.УстановитьПараметр("Док", ВыбраннаяСтрока.Документ);
   РезДок = Запрос.Выполнить().Выбрать();
   Пока РезДок.Следующий() Цикл
           Стр = ТаблДокументовДопРасходов.Добавить();
           Стр.Контрагент = РезДок.Ссылка.Контрагент;
           Стр.Документ = РезДок.Ссылка;
           Стр.Сумма = Формат(РезДок.Ссылка.Сумма, "ЧДЦ=2; ЧРД=.");
           Стр.Валюта = "р."
   КонецЦикла;

   //Заполнение таблицы номенклатуры
   ТаблОсновная.Очистить();

   Запрос.Текст = "ВЫБРАТЬ
                  |    ПоступлениеТоваровУслугТовары.Номенклатура,
                  |    ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаНаша,
                  |    ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление,
                  |    ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход,
                  |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход,
                  |    ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
                  |    ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения,
                  |    ПоступлениеТоваровУслугТовары.Номенклатура.Код,
                  |    ПоступлениеТоваровУслугТовары.Номенклатура.Артикул,
                  |    ПоступлениеТоваровУслугТовары.Количество
                  |ИЗ
                  |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
                  |        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                  |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты
                  |        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура
                  |ГДЕ
                  |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
                  |    И ПоступлениеТоваровУслуг.Ссылка = &Ссылка
                  |    И ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    НомерСтроки";
                 
   Запрос.УстановитьПараметр("Период", ТекущаяДата());
   Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ);
   Запрос.УстановитьПараметр("ТипЦен", Розничная);

   РезОсн = Запрос.Выполнить().Выбрать();
   Пока РезОсн.Следующий() Цикл
       Стр = ТаблОсновная.Добавить();
       Стр.НомерПП = РезОсн.НомерСтроки;
       Стр.Код = РезОсн.Номенклатура.Код;
       Стр.Артикул = РезОсн.Номенклатура.Артикул;
       Стр.Название = РезОсн.Номенклатура;
       Стр.Колво = РезОсн.Количество;
       Стр.Ед = РезОсн.ЕдиницаИзмерения;
       Стр.ЦенаНаша = Формат(РезОсн.ЦенаНаша, "ЧДЦ=2");
       Стр.ЦенаПост = Строка(Формат(РезОсн.ЦенаПоступление, "ЧДЦ=2"));
       Стр.ЦенаПостПлюс = Строка(Формат(РезОсн.СтоимостьПриход / РезОсн.КоличествоПриход, "ЧДЦ=2"));
       //Наценка = (РезПартия.СтоимостьПриход - Поз.Сумма) / РезПартия.КоличествоПриход
       Стр.Процент = Строка(Формат((РезОсн.ЦенаНаша / (РезОсн.СтоимостьПриход / РезОсн.КоличествоПриход) - 1)*100, "ЧДЦ=2")) + "%";
   КонецЦикла;    
КонецПроцедуры

Заранее, благодарю.
1 Maxus43
 
11.06.13
09:23
ГДЕ
ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен

это в параметры ЦеныНоменклатурыСрезПоследних
2 H A D G E H O G s
 
11.06.13
09:25
Все не так
3 H A D G E H O G s
 
11.06.13
09:25
(1) типа

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты

это нормально?
4 Галахад
 
гуру
11.06.13
09:25
А зачем два внутренних и левое к поступлениям же?
5 Maxus43
 
11.06.13
09:29
(3) я типа всё не успел поглядеть, кофе пью, а тут глаза режет Срез
6 dns-omsk
 
11.06.13
09:35
(3) Это не я, это конструктор сам придумал.
7 Maxus43
 
11.06.13
09:35
(3) ты лучше скажи, скачал мой цфник то с подписками на клиенте? работает?
8 Maxus43
 
11.06.13
09:36
(6) конструктор сам нчего не придумывает, на закладке Связи ты так поставил галки
9 Irbis
 
11.06.13
09:36
(6) Конструктор думать не умеет
10 H A D G E H O G s
 
11.06.13
09:36
(7) Да. Я признал это в той ветке
11 Maxus43
 
11.06.13
09:39
(10) да я не всмысле ткнуть носом) а всмысле что работет иногда неожиданно)
12 dns-omsk
 
11.06.13
10:03
(4) Ну а как еще я смог бы тянуть инфу из 3 разных таблиц?
13 Maxus43
 
11.06.13
10:09
(12) сначала разберись что такое Соединение, и в его видах
14 dns-omsk
 
11.06.13
12:56
Блин, ну не могу понять и все тут.
Maxus43, если время есть, измени мой запрос как бы ты сделал или кидани, пожалуйста, ссылочку на примерчик подобный.
15 dns-omsk
 
11.06.13
19:23
Только так, больше не могу додуматься, да и то, в выборку не попадают значение с null. Почему, не пойму.
   Запрос.Текст = "ВЫБРАТЬ
                  |    ПоступлениеТоваровУслугТовары.Номенклатура,
                  |    ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаНаша,
                  |    ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление,
                  |    ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход,
                  |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход,
                  |    ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
                  |    ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения,
                  |    ПоступлениеТоваровУслугТовары.Номенклатура.Код,
                  |    ПоступлениеТоваровУслугТовары.Номенклатура.Артикул,
                  |    ПоступлениеТоваровУслугТовары.Количество
                  |ИЗ
                  |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
                  |        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                  |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты
                  |        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура
                  |ГДЕ
                  |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
                  |    И ПоступлениеТоваровУслуг.Ссылка = &Ссылка
                  |    И ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    НомерСтроки";
16 dns-omsk
 
11.06.13
19:24
Опс, не то запостил. Вот правильно

       Запрос.Текст = "ВЫБРАТЬ
                      |    ПоступлениеТоваровУслугТовары.Номенклатура,
                      |    ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаНаша,
                      |    ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление,
                      |    ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход,
                      |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход,
                      |    ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
                      |    ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения,
                      |    ПоступлениеТоваровУслугТовары.Номенклатура.Код,
                      |    ПоступлениеТоваровУслугТовары.Номенклатура.Артикул,
                      |    ПоступлениеТоваровУслугТовары.Количество
                      |ИЗ
                      |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                      |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                      |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты
                      |        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
                      |        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                      |ГДЕ
                      |    ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
                      |    И ПоступлениеТоваровУслуг.Ссылка = &Ссылка
                      |    И ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка
                      |
                      |УПОРЯДОЧИТЬ ПО
                      |    НомерСтроки";
                 
   Запрос.УстановитьПараметр("Период", ТекущаяДата());
   Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ);
   Запрос.УстановитьПараметр("ТипЦен", Розничная);
17 H A D G E H O G s
 
11.06.13
19:25
Бида.
18 dns-omsk
 
11.06.13
19:40
Понял ошибку, почему не выходили NULL записи

Убрал
ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен
Добавил ЕСТЬNULL, все заработало как я и хотел.

Но все таки интересно,чем плох мой подход.
Лучше бы показал кто-нибудь как оптимальней.
19 Серго62
 
11.06.13
19:42
(16) Напиши сначала простыми русскими словами что нужно получить. Потом переведи это на язык запроса.
20 hhhh
 
11.06.13
19:46
(18) твой подход в 500 раз медленнее
21 EvgeniuXP
 
11.06.13
20:07
(180) посмотри курсы от 1Специалист-а, там запросы на SQL разбирают и про оптимизацию говорят - очень много примеров.
22 Alexprimer
 
12.06.13
11:47
вот примерно направление
ВЫБРАТЬ
   ПоступлениеТоваровУслугТовары.Номенклатура,
   ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление,
   ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
   ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения,
   ПоступлениеТоваровУслугТовары.Номенклатура.Код,
   ПоступлениеТоваровУслугТовары.Номенклатура.Артикул,
   ПоступлениеТоваровУслугТовары.Количество
ПОМЕСТИТЬ ДокументПоступления
ИЗ
   Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
   ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ДокументПоступления.Номенклатура,
   ДокументПоступления.ЦенаПоступление,
   ДокументПоступления.НомерСтроки,
   ДокументПоступления.ЕдиницаИзмерения,
   ДокументПоступления.НоменклатураКод,
   ДокументПоступления.НоменклатураАртикул,
   ДокументПоступления.Количество,
   ПартииТоваров.КоличествоПриход,
   ПартииТоваров.СтоимостьПриход
ИЗ
   ДокументПоступления КАК ДокументПоступления
       ЛЕВОЕ СОЕДИНЕНИЕ ПартииТоваров КАК ПартииТоваров
       ПО ДокументПоступления.Номенклатура = ПартииТоваров.Номенклатура

ну или как минимум наложи условия на виртуальные таблицы РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты (тут период, который анализируешь наверно нужен) и РегистрСведений.ЦеныНоменклатуры.СрезПоследних
23 sttt
 
12.06.13
12:37
это тоже ненормально:

Стр.Контрагент = РезДок.Ссылка.Контрагент;

в запросе получай нужные поля
24 Зойч
 
12.06.13
13:00
зачем
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
25 dns-omsk
 
13.06.13
13:12
Бодрого дня.

Скажите, правильно ли я вас понял?
Запрос из (16) превратился в такой:

   Запрос.Текст = "ВЫБРАТЬ
                  |    ПоступлениеТоваровУслугТовары.Номенклатура,
                  |    ПоступлениеТоваровУслугТовары.Цена КАК ЦенаПоступление,
                  |    ПоступлениеТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
                  |    ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения,
                  |    ПоступлениеТоваровУслугТовары.Номенклатура.Код,
                  |    ПоступлениеТоваровУслугТовары.Номенклатура.Артикул,
                  |    ПоступлениеТоваровУслугТовары.Количество
                  |ПОМЕСТИТЬ ДокументыПоступления
                  |ИЗ
                  |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
                  |        ПО ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеТоваровУслуг.Ссылка
                  |ГДЕ
                  |    ПоступлениеТоваровУслуг.Ссылка = &Ссылка
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоПриход,
                  |    ПартииТоваровНаСкладахОстаткиИОбороты.СтоимостьПриход,
                  |    ДокументыПоступления.Номенклатура,
                  |    ДокументыПоступления.ЦенаПоступление,
                  |    ДокументыПоступления.НомерСтроки,
                  |    ДокументыПоступления.ЕдиницаИзмерения,
                  |    ДокументыПоступления.Номенклатура.Код,
                  |    ДокументыПоступления.Номенклатура.Артикул,
                  |    ДокументыПоступления.Количество
                  |ПОМЕСТИТЬ ПартииТоваров
                  |ИЗ
                  |    ДокументыПоступления КАК ДокументыПоступления
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты КАК ПартииТоваровНаСкладахОстаткиИОбороты
                  |        ПО (ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура = ДокументыПоступления.Номенклатура)
                  |ГДЕ
                  |    ПартииТоваровНаСкладахОстаткиИОбороты.ДокументОприходования = &Ссылка
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ
                  |    ПартииТоваров.КоличествоПриход,
                  |    ПартииТоваров.СтоимостьПриход,
                  |    ПартииТоваров.Номенклатура,
                  |    ПартииТоваров.ЦенаПоступление,
                  |    ПартииТоваров.НомерСтроки,
                  |    ПартииТоваров.ЕдиницаИзмерения,
                  |    ПартииТоваров.Номенклатура.Код,
                  |    ПартииТоваров.Номенклатура.Артикул,
                  |    ПартииТоваров.Количество,
                  |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК ЦенаНаша
                  |ИЗ
                  |    ПартииТоваров КАК ПартииТоваров
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
                  |        ПО ПартииТоваров.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";
   Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ);
26 dns-omsk
 
13.06.13
13:22
(19) А суть было в том, на входе в запрос есть документ
Запрос.УстановитьПараметр("Ссылка", ВыбраннаяСтрока.Документ);

Получаю сначала табличную часть документа, затем количество и сумму партии, затем цену Розничную в текущий момент времени.
27 dns-omsk
 
13.06.13
13:23
Честно говоря, я взял небольшой документ, около 20 строк, вставил запросы поочередно в цикл (30 раз), замерил время и не получил выигрыша ни на одну секунду.
28 ptiz
 
13.06.13
13:25
(25) Если остатки тебе не нужны, то используй таблицу .Обороты(), а не .ОстаткиИОбороты()

Во-вторых, см. (22)
29 ptiz
 
13.06.13
13:26
(27) Франчи так же работают, сделают доработку, работает, клиент подписывает акт.
А через год: "Помогите! Тормозит!". И платят двойную сумму за исправление.
30 dns-omsk
 
13.06.13
13:34
(28) Я читал пример Alexprimer и сделал именно так, как он и рекомендовал. Так же читал весь день мануалы по запросам. Многие товарищи пишут, что вложенный запрос - не есть гуд, поэтому я его выкинул.
31 dns-omsk
 
13.06.13
13:36
И еще, заметье, я пишу просто небольшую удобняшку для собственных нужд, денег на нее не выделено, поэтому приходиться осваивать запросы самостоятельно с полного нуля.
32 ptiz
 
13.06.13
13:50
(31) Любой запрос может быть и гуд, и бад.
Делай на основе кода Alexprimer и осмысливай почему именно так.

Использование виртуальных таблиц без параметров - гарантированные тормоза.

ОстаткиИОбороты - самая тяжелая таблица, которая только может быть.
33 H A D G E H O G s
 
13.06.13
13:52
(32)
ОстаткиИОбороты - самая тяжелая таблица, которая только может быть.

Пфффф, ВТ РегБухгалтерии нежно похлопывают по плечу тебя, птиц.
34 dns-omsk
 
13.06.13
13:54
(32) Чтож, завтра может сделаю как он рекомендовал, замерю производительность его варианта.
35 dns-omsk
 
14.06.13
07:10
ptiz: Использование виртуальных таблиц без параметров - гарантированные тормоза.

Почему так, не могу понять.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой