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