Имя: Пароль:
1C
1С v8
Как научиться писать красивый и короткий код 1с?
0 sintez1234
 
24.10.14
12:10
Приведу пример. Нужно по каким-то правилам перегнать данные из одной таблицы значений в другую, когда просто выгрузить не получится, и при этом надо пронумеровать строки по порядку.

Обычное решение, как делают почти все:

Счетчик = 0;
Для Каждого Строка Из ТЗ Цикл
    Счетчик = Счетчик + 1;
    НоваяСтрока = Реестр.Добавить();
    НоваяСтрока.Номер = Счетчик;

Более красивое решение (при условии что сортировки нет):

Для Каждого Строка Из ТЗ Цикл
    НоваяСтрока = Реестр.Добавить();
    НоваяСтрока.Номер = Реестр.Количество();

Я когда нахожу более красивые/короткие решения в чужом коде, то стараюсь их запоминать. И вот как-то хочется писать максимально коротко, как и где этому учиться непонятно :)

А вообще было бы интересно посмотреть на похожие "укороченные" решения.
1 sintez1234
 
24.10.14
12:10
Название не удачно написал. Имелось ввиду "как учиться самому", а не учить других :)
2 Галахад
 
гуру
24.10.14
12:11
Зато первый быстрее.
3 Fish
 
24.10.14
12:12
(2) +100. Максимально коротко - не всегда максимально хорошо :)
4 Dionis Sergeevich
 
24.10.14
12:14
Реестр = ТЗ.Скопировать();
Для каждого Строка из Реестр Цикл
...
5 H A D G E H O G s
 
24.10.14
12:15
(0) Кусок копрокода.
6 H A D G E H O G s
 
24.10.14
12:16
ТЗ -> ТаблицаПараметровУчета

Строка -> СтрокаТаблицыПараметровУчета
7 Chameleon1980
 
24.10.14
12:16
новаястрока не пугает?
8 H A D G E H O G s
 
24.10.14
12:18
Реестр.Количество();

Не проводил исследований, хранит ли ТЗ в своем объекте КоличествоСтрок или считает динамически, поэтому сделал бы через счетчик.

А ты проводил исследования?
9 Chameleon1980
 
24.10.14
12:18
мож че не понял я
10 H A D G E H O G s
 
24.10.14
12:18
(7) НоваяСтрока-> НоваяСтрокаТаблицыРеестра
11 Wirtuozzz
 
24.10.14
12:18
это искусство, это само приходит. Со временем, посмотри попробуй как пишут 1с програмисты конфигурации, мне помогало. Они иногда очень дельно пишут и хитро, не сразу разберешься.
12 DS
 
24.10.14
12:18
(0) Никогда бы не делал как во втором фрагменте.
13 Chameleon1980
 
24.10.14
12:20
(10) кого? реестр?
14 Chameleon1980
 
24.10.14
12:21
я так понял про тз.
15 vlandev
 
24.10.14
12:21
Если код писать на английском - то буков должно быть поменьше , код будет покороче.
16 Chameleon1980
 
24.10.14
12:21
колонку и сорт, че не так-то? не вкурил
17 Надо работать
 
24.10.14
12:22
(0) Номер этот наверняка не нужен вообще )
18 Злобный монстр
 
24.10.14
12:22
(12) +1
19 Надо работать
 
24.10.14
12:23
(15) если бы типовые были на английском - тогда да, иначе фигня выйдет, твой код на английском, типовые переменные и методы - на русском
20 Трик
 
24.10.14
12:23
(0) Ты не поверишь, но такой код

Для каждого бла-бла-бла
Новстрока.Реквизит = Объект.Реквизит1.Реквизит2.Реквизит3;
Конец Цикла;

Тоже короче чем

Реквизит =  Объект.Реквизит1.Реквизит2.Реквзиит3;
Для каждого бла-бла-бла
Новстрока.Реквизит = Реквизит
Конец Цикла;

Однако...
21 Chameleon1980
 
24.10.14
12:24
а шустрее ли?
22 Dionis Sergeevich
 
24.10.14
12:25
(0) Объясните, мил человек, зачем Вам собственно счетчик в таблице значений? который у вас хранится в параметре "Номер"? Там же индекс строки есть
23 Dionis Sergeevich
 
24.10.14
12:26
Я бы скопировал ТЗ и обошел бы ее строки, обработав как необходимо. Причем копирование позволяет скопировать только часть таблицы (например необходимые колонки)
24 Злобный монстр
 
24.10.14
12:26
(12)(18) + В цикле вообще нужно обходится без вызова ненужных функций. Сколько она будет количество считать если там 100500 миллионов строк будет.
25 Злобный монстр
 
24.10.14
12:27
(22) Это кстати первое что в голову пришло.
26 Fish
 
24.10.14
12:27
(22) Не все, стремящиеся писать короткий код (толком не понимая зачем), слышали про индексы :)
27 IVT_2009
 
24.10.14
12:27
(22) потом скорей всего что то сортировать или сворачивать будет и не хочет оригинальную последовательность потерять.
28 necro
 
24.10.14
12:29
Не стоит писать хрень и гнаться за программистами на настоящих языках, которые пишут
i+=i++ + ++i=i;
выглядит забавно, но не понятно. Никогда не нужно ориентироваться на экспрессию, нужно думать о понятности кода и его поддержке.

Лучше добавить переменную, если так выглядит понятнее.
29 Лодырь
 
24.10.14
12:29
(27) Если будет сворачивать - очень интересно как не потеряет "оригинальную последовательность"
30 Dionis Sergeevich
 
24.10.14
12:30
(0) Автор напиши функцию в одну строку которая получает число а возвращает его факториал =) Вот тебе красивый и коротккий код)
31 Трик
 
24.10.14
12:31
(28)Вот вот не драйвера чай пишем.
32 Dionis Sergeevich
 
24.10.14
12:31
(27) Так он нумерует последовательно - у него всегда Номер = Индекс +1
33 Злобный монстр
 
24.10.14
12:32
(28) согласен, а то ужмут 10 условий через вопросы в одну строку. Потом полчаса распутвай пытаясь понять че хотели
34 mzelensky
 
24.10.14
12:32
(0) вроде уже и так все сказали, но добавлю от себя.

Автор используя "Реестр.Количество();" полагается на то ,что счетчик количества строк хранится в классе объекта. Но ведь нигде это не документированно. Вполне вероятно ,что там аналогичное обычному циклу обновление. И в этом случае код №1 явно будет выигрывать.

Оптимизация понятие относительно весьма. Так что + 100500 за то, что "короче" не всегда равняется "лучше"
35 Лодырь
 
24.10.14
12:32
(28) +1
Убить иногда хочется людей экономящих на описании того, что они вообще делают в коде. А тем более использующих многоэтажные конструкции непонятно зачем.
36 Chameleon1980
 
24.10.14
12:36
(30) рекурсия катит?
37 Трик
 
24.10.14
12:38
Надо проверить замером производительности.
38 Chameleon1980
 
24.10.14
12:38
опять миськами периимся
39 NS
 
24.10.14
12:41
(0) Нормальный программист всегда напишет первый вариант.
Второй - откровенный копрокод.
40 Dionis Sergeevich
 
24.10.14
12:44
(36) Да. Без нее ни как)
41 Тюря
 
24.10.14
12:46
Думаю главное не красота, а скорость работы кода.
Чаще чем короче тем тормозней )))
42 Chameleon1980
 
24.10.14
12:46
(40) а где пробл? 1 строчка возврат при ?
43 Dionis Sergeevich
 
24.10.14
12:47
а в чем красота? Красота в удобочитаемости, в последовательности и логичности)
(42) У меня нет проблем) Это автору - пример красивого кода)
44 Dionis Sergeevich
 
24.10.14
12:48
(42) да, возврат при 0, значение умножаем на рекурсию со значением - 1)
45 sintez1234
 
24.10.14
12:52
(8) Это в форме делается код, строк штук пять обычно, так что в данном случае производительность значения не имеет. Хотя в других случаях, где имеет, я бы тоже предпочел счетчик сделать.
46 supremum
 
24.10.14
12:53
(45) В один прекрасный момент их будет несколько тысяч. Лучше сразу делать нормально и не спотыкаться на ровном месте.
47 mikecool
 
24.10.14
12:55
(45) пользуйся замером производительности, вопросов будет меньше
48 Exec
 
24.10.14
12:58
имхо, лучший способ: http://i.imgur.com/sUysGgf.jpg
49 Escander
 
24.10.14
13:01
(0) оптимизация по объёму исходного кода - хучший вариант оптимизации
50 МихаилМ
 
24.10.14
13:05
(0)
отдельно заполнить массив и загрузить в колонку.
51 Chameleon1980
 
24.10.14
13:09
(*49) неа
52 Злобный монстр
 
24.10.14
13:15
(48) Что это? О_О
53 palpetrovich
 
24.10.14
13:21
(52) выпрямление пальцев :)
54 Chameleon1980
 
24.10.14
13:23
аяаяй. точно
55 Злобный монстр
 
24.10.14
13:47
(53) А я подумал школа индусских программеров! :-)
56 Анцеранана
 
24.10.14
14:05
Если РольДоступна("Хирург") Тогда
Флажок.Видимость = Ложь;
Иначе
Флажок.Видимость = Истина;
КонецЕсли;


Флажок.Видимость = НЕ РольДоступна("Хирург");

(0) это что ли имется ввиду? У меня таких примеров немало.
А у Гилёва даже есть спецкурс на тему оптимизации.
57 GROOVY
 
24.10.14
14:08
(56) Это не оптимизация, а просто здравый смысл.
58 Злобный монстр
 
24.10.14
14:13
(56)(57) В этом случае да. Но когда вместо описанного комментариями нормального ветвления через несколько Если Тогда, заменяют на мегастроку с кучей ИЛИ И и ?(,,) тут плеваться охота...
59 AROM
 
24.10.14
14:18
Первый код логичнее и проще, следовательно лучше. Второй красивее, но некоторые и из каждой процедуры другую вызывают и считают себя крутыми программистами, когда можно все поместить в одной
60 sintez1234
 
24.10.14
14:25
(56) да, примерно это. Часто пишешь и просто не думаешь что это можно укоротить.
61 sintez1234
 
24.10.14
14:26
(59) во не! Я как раз не люблю когда в одной процедуре 150 страниц кода. Я сам вообще страюсь чтобы процедура влазила в экран :) Если не влазит, то дроблю на 2 процедуры уже. Народу это нравится, что код понятный и читабельный стает.
62 Domovoi
 
24.10.14
14:28
(0)Главное для проегра 1с за сколько времени он исправляет ошибки. Второй вариант быстрее вкурится и исправится чем первый и вероятность ошибок во втором коде меньше. Конечно в крайности бросаться не стоит и там где прога тормозит надо писать оптимально по производительности.
63 Fish
 
24.10.14
14:32
(61) А если текст запроса на экран не влазит? Тоже дробишь его на несколько процедур? :)
64 Fragster
 
гуру
24.10.14
14:45
(8) в сериализованной XML из ТЗ ЕМНИП количество строк есть, но даже если там руками поменять на 0, эта XML нормально прочитается в ТЗ
65 18_plus
 
24.10.14
14:48
(0) ТС, объясни, за каким фигом делать нумерацию в ТЗ?

а потом ещё заниматься оптимизацией, там где она как минимум не нужна?
66 18_plus
 
24.10.14
14:49
тем более если там "строк штук пять обычно"???!!!
67 ADirks
 
24.10.14
14:50
(63) Конечно. Чем программа на декларативном языке отличается от программы на языке процедурном?
68 18_plus
 
24.10.14
14:51
пока получается только кот и фаберже
69 18_plus
 
24.10.14
14:53
(67) очень хочу увидеть хотя бы основные принципы разбиения больших запросов на части. поделись.
70 MaxS
 
24.10.14
14:56
(30) ПолучитьФакториалЧисла(МоёЧисло)
(69) Это есть в типовых. Куча запросов создаётся в отдельных функциях.
71 ADirks
 
24.10.14
14:56
(69)  примерно так, немножко беспорядок, но принцип думаю понятен


Функция тзп_Инвентаризация()
    ТекстЗапроса = "
    |SELECT
    |    ДокИнв.МестоХранения,
    |    ДокИнвТЧ.МПЗ,
    |    $ПустойИД _IDDoc_,
    |    Sum(ДокИнвТЧ.Количество) ИнвФакт,
    |    Sum(ДокИнвТЧ.Количество - ДокИнвТЧ.КоличествоУчет) ИнвРасхождение
    |FROM
    |    ЖурналДокументов жИнв
    |    LEFT JOIN докИнвентаризацияМПЗ ДокИнв ON ДокИнв.IDDoc = жИнв.IDDoc
    |    LEFT JOIN докИнвентаризацияМПЗТЧ ДокИнвТЧ ON ДокИнвТЧ.IDDoc = жИнв.IDDoc
    |WHERE
    |    жИнв.IDDocDef = $ВидДокумента.ИнвентаризацияМПЗ
    |    AND жИнв.Date_Time_IDDoc >= @НачДата AND  жИнв.Date_Time_IDDoc <= @КонДата
    |    AND жИнв.IsMark = 0
    |GROUP BY
    |    ДокИнв.МестоХранения,
    |    ДокИнвТЧ.МПЗ
    |";
    
    Возврат ТекстЗапроса;
КонецФункции

Функция тзп_СборДанных(оЗапрос)
    стрВсеФильтры = оЗапрос.стрВсеФильтры();
    JOIN = "INNER JOIN спрМатериалы Материалы ON Материалы.ид13 = рег.МПЗ
    |LEFT JOIN спрЕдиницыМатериалов ЕдНУ ON ЕдНУ.ID = Материалы.ОсновнаяНормоупаковка";
    тзп_ОстМХ = оЗапрос.тзп_ОстаткиИДвиженияПоРегистру("МестаХранения", "ВидМПЗ, МестоХранения, МПЗ, _IDDoc_", "Количество", стрВсеФильтры, JOIN);
    //тзп_ОстП = оЗапрос.тзп_ОстаткиИДвиженияПоРегистру("Партии", "ВидМПЗ, МестоХранения, МПЗ, Договор, _IDDoc_", "Количество, Сумма, Вес", стрВсеФильтры, JOIN);
    тзп_ОстП = оЗапрос.тзп_ОстаткиИДвиженияПоРегистру("Партии", "ВидМПЗ, МестоХранения, МПЗ, _IDDoc_", "Количество, Сумма, Вес", стрВсеФильтры, JOIN);

    ТекстЗапроса = "
    |SELECT
    //|    регМХ.ВидМПЗ,
    |    ДеревоУр1.Группа ГруппаМат1,
    |    ДеревоУр2.Группа ГруппаМат2,
    |    регМХ.МестоХранения,
    //|    Coalesce($ВидСправочника36.Материалы + Материалы.ParentID, $ВидСправочника36.Номенклатура + Номенклатура.ParentID) ГруппаМПЗ,
    |    Материалы.ParentID ГруппаМПЗ,
    |    регМХ.МПЗ МПЗ,
    //|    IsNull(регП.Заявка, $ПустойИД) Заявка,
    //|    IsNull(регП.Договор, $ПустойИД) Договор,
    |    регМХ._IDDoc_,
    |
    |    Материалы.ТипМатериала,
    |    IsNull(ЕдНУ.Коэффициент, 0) Нормоупаковка,
    |    Материалы.ГруппаМатериалов,
    |    Материалы.СрокПоставкиПодЗаказ,
    |
    |    регМХ.КоличествоНО,
    |    регМХ.КоличествоПриход,
    |    регМХ.КоличествоРасход,
    |
    |    регМХ.КоличествоНО * Материалы.Вес * ЕдИзмВес.Коэффициент ВесНО,
    |    регМХ.КоличествоПриход * Материалы.Вес * ЕдИзмВес.Коэффициент ВесПриход,
    |    регМХ.КоличествоРасход * Материалы.Вес * ЕдИзмВес.Коэффициент ВесРасход,
    //|    "+ПересчитатьПоСредней("регМХ.КоличествоНО", "регП.КоличествоНО", "регП.ВесНО")+" ВесНО,
    //|    "+ПересчитатьПоСредней("регМХ.КоличествоПриход", "регП.КоличествоПриход", "регП.ВесПриход")+" ВесПриход,
    //|    "+ПересчитатьПоСредней("регМХ.КоличествоРасход", "регП.КоличествоРасход", "регП.ВесРасход")+" ВесРасход,
    |
    |    "+ПересчитатьПоСредней("регМХ.КоличествоНО", "регП.КоличествоНО", "регП.СуммаНО")+" СуммаНО,
    |    "+ПересчитатьПоСредней("регМХ.КоличествоПриход", "регП.КоличествоПриход", "регП.СуммаПриход")+" СуммаПриход,
    |    "+ПересчитатьПоСредней("регМХ.КоличествоРасход", "регП.КоличествоРасход", "регП.СуммаРасход")+" СуммаРасход,
    |
    |    IsNull(Инв.ИнвФакт, 0) ИнвФакт,
    |    IsNull(Инв.ИнвРасхождение, 0) ИнвРасхождение
    |FROM
    |    (
    |    "+оЗапрос.Отступ(тзп_ОстМХ)+"
    |    ) регМХ
    |
    |    LEFT JOIN (
    |    "+оЗапрос.Отступ(тзп_ОстП)+"
    |    ) регП ON
    |        регП.МПЗ = регМХ.МПЗ
    |        AND регП.МестоХранения = регМХ.МестоХранения
    |        AND регП._IDDoc_ = регМХ._IDDoc_
    |
    |    LEFT JOIN (
    |    "+оЗапрос.Отступ(тзп_Инвентаризация(), 2)+"
    |    ) Инв ON
    |        Инв.МПЗ = регМХ.МПЗ
    |        AND Инв.МестоХранения = регМХ.МестоХранения
    |        AND Инв._IDDoc_ = регМХ._IDDoc_
    |
    //|    LEFT JOIN спрНоменклатура Номенклатура ON Номенклатура.ид13 = регМХ.МПЗ
    |    INNER JOIN спрМатериалы Материалы ON Материалы.ид13 = регМХ.МПЗ
    |    LEFT JOIN спрЕдиницыМатериалов ЕдНУ ON ЕдНУ.ID = Материалы.ОсновнаяНормоупаковка
    |    LEFT JOIN спрЕдиницыМатериалов ЕдИзмВес ON ЕдИзмВес.ID = Материалы.ЕдиницаИзмеренияВеса
    |
    |    LEFT JOIN (
    |        SELECT distinct
    |            Группы.Level,
    |            Группы.ID Группа,
    |            Элементы.ID Материал,
    |            Материалы.Descr
    |        FROM
    |            Дерево_Материалы Элементы
    |            LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = '     0   '
    |            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
    |    ) ДеревоУр1 ON ДеревоУр1.Материал = Материалы.ID AND ДеревоУр1.Level = 1
    |
    |    LEFT JOIN (
    |        SELECT distinct
    |            Группы.Level,
    |            Группы.ID Группа,
    |            Элементы.ID Материал,
    |            Материалы.Descr
    |        FROM
    |            Дерево_Материалы Элементы
    |            LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = '     0   '
    |            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
    |    ) ДеревоУр2 ON ДеревоУр2.Материал = Материалы.ID AND ДеревоУр2.Level = 2
    |
    |";
    Если фТолькоСДвижениями = 1 Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |WHERE
        |    регМХ.МПЗ IN (SELECT рег.МПЗ
        |        FROM регМестаХранения рег
        |            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Right(рег.МПЗ, 9)
        |        "+оЗапрос.WHERE("Date_Time_IDDoc >= @НачДата AND  Date_Time_IDDoc <= @КонДата",
                    "Left(рег.МПЗ, 4) = $ВидСправочника36.Материалы",
                    стрВсеФильтры
                )+"
        |    )
        |";
    КонецЕсли;
    
    Возврат ТекстЗапроса;
КонецФункции

Функция тзп_Сгруппированно(оЗапрос)
    ТекстЗапроса = "
    |SELECT
    |    "+Отступ(оЗапрос.СложитьЧастиЗапроса("Идентификатор"), 1)+",
    |    sum(КоличествоНО) КоличествоНО,
    |    sum(КоличествоПриход) КоличествоПриход,
    |    sum(КоличествоРасход) КоличествоРасход,
    |    sum(КоличествоНО) + sum(КоличествоПриход) - sum(КоличествоРасход) КоличествоКО,
    |
    |    sum(ВесНО) ВесНО,
    |    sum(ВесПриход) ВесПриход,
    |    sum(ВесРасход) ВесРасход,
    |    sum(ВесНО) + sum(ВесПриход) - sum(ВесРасход) ВесКО,
    |
    |    sum(СуммаНО) СуммаНО,
    |    sum(СуммаПриход) СуммаПриход,
    |    sum(СуммаРасход) СуммаРасход,
    |    sum(СуммаНО) + sum(СуммаПриход) - sum(СуммаРасход) СуммаКО,
    |
    |    Sum(ИнвФакт) ИнвФакт,
    |    Sum(ИнвРасхождение) ИнвРасхождение
    |FROM
    |    (
    |    "+Отступ(тзп_СборДанных(оЗапрос))+"
    |    ) рег
    |
    //|"+оЗапрос.WHERE(оЗапрос.стрВсеФильтры())+"
    |
    |GROUP BY
    |    "+Отступ(оЗапрос.СложитьЧастиЗапроса("Идентификатор"), 1)+"
    |";
    
    Возврат ТекстЗапроса;
КонецФункции

Функция тзЗапрос()
    Состояние("Запрос данных из БД ...");
    
    оЗапрос = СоздатьОбъект("ТОтчет.Запрос");
    оЗапрос.фИспользоватьПредставления = 1;
    оЗапрос.Инит(оНастройки);
    оЗапрос.фИспользоватьПредставления = 1;
    оЗапрос.ДобавитьДаты(НачДата, КонДата);
    оЗапрос.ДобавитьВсеФильтры();
    //оЗапрос.ДобавитьФильтр(Перечисление.ВидыМПЗ.Материалы, "ВидМПЗ", "ВидМПЗ");
    
    оЗапрос.ТекстЗапроса = "
    |SELECT
    |    "+оЗапрос.SELECT("Данные")+",
    |
    |    КоличествоНО,
    |    КоличествоПриход,
    |    КоличествоРасход,
    |    КоличествоКО,
    |
    |    ВесНО,
    |    ВесПриход,
    |    ВесРасход,
    |    ВесКО,
    |
    |    СуммаНО,
    |    СуммаПриход,
    |    СуммаРасход,
    |    СуммаКО,
    |
    |    ИнвФакт,
    |    ИнвРасхождение
    |FROM
    |    (
    |    "+Отступ(тзп_Сгруппированно(оЗапрос))+"
    |    ) Данные
    |    "+оЗапрос.JOIN("Данные")+"
    |ORDER BY
    |    "+оЗапрос.ORDERBY()+"
    |
    |";
    
    тзЗапрос = оЗапрос.Выполнить();
    
    Возврат тзЗапрос;
КонецФункции
72 Маратыч
 
24.10.14
14:57
А если еще и обфускатором пройтись, код совсем, панимаешь, компактным станет. Насчет "красивым", правда, не уверен, гг.
73 18_plus
 
24.10.14
15:01
(71) вопросов больше не имею. уж разбил, так разбил.
74 18_plus
 
24.10.14
15:05
такое правда удобнее читать и сопровождать, чем один запрос простыней?
75 ADirks
 
24.10.14
15:07
(74) конечно, думаешь это просто так, из любви к искусству?

для сравнения, конечный результат

Функция тзп_Инвентаризация()
    ТекстЗапроса = "
    |SELECT
    |    ДокИнв.МестоХранения,
    |    ДокИнвТЧ.МПЗ,
    |    $ПустойИД _IDDoc_,
    |    Sum(ДокИнвТЧ.Количество) ИнвФакт,
    |    Sum(ДокИнвТЧ.Количество - ДокИнвТЧ.КоличествоУчет) ИнвРасхождение
    |FROM
    |    ЖурналДокументов жИнв
    |    LEFT JOIN докИнвентаризацияМПЗ ДокИнв ON ДокИнв.IDDoc = жИнв.IDDoc
    |    LEFT JOIN докИнвентаризацияМПЗТЧ ДокИнвТЧ ON ДокИнвТЧ.IDDoc = жИнв.IDDoc
    |WHERE
    |    жИнв.IDDocDef = $ВидДокумента.ИнвентаризацияМПЗ
    |    AND жИнв.Date_Time_IDDoc >= @НачДата AND  жИнв.Date_Time_IDDoc <= @КонДата
    |    AND жИнв.IsMark = 0
    |GROUP BY
    |    ДокИнв.МестоХранения,
    |    ДокИнвТЧ.МПЗ
    |";
    
    Возврат ТекстЗапроса;
КонецФункции

Функция тзп_СборДанных(оЗапрос)
    стрВсеФильтры = оЗапрос.стрВсеФильтры();
    JOIN = "INNER JOIN спрМатериалы Материалы ON Материалы.ид13 = рег.МПЗ
    |LEFT JOIN спрЕдиницыМатериалов ЕдНУ ON ЕдНУ.ID = Материалы.ОсновнаяНормоупаковка";
    тзп_ОстМХ = оЗапрос.тзп_ОстаткиИДвиженияПоРегистру("МестаХранения", "ВидМПЗ, МестоХранения, МПЗ, _IDDoc_", "Количество", стрВсеФильтры, JOIN);
    //тзп_ОстП = оЗапрос.тзп_ОстаткиИДвиженияПоРегистру("Партии", "ВидМПЗ, МестоХранения, МПЗ, Договор, _IDDoc_", "Количество, Сумма, Вес", стрВсеФильтры, JOIN);
    тзп_ОстП = оЗапрос.тзп_ОстаткиИДвиженияПоРегистру("Партии", "ВидМПЗ, МестоХранения, МПЗ, _IDDoc_", "Количество, Сумма, Вес", стрВсеФильтры, JOIN);

    ТекстЗапроса = "
    |SELECT
    //|    регМХ.ВидМПЗ,
    |    ДеревоУр1.Группа ГруппаМат1,
    |    ДеревоУр2.Группа ГруппаМат2,
    |    регМХ.МестоХранения,
    //|    Coalesce($ВидСправочника36.Материалы + Материалы.ParentID, $ВидСправочника36.Номенклатура + Номенклатура.ParentID) ГруппаМПЗ,
    |    Материалы.ParentID ГруппаМПЗ,
    |    регМХ.МПЗ МПЗ,
    //|    IsNull(регП.Заявка, $ПустойИД) Заявка,
    //|    IsNull(регП.Договор, $ПустойИД) Договор,
    |    регМХ._IDDoc_,
    |
    |    Материалы.ТипМатериала,
    |    IsNull(ЕдНУ.Коэффициент, 0) Нормоупаковка,
    |    Материалы.ГруппаМатериалов,
    |    Материалы.СрокПоставкиПодЗаказ,
    |
    |    регМХ.КоличествоНО,
    |    регМХ.КоличествоПриход,
    |    регМХ.КоличествоРасход,
    |
    |    регМХ.КоличествоНО * Материалы.Вес * ЕдИзмВес.Коэффициент ВесНО,
    |    регМХ.КоличествоПриход * Материалы.Вес * ЕдИзмВес.Коэффициент ВесПриход,
    |    регМХ.КоличествоРасход * Материалы.Вес * ЕдИзмВес.Коэффициент ВесРасход,
    //|    "+ПересчитатьПоСредней("регМХ.КоличествоНО", "регП.КоличествоНО", "регП.ВесНО")+" ВесНО,
    //|    "+ПересчитатьПоСредней("регМХ.КоличествоПриход", "регП.КоличествоПриход", "регП.ВесПриход")+" ВесПриход,
    //|    "+ПересчитатьПоСредней("регМХ.КоличествоРасход", "регП.КоличествоРасход", "регП.ВесРасход")+" ВесРасход,
    |
    |    "+ПересчитатьПоСредней("регМХ.КоличествоНО", "регП.КоличествоНО", "регП.СуммаНО")+" СуммаНО,
    |    "+ПересчитатьПоСредней("регМХ.КоличествоПриход", "регП.КоличествоПриход", "регП.СуммаПриход")+" СуммаПриход,
    |    "+ПересчитатьПоСредней("регМХ.КоличествоРасход", "регП.КоличествоРасход", "регП.СуммаРасход")+" СуммаРасход,
    |
    |    IsNull(Инв.ИнвФакт, 0) ИнвФакт,
    |    IsNull(Инв.ИнвРасхождение, 0) ИнвРасхождение
    |FROM
    |    (
    |    "+оЗапрос.Отступ(тзп_ОстМХ)+"
    |    ) регМХ
    |
    |    LEFT JOIN (
    |    "+оЗапрос.Отступ(тзп_ОстП)+"
    |    ) регП ON
    |        регП.МПЗ = регМХ.МПЗ
    |        AND регП.МестоХранения = регМХ.МестоХранения
    |        AND регП._IDDoc_ = регМХ._IDDoc_
    |
    |    LEFT JOIN (
    |    "+оЗапрос.Отступ(тзп_Инвентаризация(), 2)+"
    |    ) Инв ON
    |        Инв.МПЗ = регМХ.МПЗ
    |        AND Инв.МестоХранения = регМХ.МестоХранения
    |        AND Инв._IDDoc_ = регМХ._IDDoc_
    |
    //|    LEFT JOIN спрНоменклатура Номенклатура ON Номенклатура.ид13 = регМХ.МПЗ
    |    INNER JOIN спрМатериалы Материалы ON Материалы.ид13 = регМХ.МПЗ
    |    LEFT JOIN спрЕдиницыМатериалов ЕдНУ ON ЕдНУ.ID = Материалы.ОсновнаяНормоупаковка
    |    LEFT JOIN спрЕдиницыМатериалов ЕдИзмВес ON ЕдИзмВес.ID = Материалы.ЕдиницаИзмеренияВеса
    |
    |    LEFT JOIN (
    |        SELECT distinct
    |            Группы.Level,
    |            Группы.ID Группа,
    |            Элементы.ID Материал,
    |            Материалы.Descr
    |        FROM
    |            Дерево_Материалы Элементы
    |            LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = '     0   '
    |            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
    |    ) ДеревоУр1 ON ДеревоУр1.Материал = Материалы.ID AND ДеревоУр1.Level = 1
    |
    |    LEFT JOIN (
    |        SELECT distinct
    |            Группы.Level,
    |            Группы.ID Группа,
    |            Элементы.ID Материал,
    |            Материалы.Descr
    |        FROM
    |            Дерево_Материалы Элементы
    |            LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = '     0   '
    |            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
    |    ) ДеревоУр2 ON ДеревоУр2.Материал = Материалы.ID AND ДеревоУр2.Level = 2
    |
    |";
    Если фТолькоСДвижениями = 1 Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |WHERE
        |    регМХ.МПЗ IN (SELECT рег.МПЗ
        |        FROM регМестаХранения рег
        |            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Right(рег.МПЗ, 9)
        |        "+оЗапрос.WHERE("Date_Time_IDDoc >= @НачДата AND  Date_Time_IDDoc <= @КонДата",
                    "Left(рег.МПЗ, 4) = $ВидСправочника36.Материалы",
                    стрВсеФильтры
                )+"
        |    )
        |";
    КонецЕсли;
    
    Возврат ТекстЗапроса;
КонецФункции

Функция тзп_Сгруппированно(оЗапрос)
    ТекстЗапроса = "
    |SELECT
    |    "+Отступ(оЗапрос.СложитьЧастиЗапроса("Идентификатор"), 1)+",
    |    sum(КоличествоНО) КоличествоНО,
    |    sum(КоличествоПриход) КоличествоПриход,
    |    sum(КоличествоРасход) КоличествоРасход,
    |    sum(КоличествоНО) + sum(КоличествоПриход) - sum(КоличествоРасход) КоличествоКО,
    |
    |    sum(ВесНО) ВесНО,
    |    sum(ВесПриход) ВесПриход,
    |    sum(ВесРасход) ВесРасход,
    |    sum(ВесНО) + sum(ВесПриход) - sum(ВесРасход) ВесКО,
    |
    |    sum(СуммаНО) СуммаНО,
    |    sum(СуммаПриход) СуммаПриход,
    |    sum(СуммаРасход) СуммаРасход,
    |    sum(СуммаНО) + sum(СуммаПриход) - sum(СуммаРасход) СуммаКО,
    |
    |    Sum(ИнвФакт) ИнвФакт,
    |    Sum(ИнвРасхождение) ИнвРасхождение
    |FROM
    |    (
    |    "+Отступ(тзп_СборДанных(оЗапрос))+"
    |    ) рег
    |
    //|"+оЗапрос.WHERE(оЗапрос.стрВсеФильтры())+"
    |
    |GROUP BY
    |    "+Отступ(оЗапрос.СложитьЧастиЗапроса("Идентификатор"), 1)+"
    |";
    
    Возврат ТекстЗапроса;
КонецФункции

Функция тзЗапрос()
    Состояние("Запрос данных из БД ...");
    
    оЗапрос = СоздатьОбъект("ТОтчет.Запрос");
    оЗапрос.фИспользоватьПредставления = 1;
    оЗапрос.Инит(оНастройки);
    оЗапрос.фИспользоватьПредставления = 1;
    оЗапрос.ДобавитьДаты(НачДата, КонДата);
    оЗапрос.ДобавитьВсеФильтры();
    //оЗапрос.ДобавитьФильтр(Перечисление.ВидыМПЗ.Материалы, "ВидМПЗ", "ВидМПЗ");
    
    оЗапрос.ТекстЗапроса = "
    |SELECT
    |    "+оЗапрос.SELECT("Данные")+",
    |
    |    КоличествоНО,
    |    КоличествоПриход,
    |    КоличествоРасход,
    |    КоличествоКО,
    |
    |    ВесНО,
    |    ВесПриход,
    |    ВесРасход,
    |    ВесКО,
    |
    |    СуммаНО,
    |    СуммаПриход,
    |    СуммаРасход,
    |    СуммаКО,
    |
    |    ИнвФакт,
    |    ИнвРасхождение
    |FROM
    |    (
    |    "+Отступ(тзп_Сгруппированно(оЗапрос))+"
    |    ) Данные
    |    "+оЗапрос.JOIN("Данные")+"
    |ORDER BY
    |    "+оЗапрос.ORDERBY()+"
    |
    |";
    
    тзЗапрос = оЗапрос.Выполнить();
    
    Возврат тзЗапрос;
КонецФункции
76 ADirks
 
24.10.14
15:08
тьфу, извиняюсь


--     ДЕКЛАРАЦИЯ
Set NoCount ON
DECLARE @ПозицияТА Char(23), @ДатаИтогиТА Char(8)
Set @ПозицияТА = '201410248MHJZ4 2V2R7   '
Set @ДатаИтогиТА = '20141001'

DECLARE @НачДата Char(23), @ДатаИтогов Char(8), @НачДвиженийДляИтогов Char(24)
DECLARE @КонДата Char(24), @КонДатаПлюс1 Char(8)

Set @НачДата = '20140501'
Set @КонДата = '20140531'+'я'
Set @ДатаИтогов = '20140401'
Set @НачДвиженийДляИтогов = '20140501'
Set @КонДатаПлюс1 = '20140601'


Declare @ВыбМестоХранения Char(9)
Set @ВыбМестоХранения = '     9   '
--        ПРЕФИКС

DECLARE @RC int
CREATE TABLE [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] (ID Char(13), ID9 Char(9), Вид int)
INSERT INTO [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] Values(' 1EH   7T8   ', '   7T8   ',  1817)
INSERT INTO [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] Values(' 1EH   AFD   ', '   AFD   ',  1817)
INSERT INTO [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] Values(' 1EH   7VX   ', '   7VX   ',  1817)

If (SELECT Count(*) From [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] (NoLock)) > 100
    Create Clustered Index [#IX_680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] on [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] (ID)

--        ТЕЛО

SELECT
    Данные.МестоХранения [МестоХранения $Справочник.МестаХранения], RTrim(спрМестоХранения.Descr) стрМестоХранения, спрМестоХранения.РасшифровкаДляОтчетов расшМестоХранения,
    Данные.СрокПоставкиПодЗаказ [СрокПоставкиПодЗаказ $Справочник.СрокПоставкиНаМатериалыПодЗаказ], RTrim(спрСрокПоставкиПодЗаказ.Descr) стрСрокПоставкиПодЗаказ, спрСрокПоставкиПодЗаказ.РасшифровкаДляОтчетов расшСрокПоставкиПодЗаказ,
    Данные.МПЗ [МПЗ $Справочник], RTrim(спрМПЗ.Descr) стрМПЗ, спрМПЗ.РасшифровкаДляОтчетов расшМПЗ,
    спрМПЗ.ОсновнойАртикул [МПЗ_ОсновнойАртикул $Справочник.Артикулы],
    спрМПЗ.ОсновнаяЕдиницаИзмерения [МПЗ_ОсновнаяЕдиницаИзмерения $Справочник.ЕдиницыМатериалов],
    спрМПЗ.ОсновнаяНормоупаковка [МПЗ_ОсновнаяНормоупаковка $Справочник.ЕдиницыМатериалов],
    спрМПЗ.ВыдаватьСоСкладаПоДокументам [МПЗ_ВыдаватьСоСкладаПоДокументам $Число],
    спрМПЗ.ПозаказныйУчетПотребностей [МПЗ_ПозаказныйУчетПотребностей $Число],
    спрМПЗ.Вес [МПЗ_Вес $Число],
    спрМПЗ.ЕдиницаИзмеренияВеса [МПЗ_ЕдиницаИзмеренияВеса $Справочник.ЕдиницыМатериалов],

    КоличествоНО,
    КоличествоПриход,
    КоличествоРасход,
    КоличествоКО,

    ВесНО,
    ВесПриход,
    ВесРасход,
    ВесКО,

    СуммаНО,
    СуммаПриход,
    СуммаРасход,
    СуммаКО,

    ИнвФакт,
    ИнвРасхождение
FROM
    (
    
        SELECT
            МестоХранения ,
            СрокПоставкиПодЗаказ ,
            МПЗ ,
            sum(КоличествоНО) КоличествоНО,
            sum(КоличествоПриход) КоличествоПриход,
            sum(КоличествоРасход) КоличествоРасход,
            sum(КоличествоНО) + sum(КоличествоПриход) - sum(КоличествоРасход) КоличествоКО,
        
            sum(ВесНО) ВесНО,
            sum(ВесПриход) ВесПриход,
            sum(ВесРасход) ВесРасход,
            sum(ВесНО) + sum(ВесПриход) - sum(ВесРасход) ВесКО,
        
            sum(СуммаНО) СуммаНО,
            sum(СуммаПриход) СуммаПриход,
            sum(СуммаРасход) СуммаРасход,
            sum(СуммаНО) + sum(СуммаПриход) - sum(СуммаРасход) СуммаКО,
        
            Sum(ИнвФакт) ИнвФакт,
            Sum(ИнвРасхождение) ИнвРасхождение
        FROM
            (
            
                SELECT
                    ДеревоУр1.Группа ГруппаМат1,
                    ДеревоУр2.Группа ГруппаМат2,
                    регМХ.МестоХранения,
                    Материалы.ParentID ГруппаМПЗ,
                    регМХ.МПЗ МПЗ,
                    регМХ._IDDoc_,
                
                    Материалы.ТипМатериала,
                    IsNull(ЕдНУ.Коэффициент, 0) Нормоупаковка,
                    Материалы.ГруппаМатериалов,
                    Материалы.СрокПоставкиПодЗаказ,
                
                    регМХ.КоличествоНО,
                    регМХ.КоличествоПриход,
                    регМХ.КоличествоРасход,
                
                    регМХ.КоличествоНО * Материалы.Вес * ЕдИзмВес.Коэффициент ВесНО,
                    регМХ.КоличествоПриход * Материалы.Вес * ЕдИзмВес.Коэффициент ВесПриход,
                    регМХ.КоличествоРасход * Материалы.Вес * ЕдИзмВес.Коэффициент ВесРасход,
                
                    CASE WHEN регП.КоличествоНО != 0 THEN регМХ.КоличествоНО * (регП.СуммаНО / регП.КоличествоНО) ELSE 0 END СуммаНО,
                    CASE WHEN регП.КоличествоПриход != 0 THEN регМХ.КоличествоПриход * (регП.СуммаПриход / регП.КоличествоПриход) ELSE 0 END СуммаПриход,
                    CASE WHEN регП.КоличествоРасход != 0 THEN регМХ.КоличествоРасход * (регП.СуммаРасход / регП.КоличествоРасход) ELSE 0 END СуммаРасход,
                
                    IsNull(Инв.ИнвФакт, 0) ИнвФакт,
                    IsNull(Инв.ИнвРасхождение, 0) ИнвРасхождение
                FROM
                    (
                    
                    SELECT
                        ВидМПЗ,
                        МестоХранения,
                        МПЗ,
                        _IDDoc_
                        ,
                        sum(КоличествоНО) КоличествоНО,
                        sum(КоличествоПриход) КоличествоПриход,
                        sum(КоличествоРасход) КоличествоРасход,
                        sum(КоличествоОборот) КоличествоОборот
                    FROM
                        (
                            
                        SELECT
                            регМестаХранения.МПЗ,
                            регМестаХранения.МестоХранения,
                            регМестаХранения.ВидМПЗ,
                            '     0   ' _IDDoc_,
                            регМестаХранения.Количество КоличествоНО,
                            0 КоличествоПриход,
                            0 КоличествоРасход,
                            0 КоличествоОборот
                        FROM
                            регМестаХраненияИтоги  регМестаХранения
                        WHERE
                            Period = @ДатаИтогов
                        
                        UNION ALL
                        
                        SELECT
                            регМестаХранения.МПЗ,
                            регМестаХранения.МестоХранения,
                            регМестаХранения.ВидМПЗ,
                            '     0   ' _IDDoc_
                            ,
                            (1-2*регМестаХранения.DebKred)*регМестаХранения.Количество КоличествоНО,
                            0 КоличествоПриход,
                            0 КоличествоРасход,
                            0 КоличествоОборот
                        FROM
                            регМестаХранения регМестаХранения
                            
                        WHERE
                            регМестаХранения.Date_Time_IDDOC >= @НачДвиженийДляИтогов
                            And регМестаХранения.Date_Time_IDDOC < @НачДата
                        
                        --    и обороты
                        UNION ALL
                        
                        SELECT
                            регМестаХранения.МПЗ,
                            регМестаХранения.МестоХранения,
                            регМестаХранения.ВидМПЗ,
                            регМестаХранения.IDDoc _IDDoc_,
                            0 КоличествоНО,
                            (1-регМестаХранения.DebKred)*регМестаХранения.Количество КоличествоПриход,
                            регМестаХранения.DebKred*регМестаХранения.Количество КоличествоРасход,
                            (1-2*регМестаХранения.DebKred)*регМестаХранения.Количество КоличествоОборот
                        FROM
                            регМестаХранения регМестаХранения
                            
                        WHERE
                            регМестаХранения.Date_Time_IDDOC >= @НачДата
                            And регМестаХранения.Date_Time_IDDOC < @КонДата
                        
                        ) рег
                        INNER JOIN спрМатериалы Материалы ON Материалы.ид13 = рег.МПЗ
                    LEFT JOIN спрЕдиницыМатериалов ЕдНУ ON ЕдНУ.ID = Материалы.ОсновнаяНормоупаковка
                    WHERE
                        рег.МестоХранения = @ВыбМестоХранения
                    And рег.МПЗ in (SELECT ID FROM [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] (NoLock))
                    GROUP BY
                        ВидМПЗ,
                        МестоХранения,
                        МПЗ,
                        _IDDoc_
                    HAVING
                        sum(КоличествоНО) <> 0 Or sum(КоличествоПриход) <> 0 Or sum(КоличествоРасход) <> 0
                    
                    ) регМХ
                
                    LEFT JOIN (
                    
                    SELECT
                        ВидМПЗ,
                        МестоХранения,
                        МПЗ,
                        _IDDoc_
                        ,
                        sum(КоличествоНО) КоличествоНО,
                        sum(КоличествоПриход) КоличествоПриход,
                        sum(КоличествоРасход) КоличествоРасход,
                        sum(КоличествоОборот) КоличествоОборот,
                        sum(СуммаНО) СуммаНО,
                        sum(СуммаПриход) СуммаПриход,
                        sum(СуммаРасход) СуммаРасход,
                        sum(СуммаОборот) СуммаОборот,
                        sum(ВесНО) ВесНО,
                        sum(ВесПриход) ВесПриход,
                        sum(ВесРасход) ВесРасход,
                        sum(ВесОборот) ВесОборот
                    FROM
                        (
                            
                        SELECT
                            регПартии.МПЗ,
                            регПартии.Партия,
                            регПартии.МестоХранения,
                            регПартии.Договор,
                            регПартии.ВидМПЗ,
                            '     0   ' _IDDoc_,
                            регПартии.Количество КоличествоНО,
                            0 КоличествоПриход,
                            0 КоличествоРасход,
                            0 КоличествоОборот,
                            регПартии.Сумма СуммаНО,
                            0 СуммаПриход,
                            0 СуммаРасход,
                            0 СуммаОборот,
                            регПартии.Вес ВесНО,
                            0 ВесПриход,
                            0 ВесРасход,
                            0 ВесОборот
                        FROM
                            регПартииИтоги  регПартии
                        WHERE
                            Period = @ДатаИтогов
                        
                        UNION ALL
                        
                        SELECT
                            регПартии.МПЗ,
                            регПартии.Партия,
                            регПартии.МестоХранения,
                            регПартии.Договор,
                            регПартии.ВидМПЗ,
                            '     0   ' _IDDoc_
                            ,
                            (1-2*регПартии.DebKred)*регПартии.Количество КоличествоНО,
                            0 КоличествоПриход,
                            0 КоличествоРасход,
                            0 КоличествоОборот,
                            (1-2*регПартии.DebKred)*регПартии.Сумма СуммаНО,
                            0 СуммаПриход,
                            0 СуммаРасход,
                            0 СуммаОборот,
                            (1-2*регПартии.DebKred)*регПартии.Вес ВесНО,
                            0 ВесПриход,
                            0 ВесРасход,
                            0 ВесОборот
                        FROM
                            регПартии регПартии
                            
                        WHERE
                            регПартии.Date_Time_IDDOC >= @НачДвиженийДляИтогов
                            And регПартии.Date_Time_IDDOC < @НачДата
                        
                        --    и обороты
                        UNION ALL
                        
                        SELECT
                            регПартии.МПЗ,
                            регПартии.Партия,
                            регПартии.МестоХранения,
                            регПартии.Договор,
                            регПартии.ВидМПЗ,
                            регПартии.IDDoc _IDDoc_,
                            0 КоличествоНО,
                            (1-регПартии.DebKred)*регПартии.Количество КоличествоПриход,
                            регПартии.DebKred*регПартии.Количество КоличествоРасход,
                            (1-2*регПартии.DebKred)*регПартии.Количество КоличествоОборот,
                            0 СуммаНО,
                            (1-регПартии.DebKred)*регПартии.Сумма СуммаПриход,
                            регПартии.DebKred*регПартии.Сумма СуммаРасход,
                            (1-2*регПартии.DebKred)*регПартии.Сумма СуммаОборот,
                            0 ВесНО,
                            (1-регПартии.DebKred)*регПартии.Вес ВесПриход,
                            регПартии.DebKred*регПартии.Вес ВесРасход,
                            (1-2*регПартии.DebKred)*регПартии.Вес ВесОборот
                        FROM
                            регПартии регПартии
                            
                        WHERE
                            регПартии.Date_Time_IDDOC >= @НачДата
                            And регПартии.Date_Time_IDDOC < @КонДата
                        
                        ) рег
                        INNER JOIN спрМатериалы Материалы ON Материалы.ид13 = рег.МПЗ
                    LEFT JOIN спрЕдиницыМатериалов ЕдНУ ON ЕдНУ.ID = Материалы.ОсновнаяНормоупаковка
                    WHERE
                        рег.МестоХранения = @ВыбМестоХранения
                    And рег.МПЗ in (SELECT ID FROM [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0] (NoLock))
                    GROUP BY
                        ВидМПЗ,
                        МестоХранения,
                        МПЗ,
                        _IDDoc_
                    HAVING
                        sum(КоличествоНО) <> 0 Or sum(КоличествоПриход) <> 0 Or sum(КоличествоРасход) <> 0
                        OR sum(СуммаНО) <> 0 Or sum(СуммаПриход) <> 0 Or sum(СуммаРасход) <> 0
                        OR sum(ВесНО) <> 0 Or sum(ВесПриход) <> 0 Or sum(ВесРасход) <> 0
                    
                    ) регП ON
                        регП.МПЗ = регМХ.МПЗ
                        AND регП.МестоХранения = регМХ.МестоХранения
                        AND регП._IDDoc_ = регМХ._IDDoc_
                
                    LEFT JOIN (
                    
                        SELECT
                            ДокИнв.МестоХранения,
                            ДокИнвТЧ.МПЗ,
                            '     0   ' _IDDoc_,
                            Sum(ДокИнвТЧ.Количество) ИнвФакт,
                            Sum(ДокИнвТЧ.Количество - ДокИнвТЧ.КоличествоУчет) ИнвРасхождение
                        FROM
                            ЖурналДокументов жИнв
                            LEFT JOIN докИнвентаризацияМПЗ ДокИнв ON ДокИнв.IDDoc = жИнв.IDDoc
                            LEFT JOIN докИнвентаризацияМПЗТЧ ДокИнвТЧ ON ДокИнвТЧ.IDDoc = жИнв.IDDoc
                        WHERE
                            жИнв.IDDocDef = 20430
                            AND жИнв.Date_Time_IDDoc >= @НачДата AND  жИнв.Date_Time_IDDoc <= @КонДата
                            AND жИнв.IsMark = 0
                        GROUP BY
                            ДокИнв.МестоХранения,
                            ДокИнвТЧ.МПЗ
                        
                    ) Инв ON
                        Инв.МПЗ = регМХ.МПЗ
                        AND Инв.МестоХранения = регМХ.МестоХранения
                        AND Инв._IDDoc_ = регМХ._IDDoc_
                
                    INNER JOIN спрМатериалы Материалы ON Материалы.ид13 = регМХ.МПЗ
                    LEFT JOIN спрЕдиницыМатериалов ЕдНУ ON ЕдНУ.ID = Материалы.ОсновнаяНормоупаковка
                    LEFT JOIN спрЕдиницыМатериалов ЕдИзмВес ON ЕдИзмВес.ID = Материалы.ЕдиницаИзмеренияВеса
                
                    LEFT JOIN (
                        SELECT distinct
                            Группы.Level,
                            Группы.ID Группа,
                            Элементы.ID Материал,
                            Материалы.Descr
                        FROM
                            Дерево_Материалы Элементы
                            LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = '     0   '
                            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
                    ) ДеревоУр1 ON ДеревоУр1.Материал = Материалы.ID AND ДеревоУр1.Level = 1
                
                    LEFT JOIN (
                        SELECT distinct
                            Группы.Level,
                            Группы.ID Группа,
                            Элементы.ID Материал,
                            Материалы.Descr
                        FROM
                            Дерево_Материалы Элементы
                            LEFT JOIN Дерево_Материалы Группы ON Группы.ID = Элементы.ParentID and Группы.ParentID = '     0   '
                            LEFT JOIN спрМатериалы Материалы ON Материалы.ID = Группы.ID
                    ) ДеревоУр2 ON ДеревоУр2.Материал = Материалы.ID AND ДеревоУр2.Level = 2
                
                
            ) рег
        
        
        GROUP BY
            МестоХранения ,
            СрокПоставкиПодЗаказ ,
            МПЗ
        
    ) Данные
    
    LEFT JOIN спрМестаХранения спрМестоХранения (NoLock) on спрМестоХранения.ID = Данные.МестоХранения
    LEFT JOIN спрСрокПоставкиНаМатериалыПодЗаказ спрСрокПоставкиПодЗаказ (NoLock) on спрСрокПоставкиПодЗаказ.ID = Данные.СрокПоставкиПодЗаказ
    LEFT JOIN .спрМатериалы спрМПЗ (NoLock) on спрМПЗ.ид13 = Данные.МПЗ
ORDER BY
    спрМестоХранения.ПорядокСортировки, спрСрокПоставкиПодЗаказ.ПорядокСортировки, спрМПЗ.ПорядокСортировки


--        ПОСТФИКС

Drop Table [#680832d7-2ace-4926-8bc4-ed9d8c6fb3b0]
77 Ranger_83
 
24.10.14
15:09
(0) С опытом.
78 AROM
 
24.10.14
15:12
(61) Процедура на экран нормально, а процедура из 3-4 строк, в которой вызывается еще процедура - маразм. Как и латиница в 1с коде
79 SUA
 
24.10.14
15:41
(78) смотря какая цель
на клиентский обработчик изменения повесить вызов сервера (1 строка, процедура) - нормально, далее в серверном блоке получение новых вложенных реквизитов (1 строка, процедура) и обновление формы (1 строка, процедура, итого процедура из 2х строк с вызовом 2х процедур) - отлично
да и без латиницы 7++ или работу с мс-офис хрен напишешь
80 DrZombi
 
гуру
24.10.14
15:43
(0) А первый мне больше нравится. Стабильней :)
Программист всегда исправляет последнюю ошибку.