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

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

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

Выясним причину проблемы: почему обработка запускается сразу?

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

Если в таблице команд зарегистрирована только одна команда с типом использования ВызовСерверногоМетода, система воспринимает эту обработку исключительно как фоновый инструмент. При ручном открытии такой обработки в интерфейсе БСП сразу же пытается запустить выполнение серверного метода из процедуры ВыполнитьКоманду() в модуле объекта. Интерактивная управляемая форма обработки при этом игнорируется и не выводится на экран.

Чтобы решить эту проблему, нам необходимо разделить сценарии использования обработки. Для этого мы зарегистрируем две разные команды: одну для автоматического регламентного обмена (без показа формы), вторую — для ручного запуска (с открытием формы).

Разберем по шагам реализацию универсальной внешней обработки

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

Шаг 1. Модернизация функции регистрации в модуле объекта

Отредактируем экспортную функцию СведенияОВнешнейОбработке(). Добавим в нее регистрацию двух команд с разными вариантами использования:


Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = Новый Структура;
    ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
    ПараметрыРегистрации.Вставить("Наименование", "Интеграция с сервером (авто + ручной режим)");
    ПараметрыРегистрации.Вставить("Версия", "1.1");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    ПараметрыРегистрации.Вставить("Информация", "Обработка для автоматического и ручного обмена данными.");
    ПараметрыРегистрации.Вставить("ВерсияБСП", "2.1.3.1"); // Укажите актуальную версию БСП вашей конфигурации
    
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Команда №1: Для работы по расписанию (в фоне на сервере)
    ДобавитьКоманду(ТаблицаКоманд,
                    "Выполнить обмен (автоматически)", 
                    "ВыполнитьОбменАвто", 
                    "ВызовСерверногоМетода", 
                    Ложь);
                    
    // Команда №2: Для ручного запуска пользователем (открывает форму)
    ДобавитьКоманду(ТаблицаКоманд,
                    "Открыть панель обмена (вручную)", 
                    "ОткрытьПанельРучногоОбмена", 
                    "ОткрытиеФормы", 
                    Ложь);
                    
    ПараметрыРегистрации.Вставить("Команды", TablicaKomand);
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Вспомогательные процедуры заполнения таблицы команд оставляем стандартными:


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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

Шаг 2. Разделение логики выполнения в модуле объекта

Теперь настроим обработчик выполнения команд ВыполнитьКоманду(). Обратите внимание, что здесь мы будем реагировать только на команду автоматического выполнения. Команда с типом ОткрытиеФормы будет обрабатываться платформой автоматически — она просто откроет основную форму нашей обработки.

Чтобы избежать дублирования программного кода, всю основную бизнес-логику (выгрузку и загрузку данных) мы вынесем в отдельную экспортную процедуру ВыполнитьОбменДанными().


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    
    Если ИдентификаторКоманды = "ВыполнитьОбменАвто" Тогда
        // Запуск логики обмена в фоновом режиме
        ВыполнитьОбменДанными();
    КонецЕсли;
    
КонецПроцедуры

Процедура ВыполнитьОбменДанными() Экспорт
    
    // Здесь располагается основная логика вашего обмена
    // Например:
    // ВыгрузитьДокументыНаСервер();
    // ЗагрузитьОтветыССервера();
    
КонецПроцедуры

Шаг 3. Реализация интерактивного интерфейса в модуле формы

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

В модуле формы пропишем вызов общего алгоритма обмена, который расположен в модуле объекта нашей обработки:


&НаКлиенте
Процедура ВыполнитьОбменВручную(Команда)
    
    ПоказатьОповещениеПользователя("Обмен данными",, "Запущен ручной обмен данными с сервером...", БиблиотекаКартинок.Информация32);
    
    // Вызываем серверный метод формы для работы с объектом обработки
    ВыполнитьОбменНаСервере();
    
    ПоказатьОповещениеПользователя("Обмен данными",, "Обмен успешно завершен!", БиблиотекаКартинок.Успешно32);
    
КонецПроцедуры

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

Проанализируем преимущества такого подхода

Реализованная архитектура решает сразу несколько важных задач:

  1. Отсутствие дублирования кода: Весь сложный функционал обмена написан один раз в модуле объекта и одинаково доступен как серверному регламентному заданию, так и интерактивной форме пользователя.
  2. Гибкость настройки: В справочнике «Дополнительные отчеты и обработки» администратор системы теперь увидит две команды. Команду автоматического обмена он сможет настроить на запуск по расписанию (например, каждую ночь в 03:00), а команду открытия формы — разместить в удобном разделе интерфейса (например, в меню «Продажи» или «Сервис») для быстрого доступа менеджеров.
  3. Простота поддержки: При обновлении логики взаимодействия с внешним сервером программисту достаточно внести изменения только в одну процедуру ВыполнитьОбменДанными().

Важные нюансы при работе кода на стороне сервера

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

← На главную