Здравствуйте.

Пытаюсь сделать печатную форму для документа перемещения товаров. Надо в макете печатной формы сгруппировать товар по местам хранения, а внутри группировки по местам хранения, сгруппировать по температурному режиму хранения.

Необходимые данные в запросе выбрал:

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

Но как это дело группировать сообразить не могу.

P.S. Между первой и второй и остальными группировками по местам хранения, хочу вставить область с пунктирной линией. Типа место отрыва.
---
Исмпользуйте "Конструктор запроса с обработкой результата" и и в запросе введите конструкцию "Итоги по ТемпРежим" - она автоматом Макет создаст с группировками. Потом его можно будет "дорисовать" под себя
---
Да очень легко! Делаешь вывод в отчет:

```1c
    ОбластьСклад =
    ОбластьСвойство =
    Отчет.НачатьАвтогруппировкуСтрок();

    ВыборкаСкл = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаСкл.Следующий() Цикл
    // Разрыв
    Отчет.Вывести(ОбластьСклад, ВыборкаСкл.Уровень());
    ВыборкаСво = ВыборкаСкл.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаСво.Следующий() Цикл
    Отчет.Вывести(ОбластьСвойство, ВыборкаСво.Уровень());
    КонецЦикла; // ВыборкаВал
    КонецЦикла;
    Отчет.ЗакончитьАвтогруппировкуСтрок();
```

В макете ОбластьСклад рисуем имя склада, черточки. И можно задать свойство "Не отрывать от следующего", А можно и "С новой страницы", тогда и черточки не нужны.
---
чего то не понятно. Тут возможно я дал не полные данные. Приведу полный текст функции:

```1c
    Функция Печать() Экспорт
    // Переменные
    СвойствоН = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(" Температурный режим");

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

    ТаблицаТоваров = ЗапросДанных.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    // Получаем макет и его области
    Макет = ПолучитьМакет("Накладная");
    ОблЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОблОтправитель = Макет.ПолучитьОбласть("Отправитель");
    ОблПолучатель = Макет.ПолучитьОбласть("Получатель");
    ОблШапкаТабл = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОблМестоХран = Макет.ПолучитьОбласть("ТабМестоХранения");
    ОблМестоОтрыва = Макет.ПолучитьОбласть("МестоОтрыва");
    ОблТемпРежим = Макет.ПолучитьОбласть("ТабТемпРежим");
    ОблСтрТаблицы = Макет.ПолучитьОбласть("СтрокаТаблицы");

    // Заполняем макет
    Пока ТаблицаТоваров.Следующий() Цикл

    КонецЦикла;
```
---
для того, чтобы заработало (2) нужно в запросе итоги добавить: по местам хранения и по темп.режиму
---
так мне надо сгруппировать не в запросе, а на макете.
---
Вот цикл:

```1c
    ТабДок.Вывести(ОблШапкаТабл);
    Ном = 0; // Нумерация в таблице

    Пока ТаблицаТоваров.Следующий() Цикл
    Ном = Ном + 1;
    ОблМестоХран.Параметры.МестоХранения = ТаблицаТоваров.МестоХранения;
    ОблТемпРежим.Параметры.ТемпературныйРежим = ТаблицаТоваров.ТемпРежим;

    ТабДок.Вывести(ОблМестоХран);
    Если ОблМестоХран.Параметры.МестоХранения = ТаблицаТоваров.МестоХранения Тогда
    ТабДок.Вывести(ОблТемпРежим);
    Если ОблТемпРежим.Параметры.ТемпературныйРежим = ТаблицаТоваров.ТемпРежим Тогда
    ОблСтрТаблицы.Параметры.НомерСтроки = Ном;
    ОблСтрТаблицы.Параметры.Штрихкод = ?(ТипКода = -1,",ТаблицаТоваров.Штрихкод + РазделСтрок);
    ОблСтрТаблицы.Параметры.Номенклатура = ТаблицаТоваров.Номенклатура;
    ОблСтрТаблицы.Параметры.НомерСерии = СокрЛП(ТаблицаТоваров.СерияН.СерийныйНомер);
    ОблСтрТаблицы.Параметры.СрокГодности = ТаблицаТоваров.СерияН.СрокГодности;
    ОблСтрТаблицы.Параметры.НомерСертификата = ТаблицаТоваров.СерияН.Сертификат;
    ОблСтрТаблицы.Параметры.СрокДействияСерт = ТаблицаТоваров.СерияН.СрокДействияСертификата;
    ОблСтрТаблицы.Параметры.Количество = ТаблицаТоваров.Количество;
    ОблСтрТаблицы.Параметры.ЕдиницаИзмерения = ТаблицаТоваров.ЕдиницаИзмерения;

    ТабДок.Вывести(ОблСтрТаблицы);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    ТабДок.Вывести(ОблМестоОтрыва);

    Возврат ТабДок;
```

Идей, как собрать в группы, что-то нет. Поля "МестоХранения" и "ТемпературныйРежим" повторяются в каждной строке:

Я же хочу получить такой результат:
---
мда...изврат еще тот)

Но код отрабатывает ровно так, как вы его написали:
- у вас область ОблМестоХран выводится на каждой итерации цикла
- к тому же параметр в макете МестоХранения заполняется до операции сравнения со значением в строке выборки, поэтому условие ОблМестоХран.Параметры.МестоХранения = ТаблицаТоваров.МестоХранения всегда будет в Истина
- дальше почему-то проверяется на равенство областьхранения, а выводится область температуры??...

Вообще правильную идею вам дали во (2) , но для того чтобы она работала вам нужно итоги добавить в запрос (о чем говорилось выше):

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

    ВыборкаМестаХранения = ЗапросДанных.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    // Получаем макет и его области
    Макет = ПолучитьМакет("Накладная");
    ОблЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОблОтправитель = Макет.ПолучитьОбласть("Отправитель");
    ОблПолучатель = Макет.ПолучитьОбласть("Получатель");
    ОблШапкаТабл = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОблМестоХран = Макет.ПолучитьОбласть("ТабМестоХранения");
    ОблМестоОтрыва = Макет.ПолучитьОбласть("МестоОтрыва");
    ОблТемпРежим = Макет.ПолучитьОбласть("ТабТемпРежим");
    ОблСтрТаблицы = Макет.ПолучитьОбласть("СтрокаТаблицы");

    // Заполняем макет
    Пока ВыборкаМестаХранения .Следующий() Цикл
    ОблМестоХран.Параметры.МестоХранения = ВыборкаМестаХранения.МестоХранения;
    ТабДок.Вывести(ОблМестоХран);
    ВыборкаТемпРежим = ВыборкаМестаХранения.Выбрать();
    Пока ВыборкаТемпРежим .Следующий() Цикл
    ОблТемпРежим.Параметры.ТемпературныйРежим = ВыборкаТемпРежим .ТемпРежим;
    ТабДок.Вывести(ОблТемпРежим);
    ВыборкаТовары = ВыборкаТемпРежим .Выбрать();
    Пока ВыборкаТовары .Следующий() Цикл
    ОблСтрТаблицы.Параметры.Номенклатура = ВыборкаТовары.Номенклатура;
    ОблСтрТаблицы.Параметры.НомерСерии = СокрЛП(ВыборкаТовары.СерияН.СерийныйНомер);
    ОблСтрТаблицы.Параметры.СрокГодности = ВыборкаТовары.СерияН.СрокГодности;
    и т.д.
    ТабДок.Вывести(ОблСтрТаблицы);
    КонецЦикла;
    КонецЦикла;
    КонецЦикла;;
```

Код не тестировался, могут быть синтаксические ошибки. Но общая идея, надеюсь понятна.

P.s. пользуйтесь отладчиком, если код выдает не то, что ожидаете и вам сложно его проанализировать
---
Исмпользуйте "Конструктор запроса с обработкой результата" и и в запросе введите конструкцию "Итоги по ТемпРежим" - она автоматом Макет создаст с группировками. Потом его можно будет "дорисовать" под себя
---
Спасибо! Нашел там то, что мне помогло!
---
Отлично, группировки получились! Но есть несколько ошибок:
- При заполнении табличной части, пропускается товар у которого свойство "Температурный режим" не заполнено, можно ли этот товар вывести в отдельную группу?
- У номенклатуры может быть несколько штрихкодов, но в таблицу выводится только один. Как вывести все штрихкоды?

P.S. Можно ли сделать, чтобы область "ОблМестоОтрыва", выводилась только между группами "МестоХранения". Т.е. чтобы не выводилось в конце накладной?
---
вам бы книги почитать или на курсы сходить...
---
читаю книгу, курсы дорого... В книге такие вопросы не рассматриваются. Потому и спрашиваю. Наверное нужна специально книга по запросам.