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

Реквизиты я получаю запросом.Т.е. Запрос.Цвет, Запрос.Тип и т.д.
В список я заношу товары, что бы получить их цену, согласно выбранному Типу Цен.
Возможно не правильный алгоритм выбрал.Может вы подскажете как это лучше реализовать?
Acid
Список Убить!!!

Выгрузите результат запроса в таблицу значений. И уже в ней сможете посмотреть что выбралось.

тз = СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(тз);
тз.ВыбратьСтроку();
Flexy
В ТЗ я получаю только родитель и товар.
5_kopeek
Зачем в таблицу выгружать? Можно все непосредственно в цикле обхода результатов запроса.
Нижняя строка -- это секция Товар? На момент вывода этой секции Вы уже вышли из цикла обхода результатов второй группировки, а обходите циклом список значений, поэтому существует правильное позиционирование на элементе списка, а не на значении переменной запроса. Т.е. надо было бы
выводить Наименование.ЦветВПрайсе и т.д. Щас без списка сделаю.
Flexy
Цитата(5_kopeek @ 20.07.11, 8:32) необходимо зарегистрироваться для просмотра ссылки
Нижняя строка -- это секция Товар?

Так точно wink.gif
5_kopeek
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    Таб.ВывестиСекцию("Шапка");
    Таб.ВывестиСекцию("Заголовок");
    Пока Запрос.Группировка(1) = 1 Цикл
        Если Запрос.Родитель.НеВыводитьВПрайс = 1 Тогда
            Продолжить;
        КонецЕсли;
        Если Запрос.Родитель.Уровень() = 2 Тогда
            Таб.ВывестиСекцию("ВидТовара");
        ИначеЕсли Запрос.Родитель.Уровень() = 3 Тогда
            Таб.ВывестиСекцию("ТоргМарка");
            Пока Запрос.Группировка(2) = 1 Цикл  
                // Изменено 5_копеек (начало)
                Товар=Запрос.Товар;
                ЦенаЦены = глВернутьЦену(Товар, ВыбКатегорияЦены);
                Если ПустоеЗначение(ЦенаЦены) = 0 Тогда
                    Цена = ЦенаЦены.Цена.получить(РабочаяДата());  
                Иначе
                    Цена = "";
                КонецЕсли;
                
                Если Инд = 1 Тогда
                    ЦенаИнд = Число(Товар.Идентикатив.Получить(РабочаяДата()));        
                    Если (ЦенаИнд > Число(Цена)) Тогда
                        Цена = ЦенаИнд;    
                    КонецЕсли;
                КонецЕсли;
                Таб.ВывестиСекцию("Товар");
                // Изменено 5_копеек (конец)
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;

Только в таком случае в таблице выводить нужно Запрос.Цвет, или Запрос.Товар.ЦветВПрайсе, или Товар.ЦветВПрайсе.
Flexy
5_kopeek Спасибо!Работает wink.gif friends.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.