При обновлении платформы 1С:Предприятие до актуальных версий (8.3.15, 8.3.17 и выше) пользователи старых или сильно кастомизированных конфигураций (например, на базе «Бухгалтерия предприятия 2.0») часто сталкиваются с неприятной проблемой. При нажатии на привычные гиперссылки в формах, такие как «оформить приказ о приеме на работу», программа выдает лаконичную, но блокирующую работу ошибку: «Неизвестная команда: ». При этом отладчик может не фиксировать точку остановки, так как сбой происходит на уровне взаимодействия платформы и встроенного браузера.
В этой статье мы подробно разберем, почему это происходит, как найти проблемный участок кода и какими способами можно вернуть работоспособность привычному функционалу. Давайте приступим к совместному анализу ситуации.
Основная причина кроется в архитектурных изменениях самой платформы 1С. Начиная с версии 8.3.14, компания 1С изменила встроенный движок для отображения HTML-документов в формах. Если раньше в ОС Windows для этих целей использовались компоненты Internet Explorer, то теперь используется движок на базе Chromium (или WebKit).
Многие старые конфигурации используют так называемые Поля HTML-документа для создания красивых интерактивных интерфейсов. Ссылка «оформить приказ» внутри такой формы — это не обычная кнопка 1С, а фрагмент HTML-кода с тегом <a>. Новый движок гораздо строже относится к синтаксису навигационных ссылок и обработке событий JavaScript. Если ссылка сформирована некорректно или использует устаревший протокол взаимодействия с формой 1С, платформа не может сопоставить это нажатие с конкретным действием в коде, выдавая ошибку «Неизвестная команда».
Поскольку отладка фоновых заданий и обычный дебаггинг не всегда помогают поймать момент нажатия в HTML-поле, нам придется действовать аналитическим путем. Разберем по шагам, где искать код:
Сотрудники или ФизическиеЛица (в зависимости от того, в какой форме вы нажимаете кнопку).ПолеИнформации, ИнфоПанель или просто ПолеHTML.Теперь нам нужно понять, какой именно URL или команда зашита в эту ссылку. Перейдем в модуль формы и проанализируем процедуру ПриОткрытии() или ПередОткрытием(). Также стоит обратить внимание на обработчик ПриЧтенииНаСервере() (если форма управляемая).
Ищите фрагмент кода, где переменной присваивается длинная строка текста с HTML-тегами. Это может выглядеть примерно так:
ТекстHTML = ТекстHTML + "<a href=""e1cib/command/Документ.ПриемНаРаботуВОрганизацию.Создать?ДанныеЗаполнения=" + СсылкаНаОбъект + """>оформить приказ о приеме на работу</a>";
ЭлементыФормы.ПолеИнформации.УстановитьТекст(ТекстHTML);
Проанализируем эту ситуацию: в старых версиях платформы такие прямые навигационные ссылки e1cib/command/... могли обрабатываться автоматически. В новых версиях, если формат ссылки не соответствует строгому стандарту или если в конфигурации используется режим совместимости с версиями 8.2 или 8.3.10, возникает конфликт интерпретации.
Самый надежный способ решить проблему — перехватить нажатие на ссылку средствами 1С и выполнить команду открытия формы программно. Для этого выполним следующие действия:
ПриНажатии (или onclick для некоторых версий) и создадим обработчик.Рассмотрим пример кода, который позволит избежать ошибки «Неизвестная команда»:
Процедура ПолеИнформацииПриНажатии(Элемент, ДанныеСобытия)
// Отменяем стандартную обработку ссылки платформой
ДанныеСобытия.СтандартнаяОбработка = Ложь;
// Проверяем, содержит ли ссылка нужную нам команду
Если Найти(ДанныеСобытия.Href, "ПриемНаРаботу") > 0 Тогда
// Программно открываем форму нового документа
ПараметрыЗаполнения = Новый Структура("ФизЛицо, Организация", Объект.Ссылка, Объект.Организация);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("Документ.ПриемНаРаботуВОрганизацию.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
Важный момент: Установка свойства СтандартнаяОбработка = Ложь критически важна. Она говорит платформе: «Не пытайся сама перейти по этой ссылке, я всё сделаю вручную в коде 1С». Это предотвратит появление окна с ошибкой.
Если код формирования HTML слишком запутанный (что часто бывает в кастомных решениях вроде AzStandart), рассмотрим альтернативный вариант. Вместо того чтобы мучаться с отладкой HTML-движка, мы можем добавить обычную кнопку 1С прямо на форму.
Разберем, почему это часто лучше:
Для реализации просто добавьте на форму кнопку с заголовком «Оформить прием», а в её обработчике пропишите создание документа через ЗаполнитьЗначенияСвойств() или передачу параметров в ОткрытьФорму().
Проанализируем ситуацию с настройками самой конфигурации. Если ваша база основана на старой «Бухгалтерии 2.0», у неё в корне конфигурации наверняка установлен «Режим совместимости» (например, 8.2.13 или 8.3.10).
Попробуйте выполнить следующие действия в тестовой базе:
Внимание! Это может привести к изменению поведения других механизмов (запросы, формы), поэтому данный метод требует полного тестирования всей системы. Однако часто именно «подъем» режима совместимости заставляет новый движок Chromium корректно понимать старые команды 1С.
Ошибка «Неизвестная команда» при работе с HTML-полями в 1С 8.3.17 — это следствие эволюции платформы. Чтобы её устранить, нам нужно либо нормализовать обработку навигационных ссылок через событие ПриНажатии, либо отказаться от использования гиперссылок внутри HTML в пользу стандартных элементов управления 1С. Мы рекомендуем второй путь как наиболее надежный для долгосрочной эксплуатации системы.