Как программно создать кнопку в документе с помощью внешней обработки в 1С

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

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

Механизм БСП: Дополнительные отчеты и обработки

Для того чтобы ваша внешняя обработка была интегрирована в интерфейс документа (например, в «ЗУП КОРП»), она должна соответствовать стандартам БСП. Самый правильный путь — использование подсистемы «Дополнительные отчеты и обработки». Чтобы система «увидела» обработку и позволила добавить кнопку, в модуле объекта обработки необходимо прописать экспортную функцию СведенияОВнешнейОбработке().

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


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Назначение.Добавить("Документ.ВедомостьНаВыплатуЗарплатыВКассу");
    ПараметрыРегистрации.Наименование = "Заполнить колонку 'К выплате'";
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Установить выплату 500 руб.";
    НоваяКоманда.Идентификатор = "ЗаполнитьВыплату500";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
КонецФункции

Важный нюанс: Обратите внимание на тип использования команды ЗаполнениеФормы. В отличие от простого заполнения объекта, этот режим позволяет получить доступ непосредственно к экранной форме (ЭтаФорма), что дает возможность изменять элементы интерфейса «на лету» — поможет программная кастомизация логики и интерфейса 1С.

Программное создание элементов управления на форме

Рассмотрим ситуацию, когда заказчик настаивает на появлении отдельной кнопки прямо в командной панели документа, а не в выпадающем меню «Заполнить». Проанализируем, как это сделать программно в модуле обработки — решается через конструктор форм и документов без программирования. Если мы используем тип команды ЗаполнениеФормы, то в модуле объекта обработки должна быть процедура ВыполнитьКоманду.

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

  1. Создаем новую команду формы через ЭтаФорма.Команды.Добавить().
  2. Создаем элемент управления (кнопку) через ЭтаФорма.Элементы.Добавить().
  3. Связываем кнопку с созданной командой.
  4. Прописываем действие — обработчик команды.

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

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

Реализация логики заполнения табличной части

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


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

Важный момент для ЗУП КОРП: Просто изменить число в колонке недостаточно. В сложных конфигурациях при изменении суммы должны пересчитываться НДФЛ, взносы или итоги по документу. Поэтому после программного изменения рекомендуется вызывать экспортные процедуры из модулей менеджеров соответствующих документов, которые отвечают за пересчет РассчитатьДокумент().

Сравнение с использованием расширений

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

Преимущества расширения:

Преимущества внешней обработки:

Итоги и рекомендации

Подведем итог нашему исследованию. Если задача стоит именно в создании кнопки «здесь и сейчас» без изменения структуры конфигурации, используйте механизм БСП Заполнение формы. Это позволит вам гибко манипулировать данными формы документа. Однако для долгосрочных изменений интерфейса в промышленной эксплуатации (особенно в ЗУП КОРП) предпочтительным является механизм расширений, так как он обеспечивает стабильность работы обработчиков событий и упрощает отладку кода — для этого пригодятся инструменты разработчика с консолями кода и запросов.

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

← На главную