Привет Уважаемые.Делаю обработку прайс-лист для ТИС.
Столкнулся с проблемой.У одного товара есть заполненные Реквизиты: Цвет, Тип, Алк, Ёмкость и КолВоВупаковке.Забил их чисто для тестирования
обработки.А сама проблема в том, что это реквизиты в печатной форме подставляются на всю Группу (ТоргМарка), хотя в карточке других товаров в этой группе они не заполнены.Где копать?
Сам код:
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
Если ПустоеЗначение(ВыбКатегорияЦены) = 1 Тогда
Сообщить("Не выбрана категория цены!!!","!!!");
возврат;
КонецЕсли;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(ЗапросПоСправочнику)
|Товар = Справочник.Номенклатура.ТекущийЭлемент;
|Код = Справочник.Номенклатура.Код;
|Цвет = Справочник.Номенклатура.ЦветВПрайс;
|Тип = Справочник.Номенклатура.ТипВПрайс;
|Алк = Справочник.Номенклатура.АлкВПрайс;
|Ёмкость = Справочник.Номенклатура.ЁмкВПрайс;
|КоличествоВУпаковке = Справочник.Номенклатура.КолВоВПрайс;
|Родитель = Справочник.Номенклатура.Родитель;
|Группировка Родитель Упорядочить по Родитель.Сортировка;
|Группировка Товар Упорядочить по Товар.Сортировка без Групп;
|"+?(ПустоеЗначение(МФВыбТовары)=1,"","Условие(Товар в МФВыбТовары);")+"
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
СП = СоздатьОбъект("СписокЗначений");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("Заголовок");
Пока Запрос.Группировка(1) = 1 Цикл
Если Запрос.Родитель.НеВыводитьВПрайс = 1 Тогда
Продолжить;
КонецЕсли;
Если Запрос.Родитель.Уровень() = 2 Тогда
Таб.ВывестиСекцию("ВидТовара");
ИначеЕсли Запрос.Родитель.Уровень() = 3 Тогда
Таб.ВывестиСекцию("ТоргМарка");
Пока Запрос.Группировка(2) = 1 Цикл
СП.ДобавитьЗначение(Запрос.Товар);
КонецЦикла;
КонецЕсли;
Если Сп.РазмерСписка() = 0 Тогда
Продолжить;
КонецЕсли;
Список = СП.РазмерСписка();
Для н=1 По Список Цикл
Наименование = СП.ПолучитьЗначение(н);
ЦенаЦены = глВернутьЦену(Сп.получитьЗначение(н), ВыбКатегорияЦены);
Если ПустоеЗначение(ЦенаЦены) = 0 Тогда
Цена = ЦенаЦены.Цена.получить(РабочаяДата());
Иначе
Цена = "";
КонецЕсли;
Если Инд = 1 Тогда
ЦенаИнд = Число(Наименование.Идентикатив.Получить(РабочаяДата()));
Если (ЦенаИнд > Число(Цена)) Тогда
Цена = ЦенаИнд;
КонецЕсли;
КонецЕсли;
Таб.ВывестиСекцию("Товар");
КонецЦикла;
СП.УдалитьВсе();
КонецЦикла;
Возникли вопросы:
1. Зачем Вы заносите товары в список, а потом получаете интересующие Вас значения реквизитов, а не делаете это непосредственно при получении товара из запроса?
2. Хотелось бы видеть формулы в таблице, которые возвращают реквизиты одного товара для всех остальных товаров.
Список Убить!!!
Выгрузите результат запроса в таблицу значений. И уже в ней сможете посмотреть что выбралось.
тз = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(тз);
тз.ВыбратьСтроку();
В ТЗ я получаю только родитель и товар.
Зачем в таблицу выгружать? Можно все непосредственно в цикле обхода результатов запроса.
Нижняя строка -- это секция Товар? На момент вывода этой секции Вы уже вышли из цикла обхода результатов второй группировки, а обходите циклом список значений, поэтому существует правильное позиционирование на элементе списка, а не на значении переменной запроса. Т.е. надо было бы
выводить Наименование.ЦветВПрайсе и т.д. Щас без списка сделаю.
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
Таб.ВывестиСекцию("Шапка");
Таб.ВывестиСекцию("Заголовок");
Пока Запрос.Группировка(1) = 1 Цикл
Если Запрос.Родитель.НеВыводитьВПрайс = 1 Тогда
Продолжить;
КонецЕсли;
Если Запрос.Родитель.Уровень() = 2 Тогда
Таб.ВывестиСекцию("ВидТовара");
ИначеЕсли Запрос.Родитель.Уровень() = 3 Тогда
Таб.ВывестиСекцию("ТоргМарка");
Пока Запрос.Группировка(2) = 1 Цикл
// Изменено 5_копеек (начало)
Товар=Запрос.Товар;
ЦенаЦены = глВернутьЦену(Товар, ВыбКатегорияЦены);
Если ПустоеЗначение(ЦенаЦены) = 0 Тогда
Цена = ЦенаЦены.Цена.получить(РабочаяДата());
Иначе
Цена = "";
КонецЕсли;
Если Инд = 1 Тогда
ЦенаИнд = Число(Товар.Идентикатив.Получить(РабочаяДата()));
Если (ЦенаИнд > Число(Цена)) Тогда
Цена = ЦенаИнд;
КонецЕсли;
КонецЕсли;
Таб.ВывестиСекцию("Товар");
// Изменено 5_копеек (конец)
КонецЦикла;
КонецЕсли;
КонецЦикла;
5_kopeek Спасибо!Работает
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua