База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как программно изменить оформление строк табличной части в 1С:СКАТ Профессионал?
- В этой теме 1 ответ, 2 участника, последнее обновление 33 минуты назад сделано
Odin — Одинэсник.
-
АвторЗаписи
-
-
30 октября 2026 в 15:35 #38932
в 1с скат профессионал , обычная форма. Я создал внешнюю обработку в которой есть табличная часть Справочник.Номенклатура с несколькими строчками . и есть кнопка, которая должна менять для этой номенклатуре фон в форме список. есть такая штука у них . если в предприятии наводишься на номенлатуру нажимаешь f10 то появляется форма в оторой можно поменять фон у строки. так что программно тоже можно сделать.
нашел в общих командах
код взят из процедуры управление справочниками, а когда я изменитл цвет и выполнить, то было в другой номенклатура форма списка Обычная формы
&НаКлиенте
Процедура ВыполнитьДействие(стрДействие, Ссылка, Объект=Неопределено, Форма=Неопределено) ЭкспортЕсли стрДействие=»РедактироватьКодНомер» Или стрДействие=»НадписьКод» Тогда
УправлениеНумерациейОбъектов.ИзменениеВозможностиРедактированияНомера(Форма, Форма.ЭлементыФормы.Код);ИначеЕсли стрДействие=»РедактироватьКодФормыСписка» Тогда
УправлениеНумерациейОбъектов.ИзменениеВозможностиРедактированияНомера(Форма, Форма.ЭлементыФормы.Список.Колонки.Код);ИначеЕсли стрДействие=»Оформление» Тогда
ВыделенныеСтроки=Форма.ЭлементыФормы.Список.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество()=0 Тогда
Предупреждение(«Нет выделенных строк!», 30); Возврат;
КонецЕсли;
ФормаОформления=ПолучитьОбщуюФорму(«ФормаНастройкаОформления», Форма);
ФормаОформления.ЭлементыФормы.НадписьСсылкаНаОбъект.Заголовок=»Групповая настройка оформления»;
НастройкаОформление=ФормаОформления.ОткрытьМодально();
ЕстьОформление=Ложь;
Если НЕ НастройкаОформление=Неопределено Тогда
Для каждого СтрокаКоллекции Из НастройкаОформление Цикл
Если СтрокаКоллекции.Использование Тогда
ЕстьОформление=Истина; Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для каждого СтрокаТабличнойЧасти Из ВыделенныеСтроки Цикл
текОбъект=СтрокаТабличнойЧасти.Ссылка.ПолучитьОбъект();
текОбъект.Оформление=?(ЕстьОформление, Новый ХранилищеЗначения(НастройкаОформление), Неопределено);
текОбъект.Записать();
КонецЦикла;ИначеЕсли стрДействие=»ОткрытьСвойства» Тогда
Если Ссылка=Неопределено Тогда Возврат; КонецЕсли;
//*ФормаОбработки=Обработки.ЗначенияСвойствОбъекта.ПолучитьФорму(«ЗначенияСвойствОбъекта», Форма,);
ФормаОбработки=ПолучитьФорму(«Обработка.ЗначенияСвойствОбъекта.Форма.ЗначенияСвойствОбъекта»);
ФормаОбработки.ВладелецФормы=Форма;
ФормаОбработки.ОбъектОтбораЗначений = Ссылка;
ФормаОбработки.ОбъектОтбораНазначений = Ссылка;
ФормаОбработки.ПрочитатьЗаполнитьСвойстваИЗначения();
ФормаОбработки.Открыть();ИначеЕсли стрДействие=»ОткрытьКатегории» Тогда
Если Ссылка=Неопределено Тогда Возврат; КонецЕсли;
//ФормаОбработки=Обработки.КатегорииОбъекта.ПолучитьФорму(«КатегорииОбъекта», Форма,);
ФормаОбработки=ПолучитьФорму(«Обработка.КатегорииОбъекта.Форма.КатегорииОбъекта»);
ФормаОбработки.ВладелецФормы=Форма;
ФормаОбработки.НазначениеКатегорий = ПредопределенноеЗначение(«ПланВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_КонтактныеЛицаКонтрагентов»);
ФормаОбработки.ОбъектОтбораКатегорий = Ссылка;
ФормаОбработки.ПрочитатьЗаполнитьКатегорииОбъекта();
ФормаОбработки.Открыть();ИначеЕсли стрДействие=»ТолькоПросмотр» Тогда
ФормаОбъекта=Ссылка.ПолучитьОбъект().ПолучитьФорму();
ФормаОбъекта.ТолькоПросмотр=Истина;
ФормаОбъекта.Открыть();ИначеЕсли стрДействие=»Печать» Тогда
//Обработки.УправлениеПечатнымиФормами.Создать().ОткрытьФормуВыбора(Ссылка);
ФормаОбработки=ПолучитьФорму(«Обработка.УправлениеПечатнымиФормами.Форма.ФормаВыбора»,,Новый УникальныйИдентификатор);
ФормаОбработки.ОткрытьФормуВыбора(Ссылка);ИначеЕсли стрДействие=»Плагины» Тогда
//*ФормаОбработки=Обработки.УправлениеПлагинами.ПолучитьФорму(,, Новый УникальныйИдентификатор);
ФормаОбработки=ПолучитьФорму(«Обработка.УправлениеПлагинами.Форма.Форма»,,Новый УникальныйИдентификатор);
ФормаОбработки.СсылкаВызова=Ссылка;
ФормаОбработки.ОбъектВызова=Объект;
ФормаОбработки.ФормаВызова=Форма;
ФормаОбработки.Открыть();ИначеЕсли стрДействие=»Справка» Тогда
ОбщегоНазначения.ОткрытьПомощь(Форма);
КонецЕсли;
КонецПроцедуры
Из формы номенклатурыПроцедура тпСписок_ПриПолученииДанных(Элемент, ОформленияСтрок)
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеОформления=ОформлениеСтроки.ДанныеСтроки.Ссылка.Оформление;
Если ЗначениеЗаполнено(ДанныеОформления) Тогда
Оформление=ДанныеОформления.Получить();
Если НЕ Оформление=Неопределено Тогда
Если Оформление.ЦветТекста.Использование Тогда
ОформлениеСтроки.ЦветТекста=Оформление.ЦветТекста.Значение;
КонецЕсли;Если Оформление.ЦветФона.Использование Тогда
ОформлениеСтроки.ЦветФона=Оформление.ЦветФона.Значение;
КонецЕсли;Если Оформление.Шрифт.Использование Тогда
ОформлениеСтроки.Шрифт=Оформление.Шрифт.Значение;
КонецЕсли;
КонецЕсли;
КонецЕсли;
мПоискОбъектовВСпискахДанных.СписокПриВыводеСтрокиСпискаОтбораДанных(Элемент, ОформлениеСтроки, ОформлениеСтроки.ДанныеСтроки);
КонецЦикла;
КонецПроцедуры -
30 октября 2026 в 15:35 #38933
У вас уже найден весь необходимый механизм. Внешняя обработка должна сделать то же самое, что делает штатная процедура
ВыполнитьДействие, только вместо коллекции выделенных строк формы списка использовать строки своей табличной части.Предположим:
— табличная часть внешней обработки называется
Номенклатура;
— колонка табличной части также называетсяНоменклатура;
— колонка имеет типСправочникСсылка.Номенклатура;
— кнопка находится в обычной форме внешней обработки.## Код кнопки
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081Процедура УстановитьОформление(Кнопка)Если Объект.Номенклатура.Количество() = 0 ТогдаПредупреждение("В табличной части нет номенклатуры.", 30);Возврат;КонецЕсли;// Открываем штатную форму СКАТ для выбора оформленияФормаОформления = ПолучитьОбщуюФорму("ФормаНастройкаОформления",ЭтаФорма);ФормаОформления.ЭлементыФормы.НадписьСсылкаНаОбъект.Заголовок ="Групповая настройка оформления";// В форме пользователь выбирает цвет фона,// цвет текста, шрифт и другие параметрыНастройкаОформление = ФормаОформления.ОткрытьМодально();// Если пользователь закрыл форму крестиком или отменил действиеЕсли НастройкаОформление = Неопределено ТогдаВозврат;КонецЕсли;// Проверяем, включен ли хотя бы один параметр оформленияЕстьОформление = Ложь;Для Каждого СтрокаНастройки Из НастройкаОформление ЦиклЕсли СтрокаНастройки.Использование ТогдаЕстьОформление = Истина;Прервать;КонецЕсли;КонецЦикла;// Сохраняем одинаковое оформление для всех выбранных элементовХранилищеОформления = Неопределено;Если ЕстьОформление ТогдаХранилищеОформления =Новый ХранилищеЗначения(НастройкаОформление);КонецЕсли;КоличествоЗаписано = 0;Для Каждого СтрокаТабличнойЧасти Из Объект.Номенклатура ЦиклЕсли Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) ТогдаПродолжить;КонецЕсли;НоменклатураОбъект =СтрокаТабличнойЧасти.Номенклатура.ПолучитьОбъект();Если ЕстьОформление ТогдаНоменклатураОбъект.Оформление = ХранилищеОформления;Иначе// Если в форме оформления ничего не используется,// снимаем ранее установленное оформлениеНоменклатураОбъект.Оформление = Неопределено;КонецЕсли;НоменклатураОбъект.Записать();КоличествоЗаписано = КоличествоЗаписано + 1;КонецЦикла;Если КоличествоЗаписано = 0 ТогдаПредупреждение("Не заполнена ни одна номенклатура.", 30);Возврат;КонецЕсли;Сообщить("Оформление установлено для элементов: "+ Строка(КоличествоЗаписано));ОбновитьФормуСписка();КонецПроцедурыГлавное отличие от штатного кода:
1С (Код)1ВыделенныеСтроки = Форма.ЭлементыФормы.Список.ВыделенныеСтроки;у вас будет:
1С (Код)1Для Каждого СтрокаТабличнойЧасти Из Объект.Номенклатура ЦиклА дальше выполняется такая же запись:
1С (Код)1234НоменклатураОбъект.Оформление =Новый ХранилищеЗначения(НастройкаОформление);НоменклатураОбъект.Записать();## Если табличная часть называется не
НоменклатураНапример, табличная часть внешней обработки называется
Товары, а колонка называетсяНоменклатура. Тогда цикл будет таким:1С (Код)123456789101112131415161718Для Каждого СтрокаТабличнойЧасти Из Объект.Товары ЦиклЕсли Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) ТогдаПродолжить;КонецЕсли;НоменклатураОбъект =СтрокаТабличнойЧасти.Номенклатура.ПолучитьОбъект();Если ЕстьОформление ТогдаНоменклатураОбъект.Оформление = ХранилищеОформления;ИначеНоменклатураОбъект.Оформление = Неопределено;КонецЕсли;НоменклатураОбъект.Записать();КонецЦикла;Замените
Объект.Товарына фактическое имя табличной части.## Если реквизит табличной части имеет другое имя
Например, колонка называется
Товар, тогда нужно использовать:1С (Код)123456789101112131415Для Каждого СтрокаТабличнойЧасти Из Объект.Номенклатура ЦиклЕсли Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Товар) ТогдаПродолжить;КонецЕсли;НоменклатураОбъект =СтрокаТабличнойЧасти.Товар.ПолучитьОбъект();НоменклатураОбъект.Оформление =Новый ХранилищеЗначения(НастройкаОформление);НоменклатураОбъект.Записать();КонецЦикла;## Обновление формы списка
Цвет записывается в справочник, но уже открытая форма списка может не перерисовать строки автоматически. Поэтому после записи нужно обновить список.
Добавьте в обработку процедуру:
1С (Код)1234567891011121314151617181920212223Процедура ОбновитьФормуСписка()Если ВладелецФормы = Неопределено ТогдаВозврат;КонецЕсли;ПопыткаВладелецФормы.ЭлементыФормы.Список.Обновить();Исключение// В конкретной конфигурации табличное поле// может называться тпСписокПопыткаВладелецФормы.ЭлементыФормы.тпСписок.Обновить();Исключение// Список будет обновлен после повторного открытия формыКонецПопытки;КонецПопытки;КонецПроцедурыВ вашем случае по обработчику:
1С (Код)1Процедура тпСписок_ПриПолученииДанных(Элемент, ОформленияСтрок)табличное поле формы списка, скорее всего, называется
тпСписок. Тогда основной вариант должен быть таким:1С (Код)1ВладелецФормы.ЭлементыФормы.тпСписок.Обновить();## Как открыть обработку с владельцем формы списка
Чтобы
ВладелецФормыбыл заполнен, обработку нужно открывать из формы списка примерно так:1С (Код)123456ФормаОбработки = ПолучитьФорму("ВнешняяОбработка.ИмяОбработки.Форма.Форма",ФормаСписка);ФормаОбработки.ВладелецФормы = ФормаСписка;ФормаОбработки.Открыть();Если обработка открывается обычным способом из меню, то владелец может быть не установлен. В этом случае запись оформления все равно выполнится, но текущий список может потребовать закрытия и повторного открытия.
## Если обработка открывается через штатную форму выбора
Можно передать владельца так:
1С (Код)123456ФормаОбработки = ПолучитьФорму("ВнешняяОбработка.ИмяОбработки.Форма.Форма",Форма);ФормаОбработки.ВладелецФормы = Форма;ФормаОбработки.Открыть();Где
Формаэто форма списка номенклатуры.## Снятие оформления у нескольких номенклатур
Если пользователь в форме
ФормаНастройкаОформленияотключит все флагиИспользование, переменная:1С (Код)1ЕстьОформлениеостанется равной
Ложь.Тогда код:
1С (Код)1НоменклатураОбъект.Оформление = Неопределено;удалит ранее сохраненный цвет у всех строк табличной части.
То есть одна кнопка будет выполнять оба действия:
— если выбрали цвет, шрифт или цвет текста, оформление устанавливается;
— если все настройки отключили, оформление удаляется.## Почему цвет будет отображаться в форме списка
В форме списка СКАТ уже есть обработчик:
1С (Код)12345678910111213141516171819202122232425Процедура тпСписок_ПриПолученииДанных(Элемент, ОформленияСтрок)Для каждого ОформлениеСтроки Из ОформленияСтрок ЦиклДанныеОформления =ОформлениеСтроки.ДанныеСтроки.Ссылка.Оформление;Если ЗначениеЗаполнено(ДанныеОформления) ТогдаОформление = ДанныеОформления.Получить();Если Не Оформление = Неопределено ТогдаЕсли Оформление.ЦветФона.Использование ТогдаОформлениеСтроки.ЦветФона =Оформление.ЦветФона.Значение;КонецЕсли;КонецЕсли;КонецЕсли;КонецЦикла;КонецПроцедурыПоэтому во внешней обработке не нужно напрямую работать с
ОформлениеСтроки. Нужно только записать настройку в:1С (Код)1Номенклатура.Оформление## Если нужно не открывать форму выбора, а сразу задавать фиксированный цвет
Тогда можно создать оформление напрямую, но это зависит от внутреннего типа, который возвращает общая форма
ФормаНастройкаОформления. В СКАТ безопаснее использовать штатную форму, потому что она создает объект с правильной структурой:1С (Код)12345ФормаОформления = ПолучитьОбщуюФорму("ФормаНастройкаОформления",ЭтаФорма);НастройкаОформление = ФормаОформления.ОткрытьМодально();Полученный результат можно без изменений записать в
ХранилищеЗначения:1С (Код)12НоменклатураОбъект.Оформление =Новый ХранилищеЗначения(НастройкаОформление);Для вашей задачи основной рабочий код будет именно таким:
1С (Код)123456789101112131415Для Каждого СтрокаТабличнойЧасти Из Объект.Номенклатура ЦиклЕсли Не ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) ТогдаПродолжить;КонецЕсли;НоменклатураОбъект =СтрокаТабличнойЧасти.Номенклатура.ПолучитьОбъект();НоменклатураОбъект.Оформление =Новый ХранилищеЗначения(НастройкаОформление);НоменклатураОбъект.Записать();КонецЦикла;Именно этот цикл нужно использовать вместо цикла по
ВыделенныеСтроки.
-
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.