14 апреля 2022 г.

1С функция ДобавитьКоманду()

Простенькая функция создающая команду формы и кнопку к ней на форме. Когда описываешь одну, это максимум 10 строчек, а когда таких 5 и более, получается гигантская котлета из почти одинаковых строк:



//Пример использвания в расширении (форма документа ПТиУ)
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
эГруппаКоманд=ЭтаФорма.Элементы.вставить("ЭГруппаКоманд",тип("ГруппаФормы"), Элементы.Товары.КоманднаяПанель, Элементы.ТоварыКнопкиКоманднойПанели);
	эГруппаКоманд.Вид=ВидГруппыФормы.ГруппаКнопок;
	эГруппаКоманд.Отображение=ОтображениеГруппыКнопок.Компактное;
    
ДобавитьКоманду("ОтобразитьШтрихкоды",
					ОтображениеКнопки.Картинка,БиблиотекаКартинок.ТабличныйДокументТолькоПросмотр,
					Ложь,
					Тип("КнопкаФормы"),
					Элементы.ЭГруппаКоманд,
					Объект.ШтрихкодыУпаковок.Количество()>0);  

КонецПроцедуры    
// Функция - Добавить команду
//
// Параметры:
//  ИмяКомандыПроцедуры		 - Строка - Имя процедуры и команды будут совпадать, при помощи Синониминайзера, Выдернув "Команда", будет создан заголовок и подсказка
//  Отображение		 - ОтображениеКнопки -  Например: ОтображениеКнопки.Картинка
//  Картинка		 - БиблиотекаКартинок - Например: БиблиотекаКартинок.ТабличныйДокументТолькоПросмотр
//	ИзменяетСохраняемыеДанные - Булево - 
//  ТипЭлемента		 - Тип - Тип элемента ФОРМЫ, например: Тип("КнопкаФормы")
//  РодительЭлемента - ЭлементФормы - Например ГруппаКнопок
//  Доступность		 - Булево -
//
&НаСервере
Функция ДобавитьКоманду(ИмяКомандыПроцедуры, Отображение=Неопределено,Картинка=Неопределено,ИзменяетСохраняемыеДанные=Ложь,ТипЭлемента,РодительЭлемента=Неопределено,Доступность=Истина)
	ИмяКоманды="Команда"+ИмяКомандыПроцедуры;
	ИмяПроцедуры=ИмяКоманды;
	Заголовок=Синонимайзер(ИмяКомандыПроцедуры);
	Подсказка=Заголовок;
	
	Если Команды.Найти(ИмяКоманды) <> Неопределено Тогда
		Сообщить(СтрШаблон("Команда ""%1"" существует, пропуск",ИмяКоманды));
		Возврат
	КонецЕсли;
	
	НоваяКоманда= Команды.Добавить(ИмяКоманды);
	НоваяКоманда.Действие = ИмяПроцедуры;//Имя процедуры
	НоваяКоманда.Заголовок = Заголовок;
	НоваяКоманда.Подсказка = Подсказка;
	НоваяКоманда.ИзменяетСохраняемыеДанные=ИзменяетСохраняемыеДанные;
	Если Отображение<>Неопределено  Тогда
		НоваяКоманда.Отображение=Отображение;
	КонецЕсли;
	Если Картинка<>Неопределено  Тогда
		НоваяКоманда.Картинка=Картинка;
	КонецЕсли;
	
	ИмяЭлемента="Элемент"+ИмяКоманды;
	Если ЭтаФорма.Элементы.Найти(ИмяЭлемента)<>Неопределено Тогда  
		Сообщить(СтрШаблон("Элемент ""%1"" существует, пропуск",ИмяЭлемента));
		Возврат
	КонецЕсли;
	
	эНоваяКоманда = ЭтаФорма.Элементы.вставить(ИмяЭлемента, ТипЭлемента,?(РодительЭлемента=Неопределено,"",РодительЭлемента)); 
	эНоваяКоманда.ИмяКоманды=НоваяКоманда.Имя; 
	эНоваяКоманда.Доступность=Доступность;
КонецФункции

&НаСервере
Функция Синонимайзер(Имя, Ответ = "", Стэйт = 7, б = "")
    Для ё = 1 По СтрДлина(Имя) Цикл
        а = Сред(Имя, ё, 1);
        Стэйт = (НРег(а) <> а) * 4 + Цел(Стэйт / 2);
        Ответ = Ответ + ?(Стэйт = 2, НРег(б), ?(ё = 2, ВРег(б), б)) + ?(Стэйт = 4 ИЛИ Стэйт = 5, " ", "");
        б = а
    КонецЦикла;
    Возврат Ответ + б
КонецФункции


Я ее использую уже на форме, но если нужно добавлять сразу на несколько формах, то можно также добавить передачу формы.

2 апреля 2022 г.

1СОшибка ГруппаКоманд.Отображение=ОтображениеГруппыКнопок.Компактное Не соответствие типов

 Создаю программно группу кнопок, хочу компактный вид и пишу:


эГруппаКоманд=ЭтаФорма.Элементы.вставить("ЭГруппаКоманд",тип("ГруппаФормы"), Элементы.Товары.КоманднаяПанель, Элементы.ТоварыКнопкиКоманднойПанели);
эГруппаКоманд.Вид=ВидГруппыФормы.ГруппаКнопок;
эГруппаКоманд.Отображение=ОтображениеГруппыКнопок.Компактное;

При открытии система выдает ошибку "Несоответствие типов" по строке номер два
Отладчиком проверяю и вижу что тип данного реквизита не группа, а кнопка....WTF????
Меняю местами вторую и третью строчку и проблема решена.