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