Как отобразить табличную часть документа на произвольной управляемой форме в 1С 8.3?

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

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

Рассмотрим, почему стандартный ДинамическийСписок или создание ручных таблиц значений — не всегда лучшее решение, и проанализируем наиболее эффективные способы выполнения этой задачи.

Почему динамический список не подходит для отображения и редактирования ТЧ документа

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

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

Способ 1. Назначение реквизита формы с типом ДокументОбъект основным реквизитом (Рекомендуемый подход)

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

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

  1. Откроем произвольную форму (например, Форма3) в конфигураторе.
  2. На вкладке Реквизиты создадим новый реквизит формы (например, Объект).
  3. В поле Тип укажем тип соответствующего документа: ДокументОбъект.<ИмяДокумента>.
  4. Установим для созданного реквизита флаг Основной реквизит (в дереве реквизитов он выделится жирным шрифтом).
  5. Развернем структуру созданного реквизита, найдем нужную табличную часть и перетащим ее мышью в левую панель элементов формы. Платформа автоматически создаст элемент управления типа ТаблицаФормы со всеми колонками.

Теперь рассмотрим, как правильно вызвать эту форму из контекста приложения. Чтобы платформа автоматически заполнила форму данными нужного документа, при вызове метода ОткрытьФорму необходимо передать структуру параметров с ключом Ключ, содержащим ссылку на документ:


ПараметрыОткрытия = Новый Структура("Ключ", СсылкаНаДокумент);
ОткрытьФорму("Документ.ИмяДокумента.Форма.Форма3", ПараметрыОткрытия);

Важное замечание: При вызове формы таким способом платформа загрузит состояние объекта из базы данных. Если в исходной форме документа данные были изменены, но документ не был записан, произвольная форма отобразит данные из БД.

Способ 2. Передача табличной части без использования основного реквизита (Для временных диалогов)

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

Пошаговый алгоритм реализации:

  1. На произвольной форме создаем реквизит с типом ТаблицаЗначений и воспроизводим колонки табличной части. Выводим таблицу на форму.
  2. При открытии формы помещаем табличную часть во временное хранилище или передаем через параметры формы.
  3. В обработчике ПриСозданииНаСервере заполняем коллекцию формы с помощью функции ЗначениеВРеквизитФормы().

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ТаблицаДанных = Параметры.АдресХранилищаТаблицы; // Получаем ТЧ
    ЗначениеВРеквизитФормы(ТаблицаДанных, "ИмяРеквизитаТаблицыНаФорме");
КонецПроцедуры

После завершения редактирования измененные данные передаются обратно в вызывающую форму через метод ОповеститьОВыборе() и обрабатываются в событии ОбработкаВыбора исходной формы.

Для преобразования данных реквизита формы обратно в прикладной тип ТаблицаЗначений на сервере используется обратная функция:


&НаСервере
Функция ПолучитьТаблицуИзФормы()
    Возврат РеквизитФормыВЗначение("ИмяРеквизитаТаблицыНаФорме", Тип("ТаблицаЗначений"));
КонецФункции

При использовании этого подхода не забываем программно устанавливать флаг Модифицированность = Истина для основной формы документа при получении отредактированных данных.

← На главную