База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как изменить цвет фона для элемента справочника в 1С через внешнюю обработку?
- В этой теме 1 ответ, 2 участника, последнее обновление 51 минута назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
30 октября 2026 в 15:17 #38930
в 1с скат профессионал , обычная форма. Я создал внешнюю обработку в которой есть реквизит Справочник.Номенклатура . и есть кнопка, которая должна менять для этой номенклатуре фон в форме список. есть такая штука у них . если в предприятии наводишься на номенлатуру нажимаешь f10 то появляется форма в оторой можно поменять фон у строки. так что программно тоже можно сделать.
нашел в общих командах
код взят из процедуры управление справочниками, а когда я изменитл цвет и выполнить, то было в другой номенклатура форма списка Обычная формы
&НаКлиенте
Процедура ВыполнитьДействие(стрДействие, Ссылка, Объект=Неопределено, Форма=Неопределено) ЭкспортЕсли стрДействие=»РедактироватьКодНомер» Или стрДействие=»НадписьКод» Тогда
УправлениеНумерациейОбъектов.ИзменениеВозможностиРедактированияНомера(Форма, Форма.ЭлементыФормы.Код);ИначеЕсли стрДействие=»РедактироватьКодФормыСписка» Тогда
УправлениеНумерациейОбъектов.ИзменениеВозможностиРедактированияНомера(Форма, Форма.ЭлементыФормы.Список.Колонки.Код);ИначеЕсли стрДействие=»Оформление» Тогда
ВыделенныеСтроки=Форма.ЭлементыФормы.Список.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество()=0 Тогда
Предупреждение(«Нет выделенных строк!», 30); Возврат;
КонецЕсли;
ФормаОформления=ПолучитьОбщуюФорму(«ФормаНастройкаОформления», Форма);
ФормаОформления.ЭлементыФормы.НадписьСсылкаНаОбъект.Заголовок=»Групповая настройка оформления»;
НастройкаОформление=ФормаОформления.ОткрытьМодально();
ЕстьОформление=Ложь;
Если НЕ НастройкаОформление=Неопределено Тогда
Для каждого СтрокаКоллекции Из НастройкаОформление Цикл
Если СтрокаКоллекции.Использование Тогда
ЕстьОформление=Истина; Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для каждого СтрокаТабличнойЧасти Из ВыделенныеСтроки Цикл
текОбъект=СтрокаТабличнойЧасти.Ссылка.ПолучитьОбъект();
текОбъект.Оформление=?(ЕстьОформление, Новый ХранилищеЗначения(НастройкаОформление), Неопределено);
текОбъект.Записать();
КонецЦикла;ИначеЕсли стрДействие=»ОткрытьСвойства» Тогда
Если Ссылка=Неопределено Тогда Возврат; КонецЕсли;
//*ФормаОбработки=Обработки.ЗначенияСвойствОбъекта.ПолучитьФорму(«ЗначенияСвойствОбъекта», Форма,);
ФормаОбработки=ПолучитьФорму(«Обработка.ЗначенияСвойствОбъекта.Форма.ЗначенияСвойствОбъекта»);
ФормаОбработки.ВладелецФормы=Форма;
ФормаОбработки.ОбъектОтбораЗначений = Ссылка;
ФормаОбработки.ОбъектОтбораНазначений = Ссылка;
ФормаОбработки.ПрочитатьЗаполнитьСвойстваИЗначения();
ФормаОбработки.Открыть();ИначеЕсли стрДействие=»ОткрытьКатегории» Тогда
Если Ссылка=Неопределено Тогда Возврат; КонецЕсли;
//ФормаОбработки=Обработки.КатегорииОбъекта.ПолучитьФорму(«КатегорииОбъекта», Форма,);
ФормаОбработки=ПолучитьФорму(«Обработка.КатегорииОбъекта.Форма.КатегорииОбъекта»);
ФормаОбработки.ВладелецФормы=Форма;
ФормаОбработки.НазначениеКатегорий = ПредопределенноеЗначение(«ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_КонтактныеЛицаКонтрагентов»);
ФормаОбработки.ОбъектОтбораКатегорий = Ссылка;
ФормаОбработки.ПрочитатьЗаполнитьКатегорииОбъекта();
ФормаОбработки.Открыть();ИначеЕсли стрДействие=»ТолькоПросмотр» Тогда
ФормаОбъекта=Ссылка.ПолучитьОбъект().ПолучитьФорму();
ФормаОбъекта.ТолькоПросмотр=Истина;
ФормаОбъекта.Открыть();ИначеЕсли стрДействие=»Печать» Тогда
//Обработки.УправлениеПечатнымиФормами.Создать().ОткрытьФормуВыбора(Ссылка);
ФормаОбработки=ПолучитьФорму(«Обработка.УправлениеПечатнымиФормами.Форма.ФормаВыбора»,,Новый УникальныйИдентификатор);
ФормаОбработки.ОткрытьФормуВыбора(Ссылка);ИначеЕсли стрДействие=»Плагины» Тогда
//*ФормаОбработки=Обработки.УправлениеПлагинами.ПолучитьФорму(,, Новый УникальныйИдентификатор);
ФормаОбработки=ПолучитьФорму(«Обработка.УправлениеПлагинами.Форма.Форма»,,Новый УникальныйИдентификатор);
ФормаОбработки.СсылкаВызова=Ссылка;
ФормаОбработки.ОбъектВызова=Объект;
ФормаОбработки.ФормаВызова=Форма;
ФормаОбработки.Открыть();ИначеЕсли стрДействие=»Справка» Тогда
ОбщегоНазначения.ОткрытьПомощь(Форма);
КонецЕсли;
КонецПроцедуры
Из формы номенклатурыПроцедура тпСписок_ПриПолученииДанных(Элемент, ОформленияСтрок)
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеОформления=ОформлениеСтроки.ДанныеСтроки.Ссылка.Оформление;
Если ЗначениеЗаполнено(ДанныеОформления) Тогда
Оформление=ДанныеОформления.Получить();
Если НЕ Оформление=Неопределено Тогда
Если Оформление.ЦветТекста.Использование Тогда
ОформлениеСтроки.ЦветТекста=Оформление.ЦветТекста.Значение;
КонецЕсли;Если Оформление.ЦветФона.Использование Тогда
ОформлениеСтроки.ЦветФона=Оформление.ЦветФона.Значение;
КонецЕсли;Если Оформление.Шрифт.Использование Тогда
ОформлениеСтроки.Шрифт=Оформление.Шрифт.Значение;
КонецЕсли;
КонецЕсли;
КонецЕсли;
мПоискОбъектовВСпискахДанных.СписокПриВыводеСтрокиСпискаОтбораДанных(Элемент, ОформлениеСтроки, ОформлениеСтроки.ДанныеСтроки);
КонецЦикла;
КонецПроцедуры -
30 октября 2026 в 15:17 #38931
Теперь причина найдена. В СКАТ оформление хранится не в отдельном регистре, а непосредственно в реквизите справочника:
1С (Код)1Номенклатура.ОформлениеТип этого реквизита, судя по коду, вероятно:
1С (Код)1ХранилищеЗначенияФорма списка при выводе строки читает это хранилище:
1С (Код)1ДанныеОформления = ОформлениеСтроки.ДанныеСтроки.Ссылка.Оформление;Затем получает из него настройки:
1С (Код)1Оформление = ДанныеОформления.Получить();И устанавливает цвет:
1С (Код)1ОформлениеСтроки.ЦветФона = Оформление.ЦветФона.Значение;Поэтому во внешней обработке нужно:
1. выбрать номенклатуру;
2. открыть штатную общую формуФормаНастройкаОформления;
3. выбрать цвет;
4. получить возвращенную настройку;
5. записать ее вНоменклатура.Оформление.## Код кнопки внешней обработки
Для обычной формы внешней обработки добавьте обработчик кнопки:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152Процедура УстановитьОформление(Элемент)Если Не ЗначениеЗаполнено(Номенклатура) ТогдаПредупреждение("Не выбрана номенклатура.");Возврат;КонецЕсли;// Открываем штатную форму настройки оформления СКАТФормаОформления = ПолучитьОбщуюФорму("ФормаНастройкаОформления",ЭтаФорма);ФормаОформления.ЭлементыФормы.НадписьСсылкаНаОбъект.Заголовок ="Настройка оформления номенклатуры";// Форма возвращает коллекцию настроек после нажатия ОКНастройкаОформление = ФормаОформления.ОткрытьМодально();// Пользователь закрыл форму без подтвержденияЕсли НастройкаОформление = Неопределено ТогдаВозврат;КонецЕсли;ЕстьОформление = Ложь;Для Каждого СтрокаНастройки Из НастройкаОформление ЦиклЕсли СтрокаНастройки.Использование ТогдаЕстьОформление = Истина;Прервать;КонецЕсли;КонецЦикла;// Получаем объект справочникаОбъектНоменклатуры = Номенклатура.ПолучитьОбъект();Если ЕстьОформление ТогдаОбъектНоменклатуры.Оформление =Новый ХранилищеЗначения(НастройкаОформление);Иначе// Сброс оформленияОбъектНоменклатуры.Оформление = Неопределено;КонецЕсли;ОбъектНоменклатуры.Записать();Сообщить("Оформление номенклатуры сохранено.");ОбновитьФормуСписка();КонецПроцедурыЗдесь:
—
Номенклатураэто реквизит внешней обработки типаСправочникСсылка.Номенклатура;
—ФормаНастройкаОформленияэто общая форма СКАТ;
—НастройкаОформлениеэто коллекция, которую возвращает форма;
—Оформлениеэто реквизит элемента справочника;
—ХранилищеЗначенияиспользуется точно так же, как в найденной процедуреВыполнитьДействие.## Обновление открытой формы списка
Если внешняя обработка открыта из формы списка и форма списка назначена владельцем обработки, можно добавить процедуру:
1С (Код)12345678910111213Процедура ОбновитьФормуСписка()Если ВладелецФормы = Неопределено ТогдаВозврат;КонецЕсли;ПопыткаВладелецФормы.ЭлементыФормы.Список.Обновить();Исключение// Если обработка запущена не из формы спискаКонецПопытки;КонецПроцедурыНо это сработает только если:
1. внешняя обработка была открыта с владельцем;
2. у формы списка табличное поле действительно называетсяСписок.Если элемент формы списка называется, например,
тпСписок, тогда нужно использовать:1С (Код)1ВладелецФормы.ЭлементыФормы.тпСписок.Обновить();В вашем коде обработчик формы списка называется:
1С (Код)1Процедура тпСписок_ПриПолученииДанных(Элемент, ОформленияСтрок)Это означает, что табличное поле, скорее всего, называется:
1С (Код)1тпСписокПоэтому процедура обновления, вероятно, должна быть такой:
1С (Код)12345678910111213Процедура ОбновитьФормуСписка()Если ВладелецФормы = Неопределено ТогдаВозврат;КонецЕсли;ПопыткаВладелецФормы.ЭлементыФормы.тпСписок.Обновить();Исключение// Внешняя обработка могла быть открыта без владельцаКонецПопытки;КонецПроцедурыЕсли после вызова
Обновить()цвет сразу не появился, можно попробовать переустановить отбор или перезаполнить список, поскольку обработчикПриПолученииДанныхвызывается при повторном получении строк.## Если внешняя обработка открывается из формы списка
Чтобы у обработки был владелец, ее нужно открывать примерно так:
1С (Код)1234567ФормаОбработки = ПолучитьФорму("ВнешняяОбработка.ВашаОбработка.Форма.Форма",ФормаСписка);ФормаОбработки.ВладелецФормы = ФормаСписка;ФормаОбработки.Номенклатура = ВыбраннаяНоменклатура;ФормаОбработки.Открыть();В обычной конфигурации имя внешней обработки и формы нужно заменить на фактические.
Если обработка открывается вручную из меню, владельца формы может не быть. В этом случае оформление все равно сохранится в справочнике, но открытый список обновится только после его закрытия и повторного открытия либо ручного обновления.
## Вариант, когда номенклатура передается при открытии обработки
Если реквизит
Номенклатурадолжен заполняться автоматически, в обычной форме внешней обработки можно использовать процедуру открытия:1С (Код)123456789Процедура ПриОткрытии()Если ЗначениеЗаполнено(ПараметрыОткрытия) ТогдаЕсли ТипЗнч(ПараметрыОткрытия) = Тип("СправочникСсылка.Номенклатура") ТогдаНоменклатура = ПараметрыОткрытия;КонецЕсли;КонецЕсли;КонецПроцедурыНо конкретный способ передачи параметра зависит от того, как именно в СКАТ открываются внешние обработки.
## Если нужно всегда устанавливать один фиксированный цвет
Если не нужно показывать форму выбора цвета, а, например, кнопка всегда должна делать желтый фон, штатную форму можно не открывать. Однако в этом случае нужно создать объект настройки правильной структуры.
Структуру лучше один раз получить штатным способом через
ФормаНастройкаОформления, потому что точный тип возвращаемого значения может зависеть от СКАТ. Вариант с открытием формы надежнее и полностью повторяет штатную обработку F10.Если нужно снять цвет, достаточно записать:
1С (Код)123ОбъектНоменклатуры = Номенклатура.ПолучитьОбъект();ОбъектНоменклатуры.Оформление = Неопределено;ОбъектНоменклатуры.Записать();После этого обработчик формы списка:
1С (Код)1Если ЗначениеЗаполнено(ДанныеОформления) Тогдане будет применять оформление к строке.
## Важное замечание по вашему найденному коду
В штатной процедуре:
1С (Код)12345678Для каждого СтрокаТабличнойЧасти Из ВыделенныеСтроки ЦиклтекОбъект = СтрокаТабличнойЧасти.Ссылка.ПолучитьОбъект();текОбъект.Оформление =?(ЕстьОформление,Новый ХранилищеЗначения(НастройкаОформление),Неопределено);текОбъект.Записать();КонецЦикла;записывается одна и та же настройка оформления для каждой выделенной номенклатуры.
В вашей внешней обработке эта часть заменяется на работу с одним реквизитом:
1С (Код)1234ОбъектНоменклатуры = Номенклатура.ПолучитьОбъект();ОбъектНоменклатуры.Оформление =Новый ХранилищеЗначения(НастройкаОформление);ОбъектНоменклатуры.Записать();То есть вам не нужно искать регистр или программно менять
ОформлениеСтроки. Это уже делает форма списка. Внешняя обработка должна только правильно записать реквизитОформлениесправочника.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.