Мы, как разработчики на платформе 1С:Предприятие, часто сталкиваемся с необходимостью динамического отображения информации в интерфейсе наших решений. Одной из таких задач может быть изменение заголовка стандартной команды в панели навигации формы. Например, рассмотрим ситуацию, когда мы хотим, чтобы заголовок команды "Присоединенные файлы" динамически обновлялся, показывая актуальное количество прикрепленных файлов, как "Присоединенные файлы (1)". Давайте разберем, возможно ли это сделать напрямую средствами платформы и какие обходные пути существуют для достижения желаемого результата.
Прежде всего, давайте выясним, почему прямая задача по изменению заголовка стандартной команды в панели навигации может быть неосуществима или значительно затруднена.
Панель навигации как элемент интерфейса. Панель навигации, которая обычно располагается слева или сверху формы, является частью общего интерфейса клиентского приложения, а не непосредственно элементом текущей открытой формы документа или справочника. Ее команды формируются платформой на основе метаданных и настроек, а не являются прямыми элементами коллекции Элементы формы, к которым мы обычно имеем доступ.
Отсутствие прямого программного доступа. Как мы можем убедиться, просмотрев документацию и синтаксис-помощник, платформа 1С:Предприятие не предоставляет прямых методов или свойств для программного доступа и изменения заголовков стандартных команд, расположенных в панели навигации. Элементы формы, к которым мы имеем доступ через коллекцию Элементы, относятся к основной области формы, а не к элементам навигации, находящимся "за пределами" видимой формы с точки зрения программного интерфейса. Это подтверждается тем, что при попытке найти такие элементы в отладчике, мы обнаруживаем их отсутствие в стандартных коллекциях элементов формы, доступных для манипуляций.
Конфигуратор и пользовательские настройки. Команды панели навигации определяются в конфигураторе для каждого объекта (документа, справочника) или управляются через пользовательские настройки формы. Пользователь может изменить состав команд, добавить новые или изменить их порядок, но это изменение носит персональный характер и не может быть динамически управляемо программным кодом для всех пользователей одновременно с учетом текущего состояния объекта.
Таким образом, мы приходим к выводу, что напрямую изменить заголовок существующей стандартной команды в панели навигации средствами платформы не предусмотрено. Однако, это не означает, что мы не можем достичь нашей цели другим, обходным путем.
Наиболее эффективным и широко применяемым обходным путем для решения этой задачи является замена стандартной команды навигации на собственную, программно управляемую команду. Этот подход позволяет нам полностью контролировать заголовок, видимость и поведение команды. Рассмотрим этот процесс пошагово, используя пример с "Присоединенными файлами".
Первым шагом будет отключение стандартной команды "Присоединенные файлы" для нашего документа (или другого объекта), чтобы избежать дублирования и получить полный контроль над ее отображением. Мы выполним это в режиме конфигуратора.
Откройте форму документа (или объекта, например, справочника) в конфигураторе, для которого вы хотите изменить поведение команды.
Перейдите на закладку "Команды" в свойствах формы.
Найдите команду "Присоединенные файлы". Она обычно относится к стандартным командам платформы. Установите для нее свойство "Использование" в значение "Не использовать" или удалите ее из соответствующих групп панели навигации формы, если она там присутствует по умолчанию. Это гарантирует, что стандартная команда не будет отображаться.
Теперь создадим новую команду, которая будет выполнять функции стандартной команды и отображать динамический заголовок, который мы сможем программно изменять.
В конфигураторе, на закладке "Команды" вашей формы, нажмите кнопку "Добавить команду формы" (обычно имеет зелёный знак плюс). Это создаст новый элемент типа КомандаФормы.
Присвоим ей осмысленное имя, например, ПрисоединенныеФайлыДинамически.
Установим для нее свойство "Действие". Создайте новое клиентское процедурное действие, например, ОткрытьПрисоединенныеФайлы. Это будет процедура, которая будет вызываться при нажатии на нашу новую команду. Для простоты, пока оставим ее пустой; мы вернемся к ее реализации позже.
Установим для команды свойство "Представление" (это будет заголовок по умолчанию), например, "Присоединенные файлы".
Теперь нам нужно разместить эту новую команду в панели навигации формы, чтобы пользователь мог ее видеть и взаимодействовать с ней.
Перейдите на закладку "Элементы" формы в конфигураторе.
Найдите группу "ПанельНавигации" или "ВажныеКоманды", куда обычно помещаются ссылки на присоединенные файлы. Если такой группы нет или она вам не подходит, вы можете создать новую группу или добавить команду в существующую подходящую группу, например, в группу с другими стандартными командами.
Добавьте новый элемент формы типа "Кнопка" или "Гиперссылка" в желаемую группу. Дайте этому элементу осмысленное имя, например, ПрисоединенныеФайлыДинамическиЭлемент.
В свойствах этого нового элемента установите свойство "Команда" в созданную нами команду ПрисоединенныеФайлыДинамически. Заголовок этого элемента формы будет автоматически браться из свойства "Представление" команды, но, как мы помним, мы будем управлять им программно.
Для динамического изменения заголовка нам необходимо получить актуальное количество присоединенных файлов для текущего объекта. В большинстве современных конфигураций 1С для работы с файлами используется Библиотека Стандартных Подсистем (БСП). Давайте рассмотрим, как это сделать, ориентируясь на БСП, и предоставим альтернативный вариант.
Использование БСП. В БСП существуют специализированные функции для работы с присоединенными файлами. Если ваша конфигурация использует БСП (версии 3.0 и выше), обратите внимание на модуль РаботаСФайлами или РаботаСФайламиКлиентСервер. Часто встречается функция КоличествоПрисоединенныхФайловОбъекта(), которая возвращает количество файлов, присоединенных к указанному объекту.
Серверный вызов. Для вызова функций, работающих с данными (например, подсчет файлов из базы данных), нам потребуется серверный вызов. Рассмотрим пример серверной функции, которая возвращает количество файлов:
// В модуле формы или в общем модуле с директивой КомпилироватьНаСервере
// (На сервере)
Функция ПолучитьКоличествоПрисоединенныхФайловНаСервере(ОбъектСсылка) Экспорт
Перем КоличествоФайлов;
// Предполагается, что используется БСП.
// Необходимо убедиться, что модуль РаботаСФайламиКлиентСервер
// доступен в вашей конфигурации.
Попытка
КоличествоФайлов = РаботаСФайламиКлиентСервер.КоличествоПрисоединенныхФайловОбъекта(ОбъектСсылка);
Исключение
// Если БСП не используется или функция не найдена,
// можно реализовать альтернативный подсчет или вернуть 0.
// Например, запрос к регистру сведений "ПрисоединенныеФайлы" или аналогичному.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПрисоединенныеФайлы.Ссылка КАК Ссылка
|ИЗ
| РегистрСведений.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
|ГДЕ
| ПрисоединенныеФайлы.ВладелецФайла = &ВладелецФайла";
Запрос.УстановитьПараметр("ВладелецФайла", ОбъектСсылка);
РезультатЗапроса = Запрос.Выполнить();
КоличествоФайлов = РезультатЗапроса.Выгрузить().Количество();
// Возможно, потребуется дополнительная фильтрация по типу файла,
// если регистр "ПрисоединенныеФайлы" хранит не только файлы,
// но и другие данные или используется для разных типов вложений.
КонецПопытки;
Возврат КоличествоФайлов;
КонецФункции
Важно: Если вы не используете БСП или вышеуказанная функция недоступна, вам придется реализовать свою логику подсчета файлов, например, с помощью прямого запроса к соответствующему регистру сведений (если файлы хранятся в инфобазе) или через обращение к справочнику "Файлы", который связан с вашим объектом.
Теперь, когда у нас есть способ получить количество файлов, мы можем обновить заголовок нашей команды. Это действие должно выполняться при открытии формы и после любых операций, которые могут изменить количество присоединенных файлов (например, после добавления или удаления файла).
Обновление при создании формы. Разместим логику обновления заголовка в обработчике события ПриСозданииНаСервере для формы. Это обеспечит корректное отображение заголовка сразу при открытии формы.
// В модуле формы (НаСервере)
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызываем функцию для получения количества файлов
КоличествоФайлов = ПолучитьКоличествоПрисоединенныхФайловНаСервере(Объект.Ссылка);
// Вызываем клиентскую процедуру для обновления заголовка
ОбновитьЗаголовокКомандыПрисоединенныеФайлы(КоличествоФайлов);
КонецПроцедуры
Клиентская процедура обновления заголовка. Реализуем клиентскую процедуру, которая будет формировать заголовок и устанавливать его для нашего элемента формы.
// В модуле формы (НаКлиенте)
Процедура ОбновитьЗаголовокКомандыПрисоединенныеФайлы(КоличествоФайлов)
Заголовок = "Присоединенные файлы";
Если КоличествоФайлов > 0 Тогда
Заголовок = Заголовок + " (" + КоличествоФайлов + ")";
КонецЕсли;
// Устанавливаем заголовок для нашего элемента формы.
// Предполагается, что элементу на форме (Кнопка/Гиперссылка)
// мы дали имя "ПрисоединенныеФайлыДинамическиЭлемент".
Если Элементы.Найти("ПрисоединенныеФайлыДинамическиЭлемент") Тогда
Элементы.ПрисоединенныеФайлыДинамическиЭлемент.Заголовок = Заголовок;
Иначе
// Если команда добавлена как команда формы и не как элемент навигации,
// то изменение Представления команды формы также повлияет на ее отображение
// при условии, что она не имеет явно заданного заголовка в элементе.
Команды.ПрисоединенныеФайлыДинамически.Представление = Заголовок;
КонецЕсли;
КонецПроцедуры
Обратите внимание, что для обновления заголовка элемента, который вызывает команду, мы обращаемся к свойству Заголовок этого элемента. Если же мы хотим изменить само представление команды формы (КомандаФормы), то это делается через свойство Представление самой команды. В управляемых формах заголовок кнопки/гиперссылки, привязанной к команде, может быть изменен независимо от Представления команды. Однако, если элемент формы не имеет явно заданного заголовка, он будет брать его из Представления команды. В нашем случае, для динамического изменения, проще управлять заголовком элемента формы, к которому привязана команда.
Реализация действия команды. Теперь реализуем клиентскую процедуру ОткрытьПрисоединенныеФайлы, которая будет вызываться при нажатии на нашу новую команду. Эта процедура должна открывать форму списка присоединенных файлов, аналогично стандартной команде.
// В модуле формы (НаКлиенте) - Действие команды ПрисоединенныеФайлыДинамически
Процедура ОткрытьПрисоединенныеФайлы(Команда)
// Здесь реализуем логику открытия формы списка присоединенных файлов.
// Это также можно сделать с использованием БСП.
// Пример вызова формы работы с файлами из БСП:
// РаботаСФайламиКлиент.ОткрытьФормуПрисоединенныхФайлов(Объект.Ссылка);
// Если БСП не используется, то нужно будет открыть свою форму или
// создать обработку для отображения файлов.
РаботаСФайламиКлиент.ОткрытьФормуПрисоединенныхФайлов(Объект.Ссылка);
// После закрытия формы присоединенных файлов, возможно, потребуется обновить
// заголовок снова, так как количество файлов могло измениться.
// Это можно сделать, подписавшись на событие "ПриЗакрытии" формы файлов
// или просто обновив заголовок после открытия/закрытия формы.
// Вызовем асинхронно, чтобы не блокировать интерфейс:
ПодключитьОбработчикОжидания("ОбновитьЗаголовокПослеРаботыСФайлами", 0.1, Истина);
КонецПроцедуры
// В модуле формы (НаКлиенте)
Процедура ОбновитьЗаголовокПослеРаботыСФайлами()
// Отключаем обработчик ожидания
ОтключитьОбработчикОжидания("ОбновитьЗаголовокПослеРаботыСФайлами");
// Повторно получаем количество файлов и обновляем заголовок
КоличествоФайлов = ПолучитьКоличествоПрисоединенныхФайловНаСервере(Объект.Ссылка);
ОбновитьЗаголовокКомандыПрисоединенныеФайлы(КоличествоФайлов);
КонецПроцедуры
Для корректной работы важно также реализовать обновление заголовка не только при создании формы, но и после любых действий, которые могут повлиять на количество присоединенных файлов. Например, после того как пользователь закрыл форму присоединенных файлов, где он мог добавить или удалить файлы. Использование обработчика ожидания или подписки на уведомления об изменении данных (если есть) поможет нам в этом.
Мы также можем рассмотреть другие механизмы платформы, которые могли бы показаться подходящими для решения этой задачи, но выясним, почему они не решают ее напрямую.
ПредставлениеНавигационнойСсылкиМеханизм ПредставлениеНавигационнойСсылки используется для формирования текстового представления навигационной ссылки на объект. Это представление может быть использовано, например, для отображения в списке последних открытых объектов или при формировании гиперссылки для передачи куда-либо. Он позволяет передавать дополнительные параметры и влиять на то, как ссылка будет выглядеть, если ее передать или отобразить вне контекста основной панели навигации.
Однако, этот механизм не служит для прямого изменения заголовка команд в самой панели навигации формы. Он не предоставляет способ динамически управлять текстом стандартных команд, которые являются частью статической структуры формы или групп навигации. Он больше связан с представлением объектов, а не с элементами управления интерфейсом.
Если команда в панели навигации фактически является динамическим списком (например, ссылка на связанные объекты, которые отображаются в отдельном списке при нажатии), то его текст запроса или настройки могут быть программно изменены для фильтрации или изменения отображаемых данных.
Однако, этот подход относится к содержимому, отображаемому по команде (то есть к данным в списке), а не к заголовку самой команды в панели навигации. Таким образом, этот подход также не решает задачу изменения текста заголовка команды.
В ходе нашего анализа мы выяснили, что платформа 1С:Предприятие 8.3 не предоставляет прямого программного интерфейса для изменения заголовков стандартных команд в панели навигации. Однако, мы можем успешно достичь нашей цели, используя подход с заменой стандартной команды на пользовательскую. Этот метод дает нам полный контроль над заголовком, поведением и видимостью команды, позволяя отображать динамическую информацию, такую как количество присоединенных файлов.
Этот подход является гибким и позволяет интегрировать необходимую логику подсчета файлов, в том числе с использованием функционала Библиотеки Стандартных Подсистем (БСП), что делает его надежным решением для подобного рода задач в управляемых формах. Применяя этот метод, мы создаем более информативный и адаптивный интерфейс для наших пользователей, повышая удобство использования системы.