Механизм подключаемых команд: как расширить функционал объектов БСП без снятия с поддержки

20.03.26

Разработка - Инструментарий разработчика

Данное расширение — это механизм, сделанный при помощи двух модулей из БСП (3.1.11.415), который позволяет динамически добавлять команды (кнопки и не только при желании) на формы управляемого приложения без изменения конфигурации. На примере данного механизма удобно рассмотреть некоторые возможности для расширения функционала объектов, которые подключены к механизму библиотеки стандартных подсистем.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Механизм подключаемых команд: как расширить функционал объектов БСП без снятия с поддержки:
.cfe 19,66Kb
0 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Принцип работы довольно прост. Из основной конфигурации добавлены два общих модуля:


1. ПодключаемыеКоманды.

&После("ПриСозданииНаСервере")
Процедура Т_Ы_К_ПриСозданииНаСервере(Форма, Знач ПараметрыРазмещения)
	Т_Ы_К_СлужебныеПроцедурыФункцииСервер.ОпределитьПодключенныйОбъект(Форма, ПараметрыРазмещения);
КонецПроцедуры


Данная процедура ссылается на модуль расширения "Т_Ы_К_СлужебныеПроцедурыФункцииСервер". В нем прописана основная логика: сначала определяется полное имя объекта с помощью функции "ПолучитьПолноеИмяОбъекта", а после этого запросом ищем, есть ли элемент, который необходимо создать на форме для данного объекта. В этом примере в качестве объекта будет служить документ "Служебная записка", а элемент — это кнопка, свойства которой описаны в справочнике "Т_Ы_К_Кнопки".

Процедура ОпределитьПодключенныйОбъект(Форма, Знач ПараметрыРазмещения) Экспорт
	ИмяФормы = Форма.ИмяФормы;
	ПолноеИмяОбъекта = ПолучитьПолноеИмяОбъекта(ИмяФормы);
	
	УникальныйИдентификаторОбъекта = Форма.УникальныйИдентификатор;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	Т_Ы_К_КнопкиПодключенныеОбъекты.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Т_Ы_К_Кнопки.ПодключенныеОбъекты КАК Т_Ы_К_КнопкиПодключенныеОбъекты
	|ГДЕ
	|	Т_Ы_К_КнопкиПодключенныеОбъекты.Подключен = ИСТИНА
	|	И Т_Ы_К_КнопкиПодключенныеОбъекты.ПолноеИмяОбъекта = &ПолноеИмяОбъекта";
	
	Запрос.УстановитьПараметр("ПолноеИмяОбъекта", ПолноеИмяОбъекта);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Количество() Тогда
		Выборка.Следующий();
		Ссылка = Выборка.Ссылка;
		
		Команда	= Форма.Команды.Добавить(Ссылка.Наименование);
		Команда.Заголовок    			  = Ссылка.ЗаголовокКоманды; 
		Команда.Отображение  			  = ОтображениеКнопки.Авто;
		Команда.Действие 	  			  = "Подключаемый_ВыполнитьКоманду";
		Команда.ИзменяетСохраняемыеДанные = Истина;
		
		НовыйЭлемент = Форма.Элементы.Добавить(Ссылка.Наименование, Тип("КнопкаФормы"), Форма.КоманднаяПанель);
		НовыйЭлемент.Вид		= ВидКнопкиФормы[Строка(Ссылка.Вид)];	
		НовыйЭлемент.ИмяКоманды = Ссылка.Наименование;
		НовыйЭлемент.Заголовок  = Ссылка.ЗаголовокКоманды;
	КонецЕсли;
КонецПроцедуры

Функция ПолучитьПолноеИмяОбъекта(ИмяФормы)
	ПрерватьЦикл = Ложь;
	ПолноеИмяОбъекта = "";
	
	Для Счетчик = 1 По СтрДлина(ИмяФормы) Цикл
		Символ = Прав(Лев(ИмяФормы, Счетчик), 1);
		Если Символ = "." Тогда
			Если ПрерватьЦикл Тогда
				Прервать;
			КонецЕсли;
			ПрерватьЦикл = Истина;
		КонецЕсли;
		ПолноеИмяОбъекта = ПолноеИмяОбъекта + Символ;	
	КонецЦикла;	
	
	Возврат ПолноеИмяОбъекта;
КонецФункции


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

Вот так выглядит описание элемента в моем случае:



Код кнопки на сервере:

 

Сверху находятся основные свойства кнопки, далее идет код, который выполняет кнопка на клиенте и на сервере (о том, как это реализовано, будет далее), и объекты, в которых эта кнопка будет рисоваться при открытии формы.

Форма списка:


Результат:

 

Теперь что касается того, как выполняется код написанный для данной кнопки.
 

2. ПодключаемыеКомандыКлиент.

В данном модуле есть процедура "НачатьВыполнениеКоманды" (для удобства использую <ИзменениеИКонтроль>):

&ИзменениеИКонтроль("НачатьВыполнениеКоманды")
Процедура Т_Ы_К_НачатьВыполнениеКоманды(Форма, Команда, Знач Источник)
	#Вставка
	Результат = Т_Ы_К_СлужебныеПроцедурыФункцииКлиент.ВыполнитьПользовательскуюКоманду(Форма, Команда, Источник);
	Если Результат Тогда
		Возврат;
	КонецЕсли;
	#КонецВставки
	ИмяКоманды = Команда.Имя;
	АдресНастроек = Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд;
	ОписаниеКоманды = ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды(ИмяКоманды, АдресНастроек);

	Если Источник = Неопределено Тогда
		Источник = ПодключаемыеКомандыКлиентСервер.ВладелецКомандыПоИмениКоманды(ИмяКоманды, Форма);
	КонецЕсли;

	ПараметрыВыполнения = ПараметрыВыполненияКоманды();
	ПараметрыВыполнения.ОписаниеКоманды = Новый Структура(ОписаниеКоманды);
	ПараметрыВыполнения.Форма           = Форма;
	ПараметрыВыполнения.Источник        = Источник;

	ПараметрыВыполнения.ЭтоФормаОбъекта = ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура");
	// Служебные параметры.
	ПараметрыВыполнения.ТребуетсяЗапись         = ПараметрыВыполнения.ЭтоФормаОбъекта И ОписаниеКоманды.РежимЗаписи <> "НеЗаписывать";
	ПараметрыВыполнения.ТребуетсяПроведение = ОписаниеКоманды.РежимЗаписи = "Проводить"
	И (Не ПараметрыВыполнения.ЭтоФормаОбъекта Или Источник.Свойство("Проведен"));
	ПараметрыВыполнения.ТребуетсяРаботаСФайлами = ОписаниеКоманды.ТребуетсяРаботаСФайлами;
	ПараметрыВыполнения.ВызовСервераЧерезОбработкуОповещения = Истина;

	ПродолжитьВыполнениеКоманды(ПараметрыВыполнения);
КонецПроцедуры

 

Процедура как раз срабатывает при нажатии на нашу кнопку, и мы ловим этот момент и перенаправляем на еще один модуль расширения "Т_Ы_К_СлужебныеПроцедурыФункцииКлиент":

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


Сначала ищем по имени кнопку, далее подтягиваем пользовательский код команды в структуру, а исполнение кода происходит с помощью метода "Выполнить".

Также процедуры из модуля "Т_Ы_К_СлужебныеПроцедурыФункцииСервер", на которые ссылается данный код:

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

Процедура ВыполнитьКодНаСервере(ВыполняемыйКодНаСервере) Экспорт
	Выполнить(ВыполняемыйКодНаСервере);
КонецПроцедуры

Процедура СделатьЗаписьВЖурналРегистрации(Ошибка, ИмяСобытия, ВыполняемыйКод) Экспорт
	ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.Т_Ы_К_Кнопки,, ВыполняемыйКод);
КонецПроцедуры


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

Проверено на следующих конфигурациях и релизах:

  • 1С:ERP Управление предприятием 2, релизы 2.5.22.159

Вступайте в нашу телеграмм-группу Инфостарт

расширение 1С:Предприятие ERP 2 открытый код памятка программирование Управление предприятием 2 шпаргалка инструмент разработчика начинающий программист обучение работа с формой документ кнопки команды инструкция

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

24900 руб.

20.08.2024    62380    328    160    

297

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    248988    1381    421    

1140

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

15250 руб.

25.08.2025    45607    98    27    

110

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Библиотека стандартных подсистем Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22570 руб.

06.10.2023    36127    94    40    

112

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

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

17000 руб.

10.11.2023    24048    91    42    

101

Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9500 руб.

17.05.2024    50626    174    63    

207

SALE! %

Мастера заполнения Поиск данных База данных Инструментарий разработчика Корректировка данных Универсальные функции Механизмы платформы 1С Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

5000 4000 руб.

25.02.2026    1610    9    1    

11
Для отправки сообщения требуется регистрация/авторизация