Как обновить список присоединенных файлов на форме в 1С:Документооборот

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

При разработке дополнительных обработок для конфигурации 1С:Документооборот разработчики часто сталкиваются с ситуацией: кнопка внешней обработки успешно удаляет или обрабатывает файлы документа на сервере, но на форме сам список файлов остается неизменным. Пользователю приходится закрывать и снова открывать карточку документа или нажимать клавишу F5 для полного перечитывания данных.

В этой статье мы подробно разберем причинно-следственные связи этой проблемы и проанализируем проверенные способы ее решения без изменения основной конфигурации.

Выясним причину: почему стандартные методы не обновляют файлы

Чтобы понять, почему методы Прочитать() или ОбновитьОтображениеДанных() не дают нужного результата, проанализируем архитектуру хранения данных в конфигурации:

  1. Хранение в подчинённых справочниках: Присоединенные файлы в 1С:Документооборот не являются реквизитами или табличными частями самого объекта ВнутреннийДокумент. Они хранятся в отдельном справочнике (например, ВнутренниеДокументыПрисоединенныеФайлы).
  2. Особенности метода Прочитать(): Данный метод перечитывает из базы только сам объект-владелец. Поскольку таблица или дерево файлов формируются динамически или через динамический список, чтение основного объекта не заставляет форму перечитывать подчинённый справочник.
  3. Ограничения ОбновитьОтображениеДанных(): Метод ОбновитьОтображениеДанных() лишь визуально перерисовывает элементы формы на клиенте с учетом уже имеющихся данных в контексте. Он не делает повторных запросов к базе данных и не выполняет код заполнения списков.
  4. Контекст внешней обработки: Вызов ЭтаФорма внутри кода внешней обработки ссылается на форму самой обработки, а не на форму документа, из которой она была вызвана.

Шаг 1. Обращение к форме документа через ВладелецФормы

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


// Обращаемся к форме внутреннего документа из формы внешней обработки
ФормаДокумента = ЭтаФорма.ВладелецФормы;
Если ФормаДокумента <> Неопределено Тогда
    // Далее вызываем методы обновления для формы-владельца
КонецЕсли;

Шаг 2. Использование механизма оповещений платформы

Если список файлов выведен на форме с помощью динамического списка, самым эффективным решением является оповещение платформы об изменении элементов справочника присоединенных файлов. В этом случае платформа 1С самостоятельно перечитает динамический список на клиенте.

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


// Оповещение платформы об изменении конкретного файла
ОповеститьОбИзменении(СсылкаНаУдаленныйФайл);

// Или оповещение об изменении всего справочника присоединенных файлов
ОповеститьОбИзменении(Тип("СправочникСсылка.ВнутренниеДокументыПрисоединенныеФайлы"));

Шаг 3. Генерирование событий Библиотеки Стандартных Подсистем (БСП)

Формы карточек документов в 1С:Документооборот подписываются на события библиотеки работы с файлами. В ОбработкеОповещения формы описаны сценарии реакции на изменение присоединенных файлов.

Посмотрим, как отправить глобальное оповещение БСП с клиента после выполнения серверной процедуры удаления:


// Формируем параметры оповещения для подсистемы работы с файлами
ПараметрыОповещения = Новый Структура;
ПараметрыОповещения.Вставить("Удаление", Истина);

// Отправляем оповещение, которое перехватит открытая форма документа
Оповестить("Запись_ПрисоединенныеФайлы", ПараметрыОповещения, СсылкаНаФайл);

Шаг 4. Прямое обновление элемента формы или процедур формы

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


ФормаДокумента = ЭтаФорма.ВладелецФормы;
Если ФормаДокумента <> Неопределено Тогда
    // Обновляем конкретный элемент управления (динамический список)
    ФормаДокумента.Элементы.СписокФайлов.Обновить();
КонецЕсли;

В случаях, когда список файлов заполняется экспортируемой процедурой формы (например, ЗаполнитьСписокФайлов()), её также можно вызвать через контекст владельца формы, если эта процедура объявлена с ключевым словом Экспорт.

Резюме

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

  1. Выполнять операции по изменению и удалению файлов на сервере.
  2. После возврата управления на клиент обращаться к форме-источнику через ЭтаФорма.ВладелецФормы.
  3. Использовать вызов ОповеститьОбИзменении() или системное оповещение БСП Оповестить("Запись_ПрисоединенныеФайлы", ...), чтобы форма документа автоматически обновила отображение файлов из базы данных.
← На главную