Как изменить цвет фона для элемента справочника в 1С через внешнюю обработку?

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как изменить цвет фона для элемента справочника в 1С через внешнюю обработку?

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38930
      Фото аватараOdineski
      Участник

        в 1с скат профессионал , обычная форма. Я создал внешнюю обработку в которой есть реквизит Справочник.Номенклатура . и есть кнопка, которая должна менять для этой номенклатуре фон в форме список. есть такая штука у них . если в предприятии наводишься на номенлатуру нажимаешь f10 то появляется форма в оторой можно поменять фон у строки. так что программно тоже можно сделать.

        нашел в общих командах

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

        &НаКлиенте
        Процедура ВыполнитьДействие(стрДействие, Ссылка, Объект=Неопределено, Форма=Неопределено) Экспорт

        Если стрДействие=»РедактироватьКодНомер» Или стрДействие=»НадписьКод» Тогда
        УправлениеНумерациейОбъектов.ИзменениеВозможностиРедактированияНомера(Форма, Форма.ЭлементыФормы.Код);

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

        ИначеЕсли стрДействие=»Оформление» Тогда
        ВыделенныеСтроки=Форма.ЭлементыФормы.Список.ВыделенныеСтроки;
        Если ВыделенныеСтроки.Количество()=0 Тогда
        Предупреждение(«Нет выделенных строк!», 30); Возврат;
        КонецЕсли;
        ФормаОформления=ПолучитьОбщуюФорму(«ФормаНастройкаОформления», Форма);
        ФормаОформления.ЭлементыФормы.НадписьСсылкаНаОбъект.Заголовок=»Групповая настройка оформления»;
        НастройкаОформление=ФормаОформления.ОткрытьМодально();
        ЕстьОформление=Ложь;
        Если НЕ НастройкаОформление=Неопределено Тогда
        Для каждого СтрокаКоллекции Из НастройкаОформление Цикл
        Если СтрокаКоллекции.Использование Тогда
        ЕстьОформление=Истина; Прервать;
        КонецЕсли;
        КонецЦикла;
        КонецЕсли;
        Для каждого СтрокаТабличнойЧасти Из ВыделенныеСтроки Цикл
        текОбъект=СтрокаТабличнойЧасти.Ссылка.ПолучитьОбъект();
        текОбъект.Оформление=?(ЕстьОформление, Новый ХранилищеЗначения(НастройкаОформление), Неопределено);
        текОбъект.Записать();
        КонецЦикла;

        ИначеЕсли стрДействие=»ОткрытьСвойства» Тогда
        Если Ссылка=Неопределено Тогда Возврат; КонецЕсли;
        //*ФормаОбработки=Обработки.ЗначенияСвойствОбъекта.ПолучитьФорму(«ЗначенияСвойствОбъекта», Форма,);
        ФормаОбработки=ПолучитьФорму(«Обработка.ЗначенияСвойствОбъекта.Форма.ЗначенияСвойствОбъекта»);
        ФормаОбработки.ВладелецФормы=Форма;
        ФормаОбработки.ОбъектОтбораЗначений = Ссылка;
        ФормаОбработки.ОбъектОтбораНазначений = Ссылка;
        ФормаОбработки.ПрочитатьЗаполнитьСвойстваИЗначения();
        ФормаОбработки.Открыть();

        ИначеЕсли стрДействие=»ОткрытьКатегории» Тогда
        Если Ссылка=Неопределено Тогда Возврат; КонецЕсли;
        //ФормаОбработки=Обработки.КатегорииОбъекта.ПолучитьФорму(«КатегорииОбъекта», Форма,);
        ФормаОбработки=ПолучитьФорму(«Обработка.КатегорииОбъекта.Форма.КатегорииОбъекта»);
        ФормаОбработки.ВладелецФормы=Форма;
        ФормаОбработки.НазначениеКатегорий = ПредопределенноеЗначение(«ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_КонтактныеЛицаКонтрагентов»);
        ФормаОбработки.ОбъектОтбораКатегорий = Ссылка;
        ФормаОбработки.ПрочитатьЗаполнитьКатегорииОбъекта();
        ФормаОбработки.Открыть();

        ИначеЕсли стрДействие=»ТолькоПросмотр» Тогда
        ФормаОбъекта=Ссылка.ПолучитьОбъект().ПолучитьФорму();
        ФормаОбъекта.ТолькоПросмотр=Истина;
        ФормаОбъекта.Открыть();

        ИначеЕсли стрДействие=»Печать» Тогда
        //Обработки.УправлениеПечатнымиФормами.Создать().ОткрытьФормуВыбора(Ссылка);
        ФормаОбработки=ПолучитьФорму(«Обработка.УправлениеПечатнымиФормами.Форма.ФормаВыбора»,,Новый УникальныйИдентификатор);
        ФормаОбработки.ОткрытьФормуВыбора(Ссылка);

        ИначеЕсли стрДействие=»Плагины» Тогда
        //*ФормаОбработки=Обработки.УправлениеПлагинами.ПолучитьФорму(,, Новый УникальныйИдентификатор);
        ФормаОбработки=ПолучитьФорму(«Обработка.УправлениеПлагинами.Форма.Форма»,,Новый УникальныйИдентификатор);
        ФормаОбработки.СсылкаВызова=Ссылка;
        ФормаОбработки.ОбъектВызова=Объект;
        ФормаОбработки.ФормаВызова=Форма;
        ФормаОбработки.Открыть();

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

        Процедура тпСписок_ПриПолученииДанных(Элемент, ОформленияСтрок)
        Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ДанныеОформления=ОформлениеСтроки.ДанныеСтроки.Ссылка.Оформление;
        Если ЗначениеЗаполнено(ДанныеОформления) Тогда
        Оформление=ДанныеОформления.Получить();
        Если НЕ Оформление=Неопределено Тогда
        Если Оформление.ЦветТекста.Использование Тогда
        ОформлениеСтроки.ЦветТекста=Оформление.ЦветТекста.Значение;
        КонецЕсли;

        Если Оформление.ЦветФона.Использование Тогда
        ОформлениеСтроки.ЦветФона=Оформление.ЦветФона.Значение;
        КонецЕсли;

        Если Оформление.Шрифт.Использование Тогда
        ОформлениеСтроки.Шрифт=Оформление.Шрифт.Значение;
        КонецЕсли;
        КонецЕсли;
        КонецЕсли;
        мПоискОбъектовВСпискахДанных.СписокПриВыводеСтрокиСпискаОтбораДанных(Элемент, ОформлениеСтроки, ОформлениеСтроки.ДанныеСтроки);
        КонецЦикла;
        КонецПроцедуры

      • #38931
        bot_avaOdin — Одинэсник
        Участник

          Теперь причина найдена. В СКАТ оформление хранится не в отдельном регистре, а непосредственно в реквизите справочника:

          Тип этого реквизита, судя по коду, вероятно:

          Форма списка при выводе строки читает это хранилище:

          Затем получает из него настройки:

          И устанавливает цвет:

          Поэтому во внешней обработке нужно:

          1. выбрать номенклатуру;
          2. открыть штатную общую форму ФормаНастройкаОформления;
          3. выбрать цвет;
          4. получить возвращенную настройку;
          5. записать ее в Номенклатура.Оформление.

          ## Код кнопки внешней обработки

          Для обычной формы внешней обработки добавьте обработчик кнопки:

          Здесь:

          — Номенклатура это реквизит внешней обработки типа СправочникСсылка.Номенклатура;
          — ФормаНастройкаОформления это общая форма СКАТ;
          — НастройкаОформление это коллекция, которую возвращает форма;
          — Оформление это реквизит элемента справочника;
          — ХранилищеЗначения используется точно так же, как в найденной процедуре ВыполнитьДействие.

          ## Обновление открытой формы списка

          Если внешняя обработка открыта из формы списка и форма списка назначена владельцем обработки, можно добавить процедуру:

          Но это сработает только если:

          1. внешняя обработка была открыта с владельцем;
          2. у формы списка табличное поле действительно называется Список.

          Если элемент формы списка называется, например, тпСписок, тогда нужно использовать:

          В вашем коде обработчик формы списка называется:

          Это означает, что табличное поле, скорее всего, называется:

          Поэтому процедура обновления, вероятно, должна быть такой:

          Если после вызова Обновить() цвет сразу не появился, можно попробовать переустановить отбор или перезаполнить список, поскольку обработчик ПриПолученииДанных вызывается при повторном получении строк.

          ## Если внешняя обработка открывается из формы списка

          Чтобы у обработки был владелец, ее нужно открывать примерно так:

          В обычной конфигурации имя внешней обработки и формы нужно заменить на фактические.

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

          ## Вариант, когда номенклатура передается при открытии обработки

          Если реквизит Номенклатура должен заполняться автоматически, в обычной форме внешней обработки можно использовать процедуру открытия:

          Но конкретный способ передачи параметра зависит от того, как именно в СКАТ открываются внешние обработки.

          ## Если нужно всегда устанавливать один фиксированный цвет

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

          Структуру лучше один раз получить штатным способом через ФормаНастройкаОформления, потому что точный тип возвращаемого значения может зависеть от СКАТ. Вариант с открытием формы надежнее и полностью повторяет штатную обработку F10.

          Если нужно снять цвет, достаточно записать:

          После этого обработчик формы списка:

          не будет применять оформление к строке.

          ## Важное замечание по вашему найденному коду

          В штатной процедуре:

          записывается одна и та же настройка оформления для каждой выделенной номенклатуры.

          В вашей внешней обработке эта часть заменяется на работу с одним реквизитом:

          То есть вам не нужно искать регистр или программно менять ОформлениеСтроки. Это уже делает форма списка. Внешняя обработка должна только правильно записать реквизит Оформление справочника.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С