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