Как найти код и настроить работу параметризуемых глобальных команд ввода на основании в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке в среде 1С:Предприятие 8 (особенно в крупных типовых конфигурациях, таких как Зарплата и Управление Персоналом 3.1) начинающие программисты часто сталкиваются с трудностями при попытке отследить работу системных кнопок. Одним из таких "загадочных" механизмов являются параметризуемые глобальные команды, которые автоматически выводятся на форму, но при этом их физического кода нет в привычном списке общих команд конфигуратора. В этой статье мы подробно разберем, как устроен этот механизм, где скрывается исполняемый код и как реализовать аналогичную логику для собственных объектов.

Разберем теорию: Что такое параметризуемые глобальные команды?

Для начала давайте выясним причину, почему такие команды называют параметризуемыми. На платформе 1С:Предприятие все глобальные команды делятся на два типа:

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

Когда мы открываем управляемую форму, платформа анализирует ее основной реквизит (как правило, это реквизит Объект). На вкладке «Глобальные команды» в окне «Параметризуемые» среда разработки автоматически отображает только те команды, тип параметра которых совпадает с типом основного реквизита нашей формы. Разработчику достаточно перетащить такую команду мышью в командную панель формы, чтобы она стала доступна пользователю.

Классический механизм платформы «Ввод на основании»

Самым популярным примером параметризуемой глобальной команды является стандартное меню Создать на основании. Рассмотрим подробнее, как этот процесс устроен на уровне платформы:

  1. Где код самой команды? Если мы попытаемся найти эту команду в дереве метаданных конфигуратора, то ничего не найдем. Код кнопки генерации нового документа создается платформой динамически под капотом. Это происходит в том случае, если у документа-приемника (например, у документа СовмещениеДолжностей) на вкладке «Ввод на основании» в списке источников отмечены галочками другие документы (например, Отпуск или БольничныйЛист).
  2. Где выполняется логика заполнения? При нажатии на кнопку ввода на основании платформа сама инициализирует в оперативной памяти новый объект-приемник, после чего передает ссылку на документ-источник в специальный обработчик. Вся прикладная логика переноса данных всегда располагается в модуле объекта документа-приемника в предопределенной процедуре ОбработкаЗаполнения.

Давайте посмотрим на классический пример того, как выглядит заготовка этого обработчика в модуле объекта:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    // Переменная ДанныеЗаполнения содержит ссылку на документ-источник
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Отпуск") Тогда
        // Здесь пишется код заполнения реквизитов из Документа-Источника
        Сотрудник = ДанныеЗаполнения.Сотрудник;
        Организация = ДанныеЗаполнения.Организация;
    КонецЕсли;
    
КонецПроцедуры

Специфика работы в типовых конфигурациях (ЗУП 3.1 и БСП)

Проанализируем ситуацию в современных конфигурациях, созданных на базе Библиотеки стандартных подсистем (БСП). В таких программах, как ЗУП 3.1, стандартный механизм платформы перехвачен и управляется подсистемой Подключаемые команды.

Это сделано для обеспечения гибкости: разработчики могут динамически скрывать или показывать команды создания на основании в зависимости от прав пользователя, настроек программы или текущего состояния документа. Также это позволяет добавлять новые кнопки ввода на основании через расширения или внешние обработки без изменения основной конфигурации.

Процесс интеграции БСП выглядит следующим образом:

  1. В форме документа-источника при инициализации (в процедуре ПриСозданииНаСервере) вызывается специальный метод БСП, например: ВводНаОсновании.ПриСозданииНаСервере(ЭтаФорма, Элементы.ПодменюСоздатьНаОсновании).
  2. Система обращается к модулю менеджера документа-приемника, где должна быть описана экспортная процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании).
  3. После сбора информации БСП динамически генерирует кнопки в интерфейсе. При нажатии на кнопку срабатывает клиентский метод общего модуля БСП, который программно создает новый документ и открывает его форму.

Где искать код и как отлаживать логику заполнения

Если вам необходимо детально разобраться, почему при вводе на основании не заполняются те или иные реквизиты, выполните следующие шаги для отладки:

  1. Откройте конфигуратор и перейдите к документу-приемнику (в нашем примере это документ СовмещениеДолжностей).
  2. Откройте Модуль объекта этого документа.
  3. Найдите процедуру ОбработкаЗаполнения. Поставьте точку останова (клавиша F9) на первой строке этой процедуры.
  4. В типовых конфигурациях внутри этой процедуры обычно вызывается специализированный метод из модуля менеджера или общего модуля, например, ЗаполнитьПоОснованию(ДанныеЗаполнения) или ЗаполнитьПоДокументуОснованию(ДанныеЗаполнения). Шагните внутрь этого метода (клавиша F11), чтобы увидеть детальный алгоритм переноса данных из реквизитов источника в реквизиты приемника.

Как передать свои параметры при вызове: Два практических способа

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

Способ 1. Программное открытие формы с передачей параметров

Это самый простой и быстрый способ, не требующий создания метаданных новой команды в конфигураторе. Мы можем написать код открытия формы непосредственно в обработчике нажатия нашей кнопки на форме источника. При этом мы передадим структуру параметров, в которой укажем ключ ЗначениеЗаполнения.

Давайте разберем пример реализации на клиенте:


&НаКлиенте
Процедура ОткрытьФормуСовмещенияНаОсновании(Команда)
    
    // Формируем параметры для передачи в открываемую форму
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗначениеЗаполнения", Объект.Ссылка);
    
    // Открываем форму нового документа Совмещение Должностей
    ОткрытьФорму("Документ.СовмещениеДолжностей.ФормаОбъекта", ПараметрыФормы);
    
КонецПроцедуры

При таком подходе платформа автоматически перенаправит переданную ссылку в предопределенный обработчик ОбработкаЗаполнения создаваемого документа, и вся логика отработает штатно.

Способ 2. Создание собственной параметризуемой общей команды

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

  1. В дереве метаданных конфигуратора перейдите в ветку Общие -> Общие команды и добавьте новую команду. Назовем ее, например, СоздатьСовмещениеДолжностей.
  2. В свойствах созданной команды укажите свойство Группа. Выберите значение, соответствующее командной панели формы (например, Панель навигации формы.Обычное или Командная панель формы.Создать на основании).
  3. В свойстве Тип параметра команды выберите типы документов, из которых разрешено создавать наш документ (например, укажите типы документов Отпуск и БольничныйЛист).
  4. Перейдите в модуль команды и напишите следующий программный код:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    // ПараметрКоманды содержит ссылку на объект, из которого была нажата кнопка
    ПараметрыФормы = Новый Структура("ЗначениеЗаполнения", ПараметрКоманды);
    
    // Открываем форму нового документа с передачей контекста источника
    ОткрытьФорму(
        "Документ.СовмещениеДолжностей.ФормаОбъекта", 
        ПараметрыФормы, 
        ПараметрыВыполненияКоманды.Источник
    );
    
КонецПроцедуры

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

← На главную