В процессе разработки на платформе «1С:Предприятие 8.3» часто возникает необходимость выполнить действие, которое уже описано в глобальной или параметризуемой команде, не заставляя пользователя нажимать на кнопку интерфейса. Это может быть полезно для автоматизации процессов, вызова специфических обработчиков или интеграции различных подсистем. Рассмотрим подробнее, как это можно реализовать, проанализируем возможные проблемы и выберем наиболее надежные методы.
Самый простой и быстрый способ «эмулировать» нажатие на кнопку глобальной команды — это использование метода ПерейтиПоНавигационнойСсылке(). Платформа 1С позволяет обращаться к командам через протокол e1cib.
Разберем синтаксис для различных типов команд. Если нам нужно вызвать общую команду, которая не привязана к конкретному объекту, мы используем следующий формат:
// Вызов общей команды по ее имени
ПерейтиПоНавигационнойСсылке("e1cib/command/ОбщаяКоманда.ИмяКоманды");
Если же команда является параметризуемой (например, команда справочника, которой нужно передать ссылку на конкретный элемент), структура ссылки усложняется. В этом случае нам необходимо передать параметр через префикс ?cmdprm=. Проанализируем пример вызова команды для конкретного контрагента:
// Пример вызова параметризуемой команды для справочника
// Здесь используется внутренняя строка ссылки (Тип и UUID)
ПерейтиПоНавигационнойСсылке("e1cib/command/Справочник.Контрагенты.Команда.ПечатьДоговора?cmdprm=СправочникСсылка.Контрагенты:a63bbcaec5e1325f11edb259cba3cf9e");
Важные нюансы метода:
&НаКлиенте). Попытка вызвать его на сервере приведет к ошибке, так как сервер не управляет интерфейсом пользователя.Зачастую программный вызов команды требуется из-за того, что логика бизнес-процесса «заперта» внутри модуля команды. Проанализируем ситуацию: если вам нужно вызывать один и тот же код из формы, из другой команды и еще программно, значит, этому коду не место в модуле команды. Рассмотрим, как провести рефакторинг правильно, используя готовые шаблоны и методики разработки.
Разберем по шагам реализацию по стандартам разработки (близко к БСП, для изучения которой пригодится специальный справочник по методам):
РаботаСКлиентамиСервер (с флагами «Сервер» и «Вызов сервера») для серверной логики и РаботаСКлиентамиКлиент (с флагом «Клиент») для клиентской логики.Посмотрим на пример реализации в общем модуле:
// В общем модуле (например, ОбщегоНазначенияКлиент)
Процедура ВыполнитьДействиеКоманды(ПараметрКоманды) Экспорт
// Здесь располагается логика, которая раньше была в модуле команды
Сообщить("Команда выполнена для: " + ПараметрКоманды);
КонецПроцедуры
Иногда разработчики сталкиваются с тем, что код команды использует объекты, доступные только в толстом клиенте (например, СхемаКомпоновкиДанных в определенных контекстах или специфические методы работы с файлами). Выясним причину, по которой обычные директивы препроцессора могут не помогать.
Если в модуле формы или команды просто объявлена переменная или использован конструктор типа, который не поддерживается тонким клиентом, модуль может не скомпилироваться целиком. В этом случае даже условие #Если ТолстыйКлиент внутри процедуры не спасет от критической ошибки при запуске под тонким клиентом.
Решение: Используйте динамическое выполнение кода через функцию Выполнить() или Вычислить() для тех участков, которые гарантированно должны запускаться только в определенной среде. Это позволит «спрятать» несовместимый синтаксис от компилятора тонкого клиента, а для веб-клиента существуют даже полноценные аналоги оператора «Выполнить».
#Если ТолстыйКлиентУправляемоеПриложение Тогда
// Платформа проверит синтаксис только в момент выполнения
Выполнить("Схема = Новый СхемаКомпоновкиДанных;");
#КонецЕсли
В ходе обсуждения часто возникает обратный вопрос: как из текстовой навигационной ссылки (например, полученной из почты или чата) получить полноценную ссылку на объект 1С (ПКО, Контрагент и т.д.)? Для автоматизации этого процесса есть обработка для автоматического распознавания навигационных ссылок 1С. Проанализируем алгоритм преобразования UUID, который используется во внутренних ссылках 1С.
Формат UUID в ссылке 1С отличается от стандартного представления GUID в системе. Рассмотрим функцию преобразования строки UUID из навигационной ссылки в стандартный УникальныйИдентификатор:
&НаСервере
Функция СсылкаИзНавигационнойСтроки(Знач ИсходныйUUID) Экспорт
// Очищаем строку от возможных префиксов, если передана полная ссылка
РабочийUUID = Прав(ИсходныйUUID, 32);
// Пересобираем сегменты (логика перестановки байтов 1С)
GUIDСтрокой = Сред(РабочийUUID, 17, 4) + Сред(РабочийUUID, 21, 4) +
Сред(РабочийUUID, 25, 4) + Сред(РабочийUUID, 29, 4) +
Лев(РабочийUUID, 8) + Сред(РабочийUUID, 9, 8);
// В современных версиях платформы формат может быть проще,
// но классический разбор выглядит так:
РезультатGUID = Прав(РабочийUUID, 8) + "-" +
Сред(РабочийUUID, 21, 4) + "-" +
Сред(РабочийUUID, 17, 4) + "-" +
Лев(РабочийUUID, 4) + "-" +
Сред(РабочийUUID, 5, 12);
Возврат Новый УникальныйИдентификатор(РезультатGUID);
КонецФункции
После получения УникальногоИдентификатора мы можем получить саму ссылку через менеджер соответствующего объекта:
СсылкаНаОбъект = Документы.ПриходныйКассовыйОрдер.ПолучитьСсылку(НашGUID);
Подведем итог: Если вам нужно быстро вызвать команду «как есть» из интерфейса — используйте ПерейтиПоНавигационнойСсылке. Если же вы проектируете надежную систему — выносите логику в общие модули. Это позволит избежать проблем с типами клиентов, упростит отладку и сделает код повторно используемым.