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