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