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

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

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

Метод 1: Использование реквизита формы типа «ДокументСсылка»

Разберем самый простой способ, который часто выбирают начинающие разработчики. Он заключается в создании на форме справочника специального реквизита, который будет хранить ссылку на нужный документ. Это позволяет «дотянуться» до метаданных документа и его табличных частей.

Проанализируем шаги реализации:

  1. Откроем редактор управляемой формы справочника.
  2. Перейдем на вкладку Реквизиты и создадим новый реквизит формы, назовем его, например, ДокументИсточник.
  3. В качестве типа данных укажем ссылку на конкретный документ (например, ДокументСсылка.ВводНачальныхДанных).
  4. Развернем созданный реквизит (нажмем на «плюс» рядом с ним). Платформа отобразит все доступные реквизиты документа и его табличные части.
  5. Найдем нужную табличную часть и просто перетащим ее мышью в левое окно — в дерево элементов формы.

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


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

Если же ссылка на документ не хранится в справочнике, ее можно получить запросом по какому-либо признаку (например, по серийному номеру оборудования) и также присвоить реквизиту формы.

Метод 2: Динамический список с произвольным запросом

Выясним причину, почему опытные разработчики предпочитают ДинамическийСписок. Если в документе три табличные части (как в вопросе автора темы) или данных очень много, динамический список работает быстрее, так как считывает данные порциями и только для отображения. Кроме того, этот метод позволяет собрать данные из нескольких документов сразу.

Рассмотрим алгоритм настройки динамического списка:

  1. Создадим реквизит формы с типом ДинамическийСписок.
  2. В свойствах реквизита установим флаг Произвольный запрос и перейдем в конструктор запроса.
  3. Выберем таблицу нужной нам табличной части документа (например, Документ.ВводНачальныхДанных.КолесныеДиски).
  4. В условиях запроса (ГДЕ) укажем параметр для связи со справочником: Ссылка.ОбъектСвязи = &ПараметрСсылка.

Пример текста запроса в динамическом списке:


ВЫБРАТЬ
    ТЧ.НомерСтроки КАК НомерСтроки,
    ТЧ.Номенклатура КАК Номенклатура,
    ТЧ.Количество КАК Количество,
    ТЧ.Цена КАК Цена
ИЗ
    Документ.ВводНачальныхДанных.Товары КАК ТЧ
ГДЕ
    ТЧ.Ссылка.Автомобиль = &ТекущийАвтомобиль

После этого нам нужно установить значение параметра запроса. Посмотрим, как это сделать в обработчике ПриСозданииНаСервере или ПриЧтенииНаСервере:


&НаСервере
Процедура УстановитьПараметрыСписка()
    ЭлементПараметра = СписокТЧ.Параметры.Элементы.Найти("ТекущийАвтомобиль");
    Если ЭлементПараметра <> Неопределено Тогда
        ЭлементПараметра.Значение = Объект.Ссылка;
        ЭлементПараметра.Использование = Истина;
    КонецЕсли;
КонецПроцедуры

Метод 3: Использование Таблицы Значений для редактирования данных

Разберем ситуацию, когда данные документа нужно не только видеть, но и редактировать прямо из карточки справочника. Напрямую связать ТЧ документа с формой справочника для записи «на лету» невозможно. В этом случае мы используем промежуточный реквизит формы с типом ТаблицаЗначений.

Пошаговый план реализации:

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

Рассмотрим пример загрузки данных:


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

Важный момент: использование метода ЗначениеВРеквизитФормы значительно упрощает код, так как платформа сама сопоставляет имена колонок метаданных и реквизита формы.

Организация интерфейса: работа с несколькими табличными частями

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

Рекомендуем следующий подход:

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

Интерактивность и переход к источнику

Посмотрим на ситуацию со стороны пользователя. Видя данные документа в справочнике, он может захотеть открыть сам документ-основание. Если вы используете динамический список, настройте стандартное действие Выбор. В обработчике события Выбор (или ПередНачаломИзменения) добавьте код для открытия формы документа:


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

Таким образом, мы обеспечиваем бесшовную навигацию в системе, что повышает удобство работы. Подводя итог, выбор метода зависит от ваших целей: Реквизит-Ссылка — для быстрого просмотра, Динамический список — для сложных выборок и производительности, а Таблица значений — для возможности редактирования данных.

← На главную