В процессе разработки интерфейсов на платформе 1С:Предприятие 8.3 (интерфейс «Такси») программисты часто сталкиваются с неприятным визуальным эффектом: при нажатии на флажки или кнопки, которые управляют видимостью других элементов формы, изображение в поле картинки внезапно исчезает или «очищается». На первый взгляд это кажется программным сбоем или особенностью перерисовки интерфейса, но на самом деле причина кроется в механизме работы платформы с временным хранилищем и контекстными вызовами сервера.
В данной статье мы подробно разберем, почему так происходит, как работает жизненный цикл данных формы и что нужно сделать, чтобы картинка оставалась на месте при любых манипуляциях с элементами управления.
Разберем ситуацию: когда вы программно меняете свойство Видимость для какой-либо группы или поля, платформа часто инициирует серверный вызов для пересчета состояния формы и ее корректного отображения на клиенте. В этот момент происходит передача данных между клиентом и сервером.
Если картинка была помещена во временное хранилище без указания связи с конкретной формой, адрес этой картинки (навигационная ссылка) становится невалидным сразу после завершения серверного вызова. Платформа «считает», что данные больше не нужны, и очищает их. Когда форма возвращается на клиент, поле картинки обращается по старому адресу, не находит там данных и отображается пустым.
Это самый важный и эффективный метод. Чтобы данные во временном хранилище «жили» до тех пор, пока открыта ваша форма, необходимо передать второй параметр в функцию ПоместитьВоВременноеХранилище. Этим параметром выступает УникальныйИдентификатор текущей формы.
Рассмотрим по шагам, как это реализовать правильно. Предположим, у нас есть двоичные данные картинки, которые мы хотим вывести на форму.
Проанализируем пример кода:
&НаСервере
Процедура УстановитьКартинкуНаФорму(ДвоичныеДанныеКартинки)
// ОШИБОЧНЫЙ ВАРИАНТ:
// Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки);
// Такой адрес пропадет при первом же изменении видимости элементов!
// ПРАВИЛЬНЫЙ ВАРИАНТ:
// Привязываем данные к идентификатору формы
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, ЭтаФорма.УникальныйИдентификатор);
// АдресКартинки — это реквизит формы типа "Строка"
// В свойствах элемента "Поле картинки" в "Путь к данным" указан этот реквизит
КонецПроцедуры
В данном случае, указывая ЭтаФорма.УникальныйИдентификатор, мы сообщаем платформе: «Храни эти данные в памяти сервера до тех пор, пока эта форма не будет закрыта». Теперь любые манипуляции с видимостью, вызывающие серверные события, не приведут к потере картинки.
Выясним еще одну важную деталь. Никогда не устанавливайте картинку напрямую в элемент формы через программное обращение к свойствам отображения (например, через прямое присвоение в Элементы.ПолеКартинки.Картинка), если данные динамические. Правильный подход — использование Пути к данным.
АдресКартинки и типом Строка.АдресКартинки.АдресКартинки = ПолучитьНавигационнуюСсылку(...); или результат функции ПоместитьВоВременноеХранилище.Посмотрим на пример того, как это работает в связке с изменением видимости:
&НаКлиенте
Процедура УстановитьВидимостьПриНажатии(Команда)
// Изменяем видимость группы, что может вызвать серверный вызов
Элементы.ГруппаДополнительно.Видимость = Не Элементы.ГруппаДополнительно.Видимость;
// Если АдресКартинки был помещен в хранилище с Идентификатором формы,
// картинка НЕ пропадет, так как реквизит формы сохранит свое значение,
// а временное хранилище не будет очищено.
КонецПроцедуры
Если ваша картинка — это статичная иконка, логотип компании или декоративный элемент, который не меняется в зависимости от данных объекта, рассмотрим более простой вариант. Вместо использования временного хранилища, добавьте картинку в конфигурацию как объект Картинка (в дереве метаданных) или используйте стандартную Библиотеку картинок.
В этом случае в свойствах элемента формы «Поле картинки» вы просто выбираете нужную картинку из библиотеки. Такие изображения жестко «вшиты» в интерфейс и не зависят от состояния временного хранилища или контекстных вызовов сервера. Это гарантирует 100% стабильность отображения при любых манипуляциях с формой.
Проанализируем ситуацию, когда форма может «перечитываться» целиком, например, после выполнения команды Записать() или вызова метода Прочитать(). В этих случаях состояние реквизитов формы может сброситься, если они не связаны с данными объекта.
Если вы храните картинку в реквизите объекта (например, в справочнике), то при перечитывании данных адрес во временном хранилище может потребоваться обновить. Рекомендуется размещать код инициализации картинки в процедуре ПриЧтенииНаСервере или ПриСозданииНаСервере. Это обеспечит актуальность ссылки на данные при каждом обновлении формы.
Подводя итог, выделим основные правила, которые помогут избежать исчезновения изображений:
ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор). Без этого ссылка «протухнет» при первом же обращении к серверу.Следуя этим правилам, вы создадите надежный и стабильный интерфейс, который будет корректно реагировать на любые действия пользователя в режиме «Такси».