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