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