Как сохранить и восстановить ПолеТабличногоДокумента на управляемой форме 1С?

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

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

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

Основные ошибки при работе с хранилищем значения в управляемых формах

Прежде чем перейти к правильному коду, проанализируем типичные ошибки, с которыми сталкиваются разработчики:

  1. Передача элемента формы вместо данных. Попытка поместить в ХранилищеЗначения элемент формы (Элементы.ПолеТабличногоДокумента) приводит к ошибке сериализации. Серверный контекст работает только с реквизитами формы или объекта, но не с визуальными элементами графического интерфейса.
  2. Использование метода Вывести() без очистки. Метод Вывести() добавляет новые области к существующему документу. Если вызывать его при каждом прочтении без предварительной очистки, данные будут дублироваться.
  3. Забытые обработчики событий. Процедуры ПередЗаписьюНаСервере и ПриЧтенииНаСервере должны быть явно назначены в свойствах формы в качестве обработчиков соответствующих событий. В противном случае код не будет вызываться платформой.

Пошаговый алгоритм решения задачи

Рассмотрим порядок действий для настройки правильного сохранения и восстановления табличного документа:

  1. Создание реквизита объекта: Добавим у документа реквизит (например, ХранилищеДанных) с типом ХранилищеЗначения.
  2. Создание реквизита формы: На форме документа добавим реквизит (например, ПолеТабличногоДокументаСтраница1) с типом ТабличныйДокумент и перетащим его в элементы формы.
  3. Сохранение данных перед записью: В обработчике события формы ПередЗаписьюНаСервере поместим табличный документ из реквизита формы в реквизит объекта через Новый ХранилищеЗначения.
  4. Чтение данных при открытии: В обработчике события формы ПриЧтенииНаСервере извлечем табличный документ из реквизита объекта методом Получить() и присвоим его реквизиту формы.

Пример программного кода

Посмотрим на практическую реализацию серверных процедур в модуле управляемой формы:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Помещаем реквизит формы с типом ТабличныйДокумент в реквизит объекта ХранилищеЗначения.
    // Для оптимизации размера базы данных рекомендуем использовать сжатие данных.
    ТекущийОбъект.ХранилищеДанных = Новый ХранилищеЗначения(ПолеТабличногоДокументаСтраница1, Новый СжатиеДанных(9));

КонецПроцедуры

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

КонецПроцедуры

Важные рекомендации по работе с Хранилищем Значения

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

← На главную