Есть такой вопрос. У одной номенклатуры есть несколько "цветов" и "размеров". Запросом достается номенклатура,цвета,количество(все выводится в тз на форму). Теперь нужно вывести в макет данные прайса. Но таким образом, чтоб отображалась номенклатура и в каждой последующей строчке все цвета ей принадлежащие, потом снова номенклатура и цвета. Подскажите как это правильно сделать, как правильно обойти циклом тз!? Не могу сообразить как условие правильно поставить, чтоб выводить сначала всё по одной номенклатуре, потом по другой!? При этом же еще нужно как-то не вывести повторные, не знаю убрать в какой-то массив, те строки, что мы уже вывели. Или я в неправильном направлении шагаю!? Подскажите, пожалуйста.
По теме из базы знаний
- Прайс с выводом реквизитов номенклатуры и цен для всех единиц измерения товара с изображениями
- Картинка в таблице СКД (управляемое приложение) на примере УТ11, простое решение "в лоб" или легкая модификация стандартного отчета Прайс-Лист
- Печать прайс-листа с картинками для 1С Предприятие 7.7 Торговля и Склад 9.2 - пример реализации
- По-настоящему свои макеты в отчетах СКД. Исследование процесса компоновки и генерация кода отчета
- Обход по группировкам в запросе, соединение таблиц, параметры в запросе, выгрузка прайс-листа в Excel, PDF, Docx, TXT
Найденные решения
(19) Наверное, ничего путного, извините. Есть небольшой набросок, но он так и прости оптимизации. Попробуйте, может Вам подойдет:
ТабДокумент = Новый ТабличныйДокумент;
// Макеты областей печати
ОблСтрокаТовара = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаТовара");
ОблСтрокаЦвета = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаТовара");
ОблЗаголовокРазмера = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаРазмера");
ОблСтрокаРазмера = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаРазмера");
// Получим список всех размеров в исходной таблице.
КоллекцияРазмеров = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Размер", Истина);
// Теперь всю номенклатуру прайса
КоллекцияНоменклатуры = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Номенклатура", Истина);
// Начинаем вывод прайса
Для каждого Номенклатура Из КоллекцияНоменклатуры Цикл
// Заголовок с номенклатурой и всеми вариантами размеров
ОблСтрокаТовара.Параметры.Номенклатура = Номенклатура;
ТабДокумент.Вывести(ОблСтрокаТовара);
Для каждого Размер Из КоллекцияРазмеров Цикл
ОблЗаголовокРазмера.Параметры.Размер = Размер;
ТабДокумент.Присоединить(ОблЗаголовокРазмера);
КонецЦикла;
// Таблица цветов и размеров текущей номенклатуры
СтрокиНоменклатуры = Объект.Товары.Выгрузить(Новый Структура("Номенклатура",Номенклатура));
// Все цвета для данной номенклатуры
КоллекцияЦветов = ОбщегоНазначения.ВыгрузитьКолонку(СтрокиНоменклатуры, "Цвет", Истина);
Для каждого Цвет Из КоллекцияЦветов Цикл
// Сначала выводим сам цвет
ОблСтрокаЦвета.Параметры.Цвет = Цвет;
ТабДокумент.Вывести(ОблСтрокаЦвета);
// Теперь перебираем все размеры.
СтруктураПоиска = Новый Структура("Цвет,Размер");
Для каждого Размер Из КоллекцияРазмеров Цикл
// Проверяем пару значений цвет-размер
СтруктураПоиска.Цвет = Цвет;
СтруктураПоиска.Размер = Размер;
Если СтрокиНоменклатуры.НайтиСтроки(СтруктураПоиска).Количество() Тогда
ОблСтрокаРазмера.ЦветФона = ЦветПоложительногоРезультата; // цвет с таким размером присутствует в прайсе
Иначе
ОблСтрокаРазмера.ЦветФона = ЦветОтрицательногоРезультата; // такого размера нет
КонецЕсли;
ТабДокумент.Присоединить(ОблСтрокаРазмера);
КонецЦикла;
КонецЦикла;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4)
массив = неопределено;
Для каждого стр из ТЗ цикл
Если массив <> стр.номенклатура тогда
макет.параметр.цвет = стр.цвет;
массив = стр.номенклатура;
табдок.Вывести(макет);
Иначе
макет.параметр.цвет = стр.цвет;
табдок.Присоеденить(макет);
Конеццикла;
Показать
Это чуть-чуть не то, мне кажется. Есть же еще колонки с размерами, они присоединяются справа в макете. Есть строки тз: номенкл/цвет/размер
То есть, в тз может быть так:
Носки желтые 42р
Носки желтые 43р
Носки красные 44р
Носки синие 52р.
И выглядеть в итоге должно как-то так
Носки 42 43 44 52
Желтые
Синие
Красные
Рубашка 42 43 44 52
Белая
Черная
Серая
То есть, в тз может быть так:
Носки желтые 42р
Носки желтые 43р
Носки красные 44р
Носки синие 52р.
И выглядеть в итоге должно как-то так
Носки 42 43 44 52
Желтые
Синие
Красные
Рубашка 42 43 44 52
Белая
Черная
Серая
(9) Так Вам кросс-таблица нужна? Т.е. еще на пересечении колонок с размером и цветом потребуется поставить какую-нибудь отметку, сигнализирующую, что пара "цвет-размер" есть в исходной таблице? Можете хоть как-нибудь нарисовать конечный результат для пары номенклатур с различными наборами цветов и размеров?
(19) Наверное, ничего путного, извините. Есть небольшой набросок, но он так и прости оптимизации. Попробуйте, может Вам подойдет:
ТабДокумент = Новый ТабличныйДокумент;
// Макеты областей печати
ОблСтрокаТовара = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаТовара");
ОблСтрокаЦвета = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаТовара");
ОблЗаголовокРазмера = Макет.ПолучитьОбласть("СтрокаТовара|КолонкаРазмера");
ОблСтрокаРазмера = Макет.ПолучитьОбласть("СтрокаЦвета|КолонкаРазмера");
// Получим список всех размеров в исходной таблице.
КоллекцияРазмеров = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Размер", Истина);
// Теперь всю номенклатуру прайса
КоллекцияНоменклатуры = ОбщегоНазначения.ВыгрузитьКолонку(Объект.Товары, "Номенклатура", Истина);
// Начинаем вывод прайса
Для каждого Номенклатура Из КоллекцияНоменклатуры Цикл
// Заголовок с номенклатурой и всеми вариантами размеров
ОблСтрокаТовара.Параметры.Номенклатура = Номенклатура;
ТабДокумент.Вывести(ОблСтрокаТовара);
Для каждого Размер Из КоллекцияРазмеров Цикл
ОблЗаголовокРазмера.Параметры.Размер = Размер;
ТабДокумент.Присоединить(ОблЗаголовокРазмера);
КонецЦикла;
// Таблица цветов и размеров текущей номенклатуры
СтрокиНоменклатуры = Объект.Товары.Выгрузить(Новый Структура("Номенклатура",Номенклатура));
// Все цвета для данной номенклатуры
КоллекцияЦветов = ОбщегоНазначения.ВыгрузитьКолонку(СтрокиНоменклатуры, "Цвет", Истина);
Для каждого Цвет Из КоллекцияЦветов Цикл
// Сначала выводим сам цвет
ОблСтрокаЦвета.Параметры.Цвет = Цвет;
ТабДокумент.Вывести(ОблСтрокаЦвета);
// Теперь перебираем все размеры.
СтруктураПоиска = Новый Структура("Цвет,Размер");
Для каждого Размер Из КоллекцияРазмеров Цикл
// Проверяем пару значений цвет-размер
СтруктураПоиска.Цвет = Цвет;
СтруктураПоиска.Размер = Размер;
Если СтрокиНоменклатуры.НайтиСтроки(СтруктураПоиска).Количество() Тогда
ОблСтрокаРазмера.ЦветФона = ЦветПоложительногоРезультата; // цвет с таким размером присутствует в прайсе
Иначе
ОблСтрокаРазмера.ЦветФона = ЦветОтрицательногоРезультата; // такого размера нет
КонецЕсли;
ТабДокумент.Присоединить(ОблСтрокаРазмера);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Показать
(9)
массив = неопределено; ///Для номенклатуры
МассивЦветов = неопределено; ///для цветов
Для каждого стр из ТЗ цикл
Если массив <> стр.номенклатура тогда ///первая номенклатура выводится
макет.параметр.Размер= стр.Размер;
МассивЦветов.Добавить(стр.Цвет);
массив = стр.номенклатура;
табдок.Вывести(макет);
Иначе ////Остальные заполняются
макет.параметр.Размер= стр.Размер;
МассивЦветов.Добавить(стр.Цвет);
табдок.Присоеденить(макет);
Конецесли;
Если массив = ТЗ [ТЗ .Индекс(стр)-1].Номенклатура тогда ////Если очередь дошла до ///следующей номенклатуры, сначала выводятся цвета
Для каждого масс из массивЦветов цикл
макет.параметр.Размер= стр.Цвет;
табдок.Вывести(макет);
Конеццикла;
Конецессли
Конеццикла;
Показать
Свойства как реквизиты номенклатуры или через ПВХ? Если реквизиты, тогда в макете прописать строкиТЧ номенклатура-свойство1-цена, --свойство2-цена. Группировка по номенклатуре и реквизитам, в которое свойства вписаны.
По-моему так, могу ошибаться.
По-моему так, могу ошибаться.
Можно попробовать так:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Размер");
ТЗ.Колонки.Добавить("Цвет");
ТЗ.Колонки.Добавить("Цена");
ТЗНоменклатура = Тз.Скопировать(,"Номенклатура");
ТЗНоменклатура.Свернуть("Номенклатура");
ТЗРазмер = Тз.Скопировать(,"Номенклатура,Размер");
ТЗРазмер.Свернуть("Номенклатура,Размер");
Отбор1 = Новый Структура("Номенклатура");
Отбор2 = Новый Структура("Номенклатура,Размер");
Для каждого СтрНоменклатура Из ТЗНоменклатура Цикл
ЗаполнитьЗначенияСвойств(Отбор1,СтрНоменклатура);
Для каждого СтрРазмер Из ТЗРазмер.НайтиСтроки(Отбор2) Цикл
ЗаполнитьЗначенияСвойств(Отбор2,СтрРазмер);
Для каждого СтрДетальныеЗаписи Из ТЗРазмер.НайтиСтроки(Отбор2) Цикл
//
КонецЦикла;
КонецЦикла;
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот