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