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

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

При работе с конфигурациями на обычных формах (ОФ), такими как Управление торговлей 10.3 или Управление производственным предприятием 1.3, разработчики часто сталкиваются с тем, что стандартный механизм регистрации дополнительных обработок не предусматривает их автоматическое появление в списках справочников. В отличие от управляемых форм, где достаточно прописать назначение в сведениях о внешней обработке, в ОФ нам приходится прибегать к программным методам расширения интерфейса.

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

Анализ ограничений типовых механизмов

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

Способ 1. Программное добавление кнопки на командную панель

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

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


Процедура ПриОткрытии()
    // Добавляем кнопку на основную командную панель формы
    НоваяКнопка = ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить("КнопкаВызоваОбработки", ТипКнопкиКоманднойПанели.Действие, "Выполнить внешнюю обработку", Новый Действие("НажатьКнопкуОбработки"));
    НоваяКнопка.Подсказка = "Запустить внешнюю обработку для изменения данных";
    НоваяКнопка.Пояснение = "Запустить внешнюю обработку для изменения данных";
КонецПроцедуры

Процедура НажатьКнопкуОбработки()
    // Здесь будет логика поиска и запуска обработки
    ВызватьВнешнююОбработку();
КонецПроцедуры

Используя метод Кнопки.Добавить, мы создаем элемент интерфейса «на лету». Обратите внимание, что в качестве третьего параметра мы передаем текст, который увидит пользователь, а в четвертом — объект Действие, указывающий на имя процедуры, которую мы опишем далее.

Способ 2. Извлечение и запуск внешней обработки из хранилища

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

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


Процедура ВызватьВнешнююОбработку()
    // 1. Находим обработку в справочнике по наименованию или коду
    СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию("ЗагрузкаНоменклатуры");
    
    Если СсылкаНаОбработку.Пустая() Тогда
        Предупреждение("Внешняя обработка не найдена в справочнике!");
        Возврат;
    КонецЕсли;

    // 2. Получаем двоичные данные файла
    ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
    
    // 3. Создаем временный файл
    ИмяФайла = ПолучитьИмяВременногоФайла("epf");
    ДвоичныеДанные.Записать(ИмяФайла);
    
    // 4. Подключаем обработку
    Попытка
        ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла);
        
        // Передаем контекст формы (саму форму списка) в обработку
        // Это позволит обработке видеть отборы и выделенные строки
        ВнешняяОбработкаОбъект.Параметры.Вставить("Владелец", ЭтаФорма);
        
        // Открываем форму обработки
        ВнешняяОбработкаОбъект.ПолучитьФорму().Открыть();
    Исключение
        Сообщить("Ошибка при запуске обработки: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

В этом примере мы используем метод ПолучитьИмяВременногоФайла, чтобы избежать конфликтов имен при одновременной работе нескольких пользователей. После записи данных на диск с помощью Записать(), мы создаем объект через ВнешниеОбработки.Создать().

Передача контекста списка (Отборы и выделенные строки)

Просто открыть обработку часто недостаточно. Обычно требуется, чтобы она знала, с какими именно данными из списка работает пользователь. Выясним, как передать текущий отбор списка или массив выбранных ссылок в обработку.

В обычных формах объект СправочникСписок содержит свойство Отбор. Мы можем передать его как структуру параметров. Посмотрим, как модифицировать код передачи данных:


// В форме списка перед открытием обработки
ПараметрыДляПередачи = Новый Структура;
ПараметрыДляПередачи.Вставить("ТекущийОтбор", СправочникСписок.Отбор);

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

ВнешняяОбработкаОбъект.Параметры = ПараметрыДляПередачи;

В самой внешней обработке (в ее модуле или форме) мы сможем обратиться к этим данным. Например, в процедуре ПриОткрытии внешней обработки можно считать эти параметры и применить их для фильтрации данных внутри алгоритмов обработки.

Нюансы прав доступа и безопасности

Разберем важный момент, касающийся прав доступа. Даже если вы правильно написали код, пользователь может столкнуться с ошибкой. В 1С 8.3 для работы внешних обработок требуются специфические права:

  1. Интерактивное открытие внешних обработок: Эта роль должна быть назначена пользователю в конфигураторе.
  2. Доступ к справочнику: У пользователя должны быть права на чтение справочника ВнешниеОбработки и его табличных частей (хранилищ).
  3. Безопасный режим: При создании объекта методом ВнешниеОбработки.Создать(Путь, Ложь) второй параметр определяет, будет ли обработка запущена в безопасном режиме. В безопасном режиме запрещен доступ к файловой системе и некоторым методам платформы, что может помешать работе сложных загрузчиков.

Альтернатива: Универсальный подбор и обработка объектов

Если ваша задача — массовое изменение реквизитов (например, замена ответственного или пересчет цен) в справочнике, проанализируем использование стандартного инструмента. В УТ 10.3 есть встроенная обработка УниверсальныйПодборИОбработкаОбъектов.

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

Заключение

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

← На главную