При работе с конфигурациями на обычных формах (ОФ), такими как Управление торговлей 10.3 или Управление производственным предприятием 1.3, разработчики часто сталкиваются с тем, что стандартный механизм регистрации дополнительных обработок не предусматривает их автоматическое появление в списках справочников. В отличие от управляемых форм, где достаточно прописать назначение в сведениях о внешней обработке, в ОФ нам приходится прибегать к программным методам расширения интерфейса.
В этой статье мы подробно разберем, как интегрировать внешнюю обработку в форму списка, проанализируем способы программного добавления элементов управления и выясним, как правильно передавать данные из списка в обработку для их последующего изменения или анализа.
Для начала проанализируем ситуацию: в типовой УТ 10.3 существует справочник ВнешниеОбработки. Однако встроенная в него логика (часть БСП для обычных форм) ориентирована на печатные формы и заполнение табличных частей документов. Формы списков справочников в этом механизме часто остаются «за бортом». Чтобы не модифицировать визуальный макет каждой формы списка в конфигураторе (что затрудняет последующие обновления), мы будем использовать программный подход.
Самый изящный способ — это добавление кнопки непосредственно в коде формы списка в обработчике ПриОткрытии. Это позволяет нам динамически изменять интерфейс, не затрагивая визуальную структуру метаданных. Разберем по шагам, как это реализовать.
Сначала нам нужно найти командную панель формы и добавить на нее новую кнопку. Важно правильно указать действие, которое будет выполняться при нажатии. Рассмотрим пример кода:
Процедура ПриОткрытии()
// Добавляем кнопку на основную командную панель формы
НоваяКнопка = ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить("КнопкаВызоваОбработки", ТипКнопкиКоманднойПанели.Действие, "Выполнить внешнюю обработку", Новый Действие("НажатьКнопкуОбработки"));
НоваяКнопка.Подсказка = "Запустить внешнюю обработку для изменения данных";
НоваяКнопка.Пояснение = "Запустить внешнюю обработку для изменения данных";
КонецПроцедуры
Процедура НажатьКнопкуОбработки()
// Здесь будет логика поиска и запуска обработки
ВызватьВнешнююОбработку();
КонецПроцедуры
Используя метод Кнопки.Добавить, мы создаем элемент интерфейса «на лету». Обратите внимание, что в качестве третьего параметра мы передаем текст, который увидит пользователь, а в четвертом — объект Действие, указывающий на имя процедуры, которую мы опишем далее.
Поскольку внешние обработки в 1С хранятся в справочнике как двоичные данные, мы не можем просто запустить их по ссылке. Нам необходимо сначала извлечь файл во временный каталог. Проанализируем процесс создания временного файла и инициализации обработки.
Рассмотрим процедуру вызова, которую следует разместить в модуле формы списка:
Процедура ВызватьВнешнююОбработку()
// 1. Находим обработку в справочнике по наименованию или коду
СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию("ЗагрузкаНоменклатуры");
Если СсылкаНаОбработку.Пустая() Тогда
Предупреждение("Внешняя обработка не найдена в справочнике!");
Возврат;
КонецЕсли;
// 2. Получаем двоичные данные файла
ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
// 3. Создаем временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные.Записать(ИмяФайла);
// 4. Подключаем обработку
Попытка
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла);
// Передаем контекст формы (саму форму списка) в обработку
// Это позволит обработке видеть отборы и выделенные строки
ВнешняяОбработкаОбъект.Параметры.Вставить("Владелец", ЭтаФорма);
// Открываем форму обработки
ВнешняяОбработкаОбъект.ПолучитьФорму().Открыть();
Исключение
Сообщить("Ошибка при запуске обработки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В этом примере мы используем метод ПолучитьИмяВременногоФайла, чтобы избежать конфликтов имен при одновременной работе нескольких пользователей. После записи данных на диск с помощью Записать(), мы создаем объект через ВнешниеОбработки.Создать().
Просто открыть обработку часто недостаточно. Обычно требуется, чтобы она знала, с какими именно данными из списка работает пользователь. Выясним, как передать текущий отбор списка или массив выбранных ссылок в обработку.
В обычных формах объект СправочникСписок содержит свойство Отбор. Мы можем передать его как структуру параметров. Посмотрим, как модифицировать код передачи данных:
// В форме списка перед открытием обработки
ПараметрыДляПередачи = Новый Структура;
ПараметрыДляПередачи.Вставить("ТекущийОтбор", СправочникСписок.Отбор);
// Если нужно передать выделенные строки
МассивСсылок = Новый Массив;
Для Каждого Строка Из ЭлементыФормы.СправочникСписок.ВыделенныеСтроки Цикл
МассивСсылок.Добавить(Строка);
КонецЦикла;
ПараметрыДляПередачи.Вставить("ВыделенныеОбъекты", МассивСсылок);
ВнешняяОбработкаОбъект.Параметры = ПараметрыДляПередачи;
В самой внешней обработке (в ее модуле или форме) мы сможем обратиться к этим данным. Например, в процедуре ПриОткрытии внешней обработки можно считать эти параметры и применить их для фильтрации данных внутри алгоритмов обработки.
Разберем важный момент, касающийся прав доступа. Даже если вы правильно написали код, пользователь может столкнуться с ошибкой. В 1С 8.3 для работы внешних обработок требуются специфические права:
ВнешниеОбработки и его табличных частей (хранилищ).ВнешниеОбработки.Создать(Путь, Ложь) второй параметр определяет, будет ли обработка запущена в безопасном режиме. В безопасном режиме запрещен доступ к файловой системе и некоторым методам платформы, что может помешать работе сложных загрузчиков.Если ваша задача — массовое изменение реквизитов (например, замена ответственного или пересчет цен) в справочнике, проанализируем использование стандартного инструмента. В УТ 10.3 есть встроенная обработка УниверсальныйПодборИОбработкаОбъектов.
Вместо того чтобы «рисовать» кнопку в каждом справочнике, мы можем зарегистрировать свою внешнюю обработку как алгоритм для этой типовой обработки. Это дает преимущество: вы получаете мощный механизм фильтрации (по любым реквизитам, остаткам, свойствам), который уже написан разработчиками 1С, и выполняете свой произвольный код только над результатом этого фильтра.
Мы рассмотрели основной механизм интеграции внешних инструментов в интерфейс обычных форм. Подводя итог, отметим: программное добавление кнопок через Кнопки.Добавить является наиболее гибким методом, так как оно позволяет централизованно управлять интерфейсом без постоянного внесения изменений в структуру основной конфигурации. Помните о необходимости очистки временных файлов и корректной обработке исключений при открытии внешних файлов.