Версия БСП: 3.1.4
Подсистема: Подключаемые команды
Раздел ИТС: Библиотека стандартных подсистем 3.1.4. Документация -> Глава 3. Настройка и использование подсистем при разработке конфигурации -> Подключаемые команды
Как понятно из названия статьи, подсистема “Подключаемые команды” является частью библиотеки стандартных подсистем (далее БСП).
В каждом прикладном решении есть объекты входящие в эту подсистему. Следовательно, для этих объектов можно подключать дополнительные команды.
И именно слово “подключать” подойдет здесь лучше всего. Сейчас коротко объясню почему:
Ближе к делу...
В качестве примера я использовал заполнение документа “Премия" типового прикладного решения “1С:Зарплата и управление персоналом 3”.
Допустим, нам нужно реализовать такой алгоритм расчета премии, который сложно выполнить с помощью типового расчета.
Для этой цели отлично подойдет подключаемая команда заполнения.
В файлах публикации Вы можете скачать шаблон-заготовку, а также готовый вариант обработки заполнения документа «Премия».
Итак, приступим …
В первую очередь в модуле объекта нужно заполнить функцию СведенияОВнешнейОбработке.
Функция СведенияОВнешнейОбработке() Экспорт
В параметрах регистрации укажем “ЗаполнениеОбъекта”. Это в дальнейшем повлияет на расположение кнопки на форме объекта назначения. (все варианты см. ИТС).
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта());
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
Определим объекты, к которым мы подключаем нашу обработку. В нашем случае это один документ “Премия”
МассивНазначений = Новый Массив();
МассивНазначений.Добавить("Документ.Премия");
Заполним остальные поля параметров регистрации
ПараметрыРегистрации.Вставить("Наименование", "Расчет премии (нетиповой)");
ПараметрыРегистрации.Вставить("Версия", "1.0"); //"1.0"
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Свой вариант расчета премии");
ПараметрыРегистрации.Вставить("ВерсияБСП", ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.4.1"));
Добавим команду открытия обработки, которая в дальнейшем появится в документе «Премия». «Вид использования» выбираем «ОткрытиеФормы».
ДобавитьКоманду(ТаблицаКоманд, "Рассчитать премию", "РассчитатьПремию", "ОткрытиеФормы", Ложь, "");
Описание других видов использования:
Теперь наша обработка технически готова к добавлению в состав дополнительных отчетов и обработок типового прикладного решения!
Осталось добавить механизм расчета премии и сохранения результатов расчета.
Немного подробнее о механизме открытия формы обработки…
При добавлении команды в таблицу команд мы указали вид команды «ОткрытиеФормы». Это значит, что при выполнении команды «Рассчитать премию» будет открыта основная форма нашей обработки.
В этой форме перечислены ключевые параметры, в которые БСП будет записывать данные необходимые для выполнения обработки.
Для вида использования «ОткрытиеФормы» существуют следующие параметры:
- ДополнительнаяОбработкаСсылка – ссылка на элемент справочника «ДополнительныеОтчетыИОбработки».
- ИдентификаторКоманды – идентификатор, заданный для команды при добавлении в таблицу команд в модуле объекта.
- ОбъектыНазначения – массив ссылок объектов назначений. Если обработка вызывается из формы объекта, то в массиве будет одна запись. Если обработка вызывается из формы списка, то в массиве будет столько записей сколько выбрано строк.
Кроме того, в данном случае можно обратиться к контексту формы объекта-владельца. Это делается через конструкцию «ВладелецФормы.Объект» в процедуре формы «ПриОткрытии». Конструкция «ВладелецФормы.Объект» дает возможность считывать необходимые данные из объекта-владельца, а также записать в объект результаты расчета премии.
Переходим к расчету премии…
Для получения актуальных данных документа «Премия» будем использовать конструкцию «ВладелецФормы.Объект» в процедуре «ПриОткрытии».
ЗаполнитьРеквизитыФормыНаСервере(ВладелецФормы.Объект);
Процедура «ЗаполнитьРеквизитыФормыНаСервере» считывает актуальные значения реквизитов объекта владельца и через модуль объекта записывает их в реквизиты обработки.
&НаСервере
Процедура ЗаполнитьРеквизитыФормыНаСервере(знач ДанныеЗаполнения)
// Заполняем данные шапки
НачалоПериода = ДанныеЗаполнения.ПериодРегистрации;
КонецПериода = КонецМесяца(ДанныеЗаполнения.ПериодРегистрации);
ДанныеШапки = Новый Структура("НачалоПериода, КонецПериода", НачалоПериода, КонецПериода);
// Получаем начисления
Начисления = ДанныеЗаполнения.Начисления.Выгрузить();
// Реквизиты обработки заполняем в модуле объекта
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ЗаполнитьШапку(ДанныеШапки);
ОбработкаОбъект.ЗаполнитьНачисленияОбработки(Начисления);
ЗначениеВРеквизитФормы(ОбработкаОбъект, "Объект");
КонецПроцедуры
На форме добавлены две команды «РассчитатьПремию» и «ПеренестиВДокумент».
По команде «РассчитатьПремию» вызывается процедура модуля объекта с расчетом.
Здесь записан самый примитивный расчет, ибо цель статьи показать работу подключаемой обработки, а не разбирать ньюансы расчета сумм премии.
Процедура РассчитатьПремию() Экспорт
// Для примера увеличим премию на 10%
Для каждого СтрокаРасчетаПремии Из РасчетПремии Цикл
СтрокаРасчетаПремии.НовыйРезультат = СтрокаРасчетаПремии.Результат + Окр(СтрокаРасчетаПремии.Результат*10/100, 15, 2);
КонецЦикла;
КонецПроцедуры
По команде «ПеренестиВДокумент» вызывается процедура «ПеренестиВДокументОтвет»:
- Выполняется цикл по табличной части «РасчетПремии» обработки.
- Для каждой строки выполняется поиск строки в табличной части «Начисления» документа владельца. Если строка найдена, тогда колонка «Результат» обработки переносится в колонку «Результат» документа.
После завершения цикла имеет смысл принудительно установить флаг модифицированности формы объекта-владельца, а также принудительно закрыть форму обработки.
&НаКлиенте
Процедура ПеренестиДанныеВДокументОтвет(Знач Результат, Знач ПараметрыКоманды) Экспорт
Если Результат = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
НачисленияДокумента = ВладелецФормы.Объект.Начисления;
Для каждого СтрокаРасчетаПремии Из Объект.РасчетПремии Цикл
ПараметрыПоиска = Новый Структура("Сотрудник", СтрокаРасчетаПремии.Сотрудник);
СтрокиНачислений = НачисленияДокумента.НайтиСтроки(ПараметрыПоиска);
Если СтрокиНачислений.Количество() > 0 Тогда
СтрокаНачислений = СтрокиНачислений[0];
СтрокаНачислений.Результат = СтрокаРасчетаПремии.НовыйРезультат;
КонецЕсли;
КонецЦикла;
ВладелецФормы.Модифицированность = Истина;
ЭтаФорма.Закрыть();
КонецПроцедуры
Итоги…
Теперь обработку можно добавить в список дополнительных отчетов и обработок прикладного решения и проверить как она функционирует.
В разных типовых прикладных решениях кнопка заполнения на форме может отображаться в разных местах. Для «1С:Зарплата и управление персоналом 3» кнопка появится здесь: