Для программистов и продвинутых пользователей 1С часто возникает необходимость программно запускать внешние обработки, которые были предварительно зарегистрированы в справочнике "Внешние обработки" вашей конфигурации, например, в 1С:Управление торговлей 10 (УТ10). Это может быть полезно для автоматизации рутинных операций, запуска обработок по расписанию через регламентные задания или интеграции с другими подсистемами. В данной статье мы подробно рассмотрим, как реализовать такой механизм, основываясь на практическом опыте и примерах кода.
Принцип программного запуска внешней обработки, хранящейся в базе данных, включает несколько ключевых шагов. Прежде всего, нам необходимо получить ссылку на элемент справочника, где хранится наша обработка. Затем из этого элемента мы извлекаем бинарные данные самой обработки, сохраняем их во временный файл, и уже после этого создаем объект внешней обработки или отчета, с которым будем работать.
Давайте рассмотрим подробный пример кода, который демонстрирует программный запуск внешней обработки по её наименованию. Этот метод является наиболее прямым и часто используемым для выполнения основного модуля обработки или отчета.
Поиск ссылки на внешнюю обработку или отчет:
Первым делом нам необходимо найти элемент справочника "ВнешниеОбработки" по его наименованию. Мы используем метод НайтиПоНаименованию() для этого. Если обработка не найдена, следует уведомить пользователя или записать информацию в журнал регистрации.
СсылкаНаВнешнююОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяПоделки);
Если СсылкаНаВнешнююОбработку.Пустая() Тогда
ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Внешняя обработка по имени '"+ИмяПоделки+"' не найдена", УровеньЖурналаРегистрации.Предупреждение);
Возврат;
КонецЕсли;
Здесь ИмяПоделки — это строка, содержащая наименование внешней обработки, под которым она зарегистрирована в справочнике.
Определение типа обработки (отчет или обработка):
Важно различать, является ли сохраненный файл внешней обработкой или внешним отчетом, так как для их создания используются разные менеджеры (ВнешниеОбработки.Создать() и ВнешниеОтчеты.Создать()). Мы проверяем значение поля ВидОбработки элемента справочника.
ЭтоОбработка = СсылкаНаВнешнююОбработку.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка;
ЭтоОтчет = СсылкаНаВнешнююОбработку.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет;
Если НЕ (ЭтоОбработка ИЛИ ЭтоОтчет) Тогда
ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Внешняя обработка поимени '"+ИмяПоделки+"' не создана", УровеньЖурналаРегистрации.Предупреждение);
Возврат;
КонецЕсли;
Это обеспечивает корректное создание объекта на следующем шаге.
Извлечение двоичных данных и сохранение во временный файл:
Сама внешняя обработка хранится в справочнике в виде двоичных данных. Мы получаем эти данные из поля ХранилищеВнешнейОбработки и записываем их во временный файл на диске. Использование временного файла позволяет 1С работать с обработкой так, как будто она была открыта из обычного файла.
ИмяФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные = СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
Функция ПолучитьИмяВременногоФайла() генерирует уникальное имя файла, что помогает избежать конфликтов. Метод Записать(ИмяФайла) сохраняет двоичные данные в указанный файл.
Создание объекта внешней обработки/отчета:
Теперь, имея путь к временному файлу, мы можем создать программный объект внешней обработки или отчета, используя соответствующие менеджеры. Второй параметр ВнешниеОбработки.Создать() или ВнешниеОтчеты.Создать() (Ложь) указывает, что мы не хотим открывать форму обработки автоматически.
Если ЭтоОбработка Тогда
Обработка = ВнешниеОбработки.Создать(ИмяФайла,Ложь);
Иначе
Обработка = ВнешниеОтчеты.Создать(ИмяФайла,Ложь);
КонецЕсли;
Передача параметров и выполнение:
Если ваша внешняя обработка требует каких-либо входных параметров, вы можете передать их, присваивая значения свойствам созданного объекта обработки. В приведенном примере мы устанавливаем флаг мЗапускРегламентнымЗаданием и передаем Ключ.
Обработка.мЗапускРегламентнымЗаданием = Истина;
Если ЗначениеЗаполнено(Ключ) Тогда
Обработка.Ключ = Ключ;
КонецЕсли;
Обработка.ВыполнитьОбработку();
Метод Обработка.ВыполнитьОбработку() является стандартным экспортируемым методом внешней обработки, который выполняется при её запуске без открытия формы. Если вам нужно запустить другую экспортируемую процедуру, вы можете вызвать её по имени, например, Обработка.МояПроцедураЭкспортная().
Очистка временного файла:
После завершения работы с обработкой рекомендуется удалить временный файл, чтобы не засорять файловую систему. Это делается в блоке Попытка...Исключение, чтобы избежать прерывания работы программы в случае, если файл по какой-то причине не удалось удалить.
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
КонецПопытки;
Вот полный пример процедуры, демонстрирующей этот подход:
Процедура ЗапуститьФоновоеЗаданиеПоИмениИзСправочникаВнешиеОбработки(ИмяПоделки, Ключ = Неопределено) Экспорт
СсылкаНаВнешнююОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяПоделки);
Если СсылкаНаВнешнююОбработку.Пустая() Тогда
ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Внешняя обработка по имени '"+ИмяПоделки+"' не найдена", УровеньЖурналаРегистрации.Предупреждение);
Возврат;
КонецЕсли;
ЭтоОбработка = СсылкаНаВнешнююОбработку.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка;
ЭтоОтчет = СсылкаНаВнешнююОбработку.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет;
Если НЕ (ЭтоОбработка ИЛИ ЭтоОтчет) Тогда
ЗаписьЖурналаРегистрации("Регламентное задание. Внешняя обработка: ОШИБКА! Внешняя обработка по имени '"+ИмяПоделки+"' не является обработкой или отчетом", УровеньЖурналаРегистрации.Предупреждение);
Возврат;
КонецЕсли;
ИмяФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные = СсылкаНаВнешнююОбработку.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
Если ЭтоОбработка Тогда
Обработка = ВнешниеОбработки.Создать(ИмяФайла,Ложь);
Иначе
Обработка = ВнешниеОтчеты.Создать(ИмяФайла,Ложь);
КонецЕсли;
Обработка.мЗапускРегламентнымЗаданием = Истина;
Если ЗначениеЗаполнено(Ключ) Тогда
Обработка.Ключ = Ключ;
КонецЕсли;
Обработка.ВыполнитьОбработку();
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
КонецПопытки;
КонецПроцедуры
В некоторых случаях, вместо выполнения основного модуля обработки, нам может потребоваться программно открыть её форму. Это позволяет пользователю взаимодействовать с обработкой так, как если бы он запустил её вручную из файла или из списка внешних обработок. Для этого мы используем функцию ОткрытьФорму().
Сначала нам нужно создать объект внешней обработки, как мы это делали в Решении 1, но затем мы вызываем метод ОткрытьФорму(). Если в обработке есть несколько форм, мы можем указать конкретную форму, передав её имя. Если имя формы не указано, откроется основная форма обработки.
// ... (шаги 1-4 из предыдущего решения) ...
// После создания объекта Обработка:
// Обработка = ВнешниеОбработки.Создать(ИмяФайла,Ложь);
ОткрытьФорму(Обработка.ПолучитьФорму()); // Открытие основной формы
// Или для открытия именованной формы:
// ОткрытьФорму(Обработка.ПолучитьФорму("МояДополнительнаяФорма"));
Метод ПолучитьФорму() возвращает объект формы, который затем передается функции ОткрытьФорму(). Этот подход полезен, когда внешняя обработка предназначена для интерактивного взаимодействия с пользователем.
Для автоматизации рутинных операций в 1С:Предприятии 8, включая УТ10, внешние обработки часто используются в качестве регламентных заданий. Чтобы внешняя обработка могла быть запущена как регламентное задание, в её модуле должны присутствовать специальные экспортируемые процедуры:
СведенияОВнешнейОбработке() Экспорт:
Эта процедура возвращает структуру с метаданными о внешней обработке, которые используются системой 1С для её регистрации и настройки в регламентном задании. Важные параметры включают Наименование, Версия, Информация, и Вид.
Функция СведенияОВнешнейОбработке() Экспорт
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Наименование", "МояВнешняяОбработкаДляРегламента");
РегистрационныеДанные.Вставить("Версия", "1.0");
РегистрационныеДанные.Вставить("Информация", "Описание функционала обработки.");
// Для регламентного задания необходимо указать назначение.
// Примечание: УТ10 может не поддерживать такую гибкость, как УФ в 8.3
// Однако, для совместимости или более поздних версий можно указать:
// РегистрационныеДанные.Вставить("Назначение", Новый Массив(Тип("ДокументСсылка.ПоступлениеТоваровУслуг")));
// Или, если это чисто регламентное задание, которое не привязано к объекту,
// просто не указываем Назначение или указываем пустой массив.
Команды = Новый Массив;
Команда = Новый Структура;
Команда.Вставить("Представление", "Выполнить регламентное задание");
Команда.Вставить("Идентификатор", "ВыполнитьРегламентноеЗадание");
Команда.Вставить("Использование", "ВызовСерверногоМетода"); // Или "ОткрытиеФормы"
Команда.Вставить("Модификатор", ""); // Для УТ10 обычно не используется
Команды.Добавить(Команда);
РегистрационныеДанные.Вставить("Команды", Команды);
Возврат РегистрационныеДанные;
КонецФункции
ВыполнитьКоманду() Экспорт:
Эта процедура является точкой входа для выполнения регламентного задания. Она принимает параметр ИдентификаторКоманды, который соответствует Идентификатор, указанному в структуре, возвращаемой СведенияОВнешнейОбработке(). Внутри этой процедуры реализуется вся логика, которую должно выполнять регламентное задание.
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт
Если ИдентификаторКоманды = "ВыполнитьРегламентноеЗадание" Тогда
// Здесь размещаем основной код обработки, который должен выполняться по расписанию
ЗаписьЖурналаРегистрации("Регламентное задание: МояВнешняяОбработкаДляРегламента успешно запущена.", УровеньЖурналаРегистрации.Информация);
// Например, вызов основной функции обработки:
// ОбработатьДанные();
КонецЕсли;
КонецПроцедуры
После того как внешняя обработка с этими процедурами будет зарегистрирована в базе, её можно будет выбрать при создании нового регламентного задания, указав команду для выполнения.
Помимо основных методов программного запуска, существуют несколько важных аспектов и дополнительных возможностей, которые мы должны учитывать при работе с внешними обработками в 1С:Предприятии.
Хотя в данном обсуждении речь идет о 1С:Управление торговлей 10, которая чаще всего работает на платформах 1С:Предприятие 8.1 или 8.2 (с обычными формами), важно понимать, что для более новых версий платформы (8.2 и 8.3) и особенно в клиент-серверном режиме, подход к работе с файлами может отличаться. Пример кода, приведенный выше, с использованием ПолучитьИмяВременногоФайла() и ДвоичныеДанные.Записать(), прекрасно работает в файловом режиме или при клиентском вызове. Однако, если выполнение происходит на сервере в клиент-серверном варианте, прямое сохранение на диск клиента невозможно.
В таких случаях, особенно на управляемых формах (1С:Предприятие 8.3), внешняя обработка сначала помещается во временное хранилище на сервере с помощью функции ПоместитьФайл() на клиенте. Затем на сервере она подключается методом ВнешниеОбработки.Подключить() или ВнешниеОтчеты.Подключить() менеджера внешних обработок, который работает с идентификатором временного хранилища, а не с путем к локальному файлу.
// Пример для управляемых форм и клиент-серверного режима (для 8.3)
// На клиенте:
// ИмяФайлаОбработки = ПолучитьИмяВременногоФайла(".epf");
// ДвоичныеДанныеОбработки.Записать(ИмяФайлаОбработки);
// ИдентификаторХранилища = ПоместитьФайл(ИмяФайлаОбработки, ИмяФайлаОбработки, , Истина);
// На сервере (например, в экспортной функции):
// ОбработкаОбъект = ВнешниеОбработки.Подключить(ИдентификаторХранилища);
// ОбработкаОбъект.ВыполнитьОбработку();
// ВнешниеОбработки.Отключить(ИдентификаторХранилища);
Для УТ10 на обычных формах, показанный в Решении 1 метод является наиболее релевантным и рабочим.
Внешние обработки по умолчанию запускаются в безопасном режиме исполнения программного кода. Это означает, что некоторые действия, такие как прямой доступ к файловой системе (кроме временных файлов), запуск внешних приложений или доступ к некоторым объектам COM, могут быть ограничены или запрещены. Если вашей обработке требуются такие "опасные" операции, её необходимо запускать с отключенным безопасным режимом. Это возможно только для обработок, доверие к которым настроено в системе (обычно через добавление в "Дополнительные отчеты и обработки" с флагом "Использовать безопасный режим" выключенным) или при запуске из привилегированного кода.
Хотя наш основной вопрос касается программного запуска, стоит упомянуть, что внешние обработки можно добавить в конфигурацию через раздел "Администрирование" -> "Печатные формы, отчеты и обработки" (или аналогичный в УТ10). Это позволяет пользователям запускать их интерактивно из определенных разделов программы без необходимости каждый раз выбирать файл обработки с диска. При добавлении важно корректно указать "Назначение" обработки, чтобы она отображалась в нужном месте интерфейса (например, привязка к документам "Реализация товаров и услуг" или к справочнику "Номенклатура"). Этот способ упрощает доступ к обработкам для конечных пользователей, при этом сама обработка хранится в базе данных, аналогично элементам справочника "Внешние обработки". Для групповой загрузки файлов в этот справочник или их выгрузки на диск можно использовать обработку для выгрузки и загрузки внешних обработок в УТ 10.3 и УПП 1.3.
Система 1С:Предприятие поддерживает запуск внешних обработок через командную строку с использованием параметра /Execute. Этот метод удобен для интеграции 1С с другими системами, автоматического запуска в пакетном режиме или выполнения специфических задач без запуска графического интерфейса пользователя 1С. Для этого необходимо указать путь к исполняемому файлу платформы 1С, параметры подключения к базе, а затем параметр /Execute с полным путем к файлу внешней обработки.
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" ENTERPRISE /F"C:\Path\To\Your\Database" /N"Пользователь" /P"Пароль" /Execute"C:\Path\To\Your\ExternalProcessing.epf"
Параметр /Execute запускает указанную внешнюю обработку или отчет, выполняя её основной модуль. Это может быть очень полезно для скриптов автоматизации, когда требуется выполнение обработки без участия пользователя.
Программный запуск внешней обработки, зарегистрированной в справочнике 1С:УТ10, является мощным инструментом для автоматизации и расширения функциональности системы. Мы рассмотрели основные шаги, начиная от получения ссылки на обработку из справочника, извлечения её двоичных данных, сохранения во временный файл и заканчивая созданием объекта и выполнением его метода. Также мы обсудили важные нюансы, такие как различия в работе на разных версиях платформы, использование безопасного режима, способы открытия форм и возможности запуска через регламентные задания или командную строку.
Понимание этих механизмов позволит вам эффективно использовать внешние обработки для решения самых разнообразных задач в вашей работе с 1С:Предприятием.