При разработке в среде 1С:Предприятие 8 (особенно в крупных типовых конфигурациях, таких как Зарплата и Управление Персоналом 3.1) начинающие программисты часто сталкиваются с трудностями при попытке отследить работу системных кнопок. Одним из таких "загадочных" механизмов являются параметризуемые глобальные команды, которые автоматически выводятся на форму, но при этом их физического кода нет в привычном списке общих команд конфигуратора. В этой статье мы подробно разберем, как устроен этот механизм, где скрывается исполняемый код и как реализовать аналогичную логику для собственных объектов.
Для начала давайте выясним причину, почему такие команды называют параметризуемыми. На платформе 1С:Предприятие все глобальные команды делятся на два типа:
ДокументСсылка.Отпуск или СправочникСсылка.Сотрудники).Когда мы открываем управляемую форму, платформа анализирует ее основной реквизит (как правило, это реквизит Объект). На вкладке «Глобальные команды» в окне «Параметризуемые» среда разработки автоматически отображает только те команды, тип параметра которых совпадает с типом основного реквизита нашей формы. Разработчику достаточно перетащить такую команду мышью в командную панель формы, чтобы она стала доступна пользователю.
Самым популярным примером параметризуемой глобальной команды является стандартное меню Создать на основании. Рассмотрим подробнее, как этот процесс устроен на уровне платформы:
СовмещениеДолжностей) на вкладке «Ввод на основании» в списке источников отмечены галочками другие документы (например, Отпуск или БольничныйЛист).ОбработкаЗаполнения.Давайте посмотрим на классический пример того, как выглядит заготовка этого обработчика в модуле объекта:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
// Переменная ДанныеЗаполнения содержит ссылку на документ-источник
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Отпуск") Тогда
// Здесь пишется код заполнения реквизитов из Документа-Источника
Сотрудник = ДанныеЗаполнения.Сотрудник;
Организация = ДанныеЗаполнения.Организация;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию в современных конфигурациях, созданных на базе Библиотеки стандартных подсистем (БСП). В таких программах, как ЗУП 3.1, стандартный механизм платформы перехвачен и управляется подсистемой Подключаемые команды.
Это сделано для обеспечения гибкости: разработчики могут динамически скрывать или показывать команды создания на основании в зависимости от прав пользователя, настроек программы или текущего состояния документа. Также это позволяет добавлять новые кнопки ввода на основании через расширения или внешние обработки без изменения основной конфигурации.
Процесс интеграции БСП выглядит следующим образом:
ПриСозданииНаСервере) вызывается специальный метод БСП, например: ВводНаОсновании.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюСоздатьНаОсновании).ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании).Если вам необходимо детально разобраться, почему при вводе на основании не заполняются те или иные реквизиты, выполните следующие шаги для отладки:
СовмещениеДолжностей).ОбработкаЗаполнения. Поставьте точку останова (клавиша F9) на первой строке этой процедуры.ЗаполнитьПоОснованию(ДанныеЗаполнения) или ЗаполнитьПоДокументуОснованию(ДанныеЗаполнения). Шагните внутрь этого метода (клавиша F11), чтобы увидеть детальный алгоритм переноса данных из реквизитов источника в реквизиты приемника.Если перед вами стоит задача реализовать аналогичный механизм и передать ссылку на текущий документ в форму другого объекта при нажатии кнопки, мы можем использовать два основных подхода.
Это самый простой и быстрый способ, не требующий создания метаданных новой команды в конфигураторе. Мы можем написать код открытия формы непосредственно в обработчике нажатия нашей кнопки на форме источника. При этом мы передадим структуру параметров, в которой укажем ключ ЗначениеЗаполнения.
Давайте разберем пример реализации на клиенте:
&НаКлиенте
Процедура ОткрытьФормуСовмещенияНаОсновании(Команда)
// Формируем параметры для передачи в открываемую форму
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначениеЗаполнения", Объект.Ссылка);
// Открываем форму нового документа Совмещение Должностей
ОткрытьФорму("Документ.СовмещениеДолжностей.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
При таком подходе платформа автоматически перенаправит переданную ссылку в предопределенный обработчик ОбработкаЗаполнения создаваемого документа, и вся логика отработает штатно.
Если вам требуется, чтобы кнопка создания на основании отображалась в командном интерфейсе сразу нескольких различных документов, лучшим решением будет создание собственной глобальной параметризуемой команды. Выполним настройку по шагам:
СоздатьСовмещениеДолжностей.Панель навигации формы.Обычное или Командная панель формы.Создать на основании).Отпуск и БольничныйЛист).
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// ПараметрКоманды содержит ссылку на объект, из которого была нажата кнопка
ПараметрыФормы = Новый Структура("ЗначениеЗаполнения", ПараметрКоманды);
// Открываем форму нового документа с передачей контекста источника
ОткрытьФорму(
"Документ.СовмещениеДолжностей.ФормаОбъекта",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник
);
КонецПроцедуры
После выполнения этих настроек платформа самостоятельно добавит кнопку на форму всех документов, типы которых вы указали в свойствах типа параметра команды. Это избавит вас от необходимости вручную модифицировать формы множества документов-источников.