Есть такой вопрос. У одной номенклатуры есть несколько "цветов" и "размеров". Запросом достается номенклатура,цвета,количество(все выводится в тз на форму). Теперь нужно вывести в макет данные прайса. Но таким образом, чтоб отображалась номенклатура и в каждой последующей строчке все цвета ей принадлежащие, потом снова номенклатура и цвета. Подскажите как это правильно сделать, как правильно обойти циклом тз!? Не могу сообразить как условие правильно поставить, чтоб выводить сначала всё по одной номенклатуре, потом по другой!? При этом же еще нужно как-то не вывести повторные, не знаю убрать в какой-то массив, те строки, что мы уже вывели. Или я в неправильном направлении шагаю!? Подскажите, пожалуйста.
---
Наверное, ничего путного, извините. Есть небольшой набросок, но он так и прости оптимизации. Попробуйте, может Вам подойдет:

```1c
    ТабДокумент = Новый ТабличныйДокумент;

    // Макеты областей печати
    ОблСтрокаТовара = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаТовара");
    ОблСтрокаЦвета = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаТовара");
    ОблЗаголовокРазмера = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаРазмера");
    ОблСтрокаРазмера = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаРазмера");

    // Получим список всех размеров в исходной таблице.
    КоллекцияРазмеров = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Размер", Истина);

    // Теперь всю номенклатуру прайса
    КоллекцияНоменклатуры = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Номенклатура", Истина);

    // Начинаем вывод прайса
    Для каждого Номенклатура Из КоллекцияНоменклатуры Цикл

    // Заголовок с номенклатурой и всеми вариантами размеров
    ОблСтрокаТовара.Параметры.Номенклатура = Номенклатура;
    ТабДокумент.Вывести(ОблСтрокаТовара);

    Для каждого Размер Из КоллекцияРазмеров Цикл
    ОблЗаголовокРазмера.Параметры.Размер = Размер;
    ТабДокумент.Присоединить(ОблЗаголовокРазмера);
    КонецЦикла;

    // Таблица цветов и размеров текущей номенклатуры
    СтрокиНоменклатуры = Объект.Товары.Выгрузить(Новый Структура("Номенклатура",Номенклатура));

    // Все цвета для данной номенклатуры
    КоллекцияЦветов = ОбщегоНазначения.ВыгрузитьКолонку(СтрокиНоменклатуры, "Цвет", Истина);

    Для каждого Цвет Из КоллекцияЦветов Цикл

    // Сначала выводим сам цвет
    ОблСтрокаЦвета.Параметры.Цвет = Цвет;
    ТабДокумент.Вывести(ОблСтрокаЦвета);

    // Теперь перебираем все размеры.
    СтруктураПоиска = Новый Структура("Цвет,Размер");
    Для каждого Размер Из КоллекцияРазмеров Цикл

    // Проверяем пару значений цвет-размер
    СтруктураПоиска.Цвет = Цвет;
    СтруктураПоиска.Размер = Размер;

    Если СтрокиНоменклатуры.НайтиСтроки(СтруктураПоиска).Количество() Тогда
    ОблСтрокаРазмера.ЦветФона = ЦветПоложительногоРезультата; // цвет с таким размером присутствует в прайсе
    Иначе
    ОблСтрокаРазмера.ЦветФона = ЦветОтрицательногоРезультата; // такого размера нет
    КонецЕсли;

    ТабДокумент.Присоединить(ОблСтрокаРазмера);

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;
```
---
Уточните, пожалуйста, Вам необходимо работать именно с таблицей значений? Использовать дерево значений, либо иерархическую выборку из результата запроса не получится?
---
Предлагаете заменить тз на дерево значений на форме!?
---
Печатная форма формируется по данным таблицы формы? И еще вопрос: конфигурация типовая?
---
```1c
    массив = неопределено;
    Для каждого стр из ТЗ цикл
    Если массив <> стр.номенклатура тогда
    макет.параметр.цвет = стр.цвет;
    массив = стр.номенклатура;
    табдок.Вывести(макет);
    Иначе
    макет.параметр.цвет = стр.цвет;
    табдок.Присоеденить(макет);
    Конеццикла;
```
---
Это чуть-чуть не то, мне кажется. Есть же еще колонки с размерами, они присоединяются справа в макете. Есть строки тз: номенкл/цвет/размер
То есть, в тз может быть так:
                                   Носки желтые 42р
                                   Носки желтые 43р
                                   Носки красные 44р
                                   Носки синие 52р.

И выглядеть в итоге должно как-то так
Носки 42 43 44 52
Желтые
Синие
Красные

Рубашка 42 43 44 52
Белая
Черная
Серая
---
Колонки с размерами присоединяются, все ок. А вот как номенклатуру с разбивкой по цветам вывести не могу сообразить...(((
---
Так Вам кросс-таблица нужна? Т.е. еще на пересечении колонок с размером и цветом потребуется поставить какую-нибудь отметку, сигнализирующую, что пара "цвет-размер" есть в исходной таблице? Можете хоть как-нибудь нарисовать конечный результат для пары номенклатур с различными наборами цветов и размеров?
---
Такс. Значит в колонках не сами размеры, а их диапазоны? Или же это и есть значения размеров? Для всех выводимых номенклатурных позиций набор значений размеров одинаковый?
---
Колонки указывают имеющиеся размеры(все что есть в опр. папке), а на пересечении раскрашивается:
Есть в наличии
Нет в наличии
Не существует товарной позиции (нет такого размера у данной номенклатуры)
---
Ну и последний вопрос. В исходной таблице данные каким-либо образом отсортированы? На это можно будет положиться при выводе печатной формы? И если отсортированы, то каким образом?
---
Нет не отсортированы, есть только одна группировка Характеристика(групповое): цвет,размер(макс) в запросе.
---
Ну, так что, подскажешь что нибудь?
---
Наверное, ничего путного, извините. Есть небольшой набросок, но он так и прости оптимизации. Попробуйте, может Вам подойдет:

```1c
    ТабДокумент = Новый ТабличныйДокумент;

    // Макеты областей печати
    ОблСтрокаТовара = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаТовара");
    ОблСтрокаЦвета = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаТовара");
    ОблЗаголовокРазмера = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаРазмера");
    ОблСтрокаРазмера = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаРазмера");

    // Получим список всех размеров в исходной таблице.
    КоллекцияРазмеров = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Размер", Истина);

    // Теперь всю номенклатуру прайса
    КоллекцияНоменклатуры = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Номенклатура", Истина);

    // Начинаем вывод прайса
    Для каждого Номенклатура Из КоллекцияНоменклатуры Цикл

    // Заголовок с номенклатурой и всеми вариантами размеров
    ОблСтрокаТовара.Параметры.Номенклатура = Номенклатура;
    ТабДокумент.Вывести(ОблСтрокаТовара);

    Для каждого Размер Из КоллекцияРазмеров Цикл
    ОблЗаголовокРазмера.Параметры.Размер = Размер;
    ТабДокумент.Присоединить(ОблЗаголовокРазмера);
    КонецЦикла;

    // Таблица цветов и размеров текущей номенклатуры
    СтрокиНоменклатуры = Объект.Товары.Выгрузить(Новый Структура("Номенклатура",Номенклатура));

    // Все цвета для данной номенклатуры
    КоллекцияЦветов = ОбщегоНазначения.ВыгрузитьКолонку(СтрокиНоменклатуры, "Цвет", Истина);

    Для каждого Цвет Из КоллекцияЦветов Цикл

    // Сначала выводим сам цвет
    ОблСтрокаЦвета.Параметры.Цвет = Цвет;
    ТабДокумент.Вывести(ОблСтрокаЦвета);

    // Теперь перебираем все размеры.
    СтруктураПоиска = Новый Структура("Цвет,Размер");
    Для каждого Размер Из КоллекцияРазмеров Цикл

    // Проверяем пару значений цвет-размер
    СтруктураПоиска.Цвет = Цвет;
    СтруктураПоиска.Размер = Размер;

    Если СтрокиНоменклатуры.НайтиСтроки(СтруктураПоиска).Количество() Тогда
    ОблСтрокаРазмера.ЦветФона = ЦветПоложительногоРезультата; // цвет с таким размером присутствует в прайсе
    Иначе
    ОблСтрокаРазмера.ЦветФона = ЦветОтрицательногоРезультата; // такого размера нет
    КонецЕсли;

    ТабДокумент.Присоединить(ОблСтрокаРазмера);

    КонецЦикла;

    КонецЦикла;

    КонецЦикла;
```
---
Спасибо огроменное, то, что надо. Понятно стало как это доделать, переписал немного и стало то, что надо.
---
```1c
    массив = неопределено; ///Для номенклатуры
    МассивЦветов = неопределено; ///для цветов
    Для каждого стр из ТЗ цикл
    Если массив <> стр.номенклатура тогда ///первая номенклатура выводится
    макет.параметр.Размер= стр.Размер;
    МассивЦветов.Добавить(стр.Цвет);
    массив = стр.номенклатура;
    табдок.Вывести(макет);
    Иначе ////Остальные заполняются
    макет.параметр.Размер= стр.Размер;
    МассивЦветов.Добавить(стр.Цвет);
    табдок.Присоеденить(макет);
    Конецесли;
    Если массив = ТЗ [ТЗ .Индекс(стр)-1].Номенклатура тогда ////Если очередь дошла до ///следующей номенклатуры, сначала выводятся цвета
    Для каждого масс из массивЦветов цикл
    макет.параметр.Размер= стр.Цвет;
    табдок.Вывести(макет);
    Конеццикла;
    Конецессли
    Конеццикла;
```
---
Не то пальто(((
---
Свойства как реквизиты номенклатуры или через ПВХ? Если реквизиты, тогда в макете прописать строкиТЧ номенклатура-свойство1-цена, --свойство2-цена. Группировка по номенклатуре и реквизитам, в которое свойства вписаны.
По-моему так, могу ошибаться.
---
Вообще не дошло, о чем вы. Цвет- это ХарактеристикиНоменклатурыДополнительныеРеквизиты.Свойство, а не реквизит номенклатуры...если вы об этом спрашивали
---
Можно попробовать так:

```1c
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номенклатура");
    ТЗ.Колонки.Добавить("Размер");
    ТЗ.Колонки.Добавить("Цвет");
    ТЗ.Колонки.Добавить("Цена");

    ТЗНоменклатура = Тз.Скопировать(,"Номенклатура");
    ТЗНоменклатура.Свернуть("Номенклатура");
    ТЗРазмер = Тз.Скопировать(,"Номенклатура,Размер");
    ТЗРазмер.Свернуть("Номенклатура,Размер");

    Отбор1 = Новый Структура("Номенклатура");
    Отбор2 = Новый Структура("Номенклатура,Размер");

    Для каждого СтрНоменклатура Из ТЗНоменклатура Цикл
    ЗаполнитьЗначенияСвойств(Отбор1,СтрНоменклатура);
    Для каждого СтрРазмер Из ТЗРазмер.НайтиСтроки(Отбор2) Цикл
    ЗаполнитьЗначенияСвойств(Отбор2,СтрРазмер);
    Для каждого СтрДетальныеЗаписи Из ТЗРазмер.НайтиСтроки(Отбор2) Цикл
    //
    КонецЦикла;
    КонецЦикла;

    КонецЦикла;
```
---
Черт, как ни стараюсь, не получается так как на картинке(((