Как разработать внешнюю обработку заполнения табличной части на управляемых формах

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

Разработка внешних обработок для современных конфигураций 1С, построенных на базе Библиотеки стандартных подсистем (БСП), требует строгого соблюдения определенных стандартов. Часто начинающие разработчики сталкиваются с ситуацией, когда обработка успешно регистрируется в системе, но при нажатии на кнопку в интерфейсе ничего не происходит или команда ведет себя непредсказуемо. Разберем пошагово, как правильно создать механизм заполнения табличных частей и избежать типичных ошибок с контекстом вызова.

Шаг 1. Формирование сведений о внешней обработке

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

Проанализируем пример кода для регистрации:


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

Обратим внимание на параметр Вид. В зависимости от версии БСП и настроек конфигурации, значения ЗаполнениеТабличныхЧастей и ЗаполнениеОбъекта могут влиять на то, в каких подменю появится ваша команда. Если вы хотите, чтобы кнопка была жестко привязана к конкретной таблице, следует использовать ЗаполнениеТабличныхЧастей.

Шаг 2. Особенности клиентского вызова

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

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


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

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

Важный нюанс: при вызове клиентского метода обработка создается в контексте формы документа. Параметр ОбъектыНазначенияМассив содержит ссылки на документы, но если документ еще не записан, этот массив будет пустым! В этом случае единственный способ получить данные — использовать свойство ЭтаФорма.ВладелецФормы.

Шаг 3. Устранение дублирования кнопок

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

Выясним причины такого поведения:

  1. Тип обработки: Если указано ЗаполнениеТабличныхЧастей, БСП пытается найти подходящую таблицу в документе и добавить команду в ее командную панель.
  2. Метаданные документа: Если в документе несколько табличных частей, команда может отображаться некорректно в одной из них, если не заданы уточняющие параметры (модификаторы).

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

Шаг 4. Работа с безопасным режимом и отладка

Рассмотрим еще одну частую проблему — БезопасныйРежим. Если в параметрах регистрации установлено Истина, обработка не сможет выполнять небезопасные операции (например, работу с файловой системой или внешними COM-объектами). Если ваша логика заполнения подразумевает загрузку данных из Excel, обязательно устанавливайте БезопасныйРежим = Ложь.

Посмотрим на типичные ошибки отладки:

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

Подведем итог. Для создания надежной внешней обработки заполнения табличных частей необходимо:

  1. Тщательно описывать таблицу команд в модуле объекта, уделяя внимание колонке Использование.
  2. В модуле формы обязательно делать процедуру ВыполнитьКоманду экспортной.
  3. Всегда проверять наличие ВладелецФормы, чтобы иметь возможность работать с незаписанными объектами напрямую через Объект формы документа.
  4. Если обработка должна работать с конкретной таблицей, убедитесь, что в коде вы обращаетесь именно к ее идентификатору в структуре документа.

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

← На главную