Как программно отобразить количество присоединенных файлов в форме объекта 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с Библиотекой стандартных подсистем (БСП) в конфигурациях 1С часто возникает задача сделать интерфейс более информативным. Одной из таких задач является вывод количества прикрепленных файлов непосредственно в заголовок команды перехода к файлам. По умолчанию БСП выводит просто надпись «Файлы» или «Присоединенные файлы», что вынуждает пользователя делать лишний клик, чтобы проверить, прикреплено ли к документу или справочнику хоть что-то. В этой статье мы подробно разберем, как программно реализовать динамическое обновление этой надписи.

Анализ стандартного механизма БСП

Для начала проанализируем, как работает подсистема «Работа с файлами». В типовых конфигурациях (таких как БГУ, ERP или ЗУП) команда перехода к файлам обычно добавляется автоматически. Это происходит, когда тип вашего объекта включен в ОпределяемыйТип.ВладелецПрисоединенныхФайлов. После этого в панели навигации формы появляется стандартная команда.

Основная сложность заключается в том, что элементы панели навигации формы, формируемые платформой автоматически на основании командного интерфейса, не всегда легко поддаются изменению «на лету». Однако, начиная с определенных версий БСП (3.1.8 и выше), разработчики предусмотрели штатные механизмы для управления текстом этих команд. Если же вы работаете на более ранних версиях (например, 3.1.7, как в БГУ), нам потребуется реализовать механизм обновления заголовка вручную через обработчики событий формы.

Шаг 1: Получение количества файлов

Прежде чем что-то выводить, нам нужно научиться получать актуальное количество файлов, связанных с объектом. Мы настоятельно рекомендуем не писать прямые запросы к таблицам присоединенных файлов, так как БСП имеет встроенный API, учитывающий пометки на удаление и права доступа.

Рассмотрим функцию, которую мы разместим в модуле формы или в серверном общем модуле:


&НаСервере
Функция ПолучитьКоличествоФайловНаСервере(СсылкаНаОбъект)
    Если СсылкаНаОбъект.Пустая() Тогда
        Возврат 0;
    КонецЕсли;
    
    // Используем штатный метод БСП для подсчета файлов
    // В разных версиях БСП имя функции может незначительно отличаться
    Количество = ПрисоединенныеФайлы.КоличествоПрисоединенныхФайлов(СсылкаНаОбъект);
    Возврат Количество;
КонецФункции

Шаг 2: Обновление текста команды в интерфейсе

Теперь разберем, как изменить заголовок. Если команда добавлена в командную панель формы вручную как кнопка-гиперссылка, мы можем напрямую обращаться к свойству Заголовок. Если же мы используем стандартную команду панели навигации, нам может потребоваться процедура ПрисоединенныеФайлыКлиент.ОбновитьТекстКомандыПрисоединенныеФайлы.

Рассмотрим комплексный метод обновления, который можно вызывать из разных точек формы:


&НаСервере
Процедура ОбновитьЗаголовокФайловНаСервере()
    Количество = ПолучитьКоличествоФайловНаСервере(Объект.Ссылка);
    
    НовыйЗаголовок = "Файлы";
    Если Количество > 0 Тогда
        НовыйЗаголовок = СтрШаблон("%1 (%2)", НовыйЗаголовок, Количество);
    КонецЕсли;
    
    // Вариант 1: Если кнопка добавлена на форму вручную с именем "ГруппаПрисоединенныеФайлы"
    // Элементы.ФормаКомандаПрисоединенныеФайлы.Заголовок = НовыйЗаголовок;
    
    // Вариант 2: Использование программного интерфейса БСП (если доступно)
    ПараметрыКоманды = ПрисоединенныеФайлы.ПараметрыРаботыСФайлами(Объект.Ссылка);
    // Здесь логика взаимодействия с динамическим интерфейсом
КонецПроцедуры

Шаг 3: Определение точек актуализации данных

Проанализируем, в какие моменты нужно пересчитывать количество файлов. Если мы обновим цифру только при открытии, она станет неактуальной сразу после того, как пользователь добавит новый файл в открывшемся окне.

  1. ПриЧтенииНаСервере: Выполняем первичный расчет при открытии формы существующего объекта.
  2. ПослеЗаписи: Если объект был новым, файлы к нему можно прикрепить только после первой записи. В этот момент стоит обновить доступность команды и начальное количество (0).
  3. ОбработкаОповещения: Это ключевой момент. Когда пользователь закрывает форму списка присоединенных файлов, БСП рассылает оповещение.

Посмотрим на пример реализации ОбработкаОповещения на клиенте:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    // БСП посылает событие с определенным именем при изменении состава файлов
    Если ИмяСобытия = "ЗаписаныПрисоединенныеФайлы" И Источник = Объект.Ссылка Тогда
        ОбновитьКоличествоФайловИнтерфейсно();
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьКоличествоФайловИнтерфейсно()
    // Вызываем серверный метод для пересчета и обновления заголовка
    ОбновитьЗаголовокФайловНаСервере();
КонецПроцедуры

Особенности реализации для разных версий БСП

Выясним причину, по которой в некоторых конфигурациях (например, БГУ) текст в панели навигации не меняется просто так. В старых версиях БСП команда в панели навигации — это ОбщаяКоманда.ПрисоединенныеФайлы. Она статична. Чтобы обойти это ограничение, программисты часто прибегают к следующему приему:

1. Отключаем видимость стандартной команды в панели навигации (через командный интерфейс формы).
2. Создаем на форме свою команду с аналогичным действием (открытие формы файлов).
3. Размещаем её в верхней части формы (в группе заголовка) в виде гиперссылки. Это выглядит современно и позволяет нам полностью контролировать её заголовок через Элементы.МояКомандаФайлы.Заголовок.

Рассмотрим пример кода для открытия формы файлов из собственной команды:


&НаКлиенте
Процедура УправлениеФайлами(Команда)
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("ВладелецФайлов", Объект.Ссылка);
    ПараметрыОткрытия.Вставить("ReadOnly", Ложь);
    
    // Используем штатный метод открытия из модуля ПрисоединенныеФайлыКлиент
    ПрисоединенныеФайлыКлиент.ОткрытьПрисоединенныеФайлы(Объект.Ссылка, ЭтаФорма);
КонецПроцедуры

Оптимизация производительности

Важно помнить, что каждый вызов функции КоличествоПрисоединенныхФайлов — это дополнительный запрос к базе данных. Если форма объекта очень «тяжелая» или содержит много списков, лишние запросы могут замедлить работу. Рассмотрим рекомендации по оптимизации:

Таким образом, мы проанализировали основные подходы к решению задачи. В современных редакциях БСП старайтесь максимально использовать функции модуля ПрисоединенныеФайлыКлиент, которые автоматически умеют работать с текстом команд, если они зарегистрированы в системе должным образом. В более ранних версиях — используйте механизм ОбработкаОповещения в связке с собственной кнопкой-гиперссылкой для достижения наилучшего визуального результата.

← На главную