Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Документ "Поступление товаров и услуг"
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
MH.z
Добрый день. Конфигурация Ут 11
Проблема в следующем, есть документ Поступление товаров и услуг. Товара заказывалось к примеру 5 штук карандашей. Поставщик привез 7 штук.Документ сканируют и проганяют в 1С. Как сделать так, чтобы когда товара приехало больше в одной строке табличной части показывало 5 штук одним цветом(неважно каким) А в следующей строке показывало лишнии 2 штуки товара и другим цветом.
Все что я смог сделать так это просто поменять цвет текста во всех строках sad.gif Может нужно сделать какое нибудь условие? Если так , то подскажите какое.
Спасибо!
alex040269
ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки);

ОформлениеСтроки отвечает за вывод, в т.ч. и цвет строки.

Ну а для разделения нужно анализировать РегистрНакопления.ЗаказыПоставщикам.
Vofka
Можно писать код из 1С 6.0 ?
MH.z
Версия 1С 8.2 Ничего не понял если честно. Я сделал следующее :

&НаСервере
Функция ИзменитьЦвет(Номенклатура)
    ЭтаФорма.УсловноеОформление.Элементы.Очистить();
    ЦветКрасный = Новый Цвет(255,0,0); //красный
    ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
    ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
       ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");
    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Номенклатура;
    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветКрасный);    
КонецФункции

И соответственно вызвал функцию в процедуре "ТоварыНоменклатураПриИзменении(Элемент)"
Vofka
Цитата(MH.z @ 03.05.12, 15:22) необходимо зарегистрироваться для просмотра ссылки
Версия 1С 8.2

Так зачем вы изначально создаете тему в разделе "Вся1С"? icon_cuss.gif Вторая ваша тема за сегодня! Прочтите правила! Следующие ваши темы будут лететь в корзину, если будут оформлены не по правилам!
Batchir
Ну и раз УТ 11, то это управляемые формы, так что переезжаем ещё разок
Sharki
Для начала нужно определить по какому признаку(условию) надо выделять те или иные строки(какое-то колво больше чего-то или одна из колонок равна чему-то одному).
Далее писать ваш код
Функция ИзменитьЦвет(Номенклатура)
    ЭтаФорма.УсловноеОформление.Элементы.Очистить();
    ЦветКрасный = Новый Цвет(255,0,0); //красный
    ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
    ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");
    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Номенклатура;
    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветКрасный);    
КонецФункции


НО верно установить ключевые элементы:
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Номенклатура;


Левое значение поле для сравнение, правое значение с которым сравнивают.
Выполнять этот код при изменении не даст нужного результата, выполнять его следует один раз например в событие ПриСозданииНаСервере.
Так же стоит отметить это поле
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");

Здесь задается поле для которого будет использоваться условное оформление. Не уверен что поле для оформления лучше ставить всю таблицу.

Пример моего использования такого кода
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
    ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТаблицаЗначенийНаименованиеCCS");//одна колонка таблицы именно элемент формы а не реквизит объекта формы.
    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаЗначений.Наименование1");//реквизит [объекта] формы
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
    ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаЗначений.Наименование2"); //условие: если одна колонка не равна второй тогда выделять красным
    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);


з.ы. Ваш код будет менять менять цвета строк таблицы только тех у которых задана указанная номенклатура

пример моего кода устанавливает цвет для одной ячейки таблицы если одна колонка строки не равна второй.
MH.z
Я сделал следующим образом, но у меня не меняет цвет sad.gif
Может подскажите где ошибся?!
&НаСервере
Функция ИзменитьЦвет(Номенклатура, Цвет)
    ЭтаФорма.УсловноеОформление.Элементы.Очистить();
    ЦветФиолетовый = Новый Цвет(128, 0, 255); // серый
    ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
    ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
       ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");
    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Номенклатура;
    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Цвет);    
КонецФункции


&НаКлиенте
Процедура ТоварыПриИзменении(Элемент)
    Для каждого Стр ИЗ Объект.Товары  Цикл
    Для Каждого Стр2 ИЗ Объект.Расхождения Цикл
        Если Стр.Номенклатура <> Стр2.Номенклатура  Тогда
            ИзменитьЦвет(Стр.Номенклатура,);
                      
            КонецЕсли;
    КонецЦикла;    
    КонецЦикла;
КонецПроцедуры


И добавил Цикл в модуль формы ПриОткрытии
logist
Цитата(MH.z @ 07.05.12, 20:46) необходимо зарегистрироваться для просмотра ссылки
ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Цвет);

Судя по коду, значение Цвет отсутствует.
MH.z
И правда smile.gif Спасиб!
MH.z
Уважаемые помогите пожалуйста еще. С изменением цвета все отлично, только вот теперь документы при открытии грузятся по пол часа. Как можно от этого избавиться? Происходит это из-за того, что я цикл добавил в процедуру ПриОткрытии. Но надо же чтобы было видно при открытии изменение цвета.
Спасибо!
Vofka
Попробуйте функцию ИзменитьЦвет перенести в контекст клиента.
MH.z
Так не работает. Попробовал сделать через запрос. Текст следующий:
&НаСервере
Функция Ц_ПолучитьЦвет()
     Запрос = Новый Запрос;
    Запрос.Текст =
"ВЫБРАТЬ
|    ПоступлениеТоваровУслугРасхождения.Номенклатура
|ИЗ
|    Документ.ПоступлениеТоваровУслуг.Расхождения КАК ПоступлениеТоваровУслугРасхождения
|ГДЕ
|    ПоступлениеТоваровУслугРасхождения.ВариантРасхождений = &ВариантРасхождений
|    И ПоступлениеТоваровУслугРасхождения.Ссылка = &Ссылка"
;

    Запрос.УстановитьПараметр("ВариантРасхождений", Перечисления.ВариантыРасхождений.Излишки);
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        Для каждого Стр ИЗ Объект.Товары  Цикл
            Если Стр.Номенклатура = Выборка.Номенклатура Тогда
                 ИзменитьЦвет(Стр.Номенклатура);
              КонецЕсли;
          КонецЦикла;
          КонецЦикла;
КонецФункции

Ну и вызвал эту функцию в процедуре ПриОткрытии. Ошибок нет, но вот цвет не изменяется. Ткните носом в ошибку! Спасибо!

Все, разобрался. Спасибо за помощь!
Vofka
Цитата(MH.z @ 17.05.12, 12:03) необходимо зарегистрироваться для просмотра ссылки
Все, разобрался.

И?
MH.z
Закоментировал строчку и все работает:
&НаСервере
Функция ИзменитьЦвет(Номенклатура)
    //ЭтаФорма.УсловноеОформление.Элементы.Очистить();
    ЦветФиолетовый = Новый Цвет(128, 0, 255); // серый
    ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить();
    ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
       ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Товары");
    ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Номенклатура");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Номенклатура;
    ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", Цвет);    
КонецФункции
Sharki
Для меня лично всё-равно не понятно зачем изменять цвет для каждой номенклатуры ведь вы получаете столько одинаковых условных оформлений сколько нужно указать с неверным количеством. Думаю при наличии 1000 таких номенклатур может возникнуть сильная нагрузка, ведь на каждую будет свое условное оформление. Напрашивается изменение условия получаемых лишних единиц товаров.

Пример решения - добавить в таблицу признак - "Излишки" - булевый
и при создании формы сделать одно условное оформление с условием:
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Излишки");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Истина;


а так у вас задача будет показывать не корректно если будет два поступления одной номенклатуры, одно с излишком другой без и все будут отображаться с оформлением
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.