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

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

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

Отображение данных на управляемой форме

В управляемом приложении 1С 8.3 существует четкое разделение между данными на сервере и данными на клиенте. Чтобы таблица, созданная в коде, отобразилась на форме, она должна быть связана с реквизитом формы. Просто создать объект ТаблицаЗначений в коде недостаточно — она будет существовать только в оперативной памяти сервера.

Рассмотрим пошагово, как вывести данные табличной части документа в таблицу на форме:

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

Теперь проанализируем код заполнения этой таблицы. Важно помнить, что в 1С 8.3 булев тип данных (Истина/Ложь) является самостоятельным, и проверка Если ЗначениеЗаполнено(...) = 1 является избыточной и некорректной. Достаточно использовать само возвращаемое значение функции.


// Заполнение таблицы на сервере
&НаСервере
Процедура ЗаполнитьТаблицуНаФорме()
    
    // Очищаем таблицу формы перед заполнением
    Объект.ТаблицаДанных.Очистить();
    
    Для Каждого ТекСтрока Из ТО.Товары Цикл
        НоваяСтрока = Объект.ТаблицаДанных.Добавить();
        
        // Формируем наименование товара
        Наименование = "";
        Если ЗначениеЗаполнено(ТекСтрока.ТорговоеНаименование) Тогда
            Наименование = Строка(ТекСтрока.ТорговоеНаименование);
        ИначеЕсли ЗначениеЗаполнено(ТекСтрока.Номенклатура) Тогда
            Наименование = Строка(ТекСтрока.Номенклатура);
        КонецЕсли;
        
        // Обязательно преобразуем в строку при сложении, чтобы избежать ошибки «Преобразование к типу Число не может быть выполнено»
        НоваяСтрока.Тов = Наименование + " " + Строка(ТекСтрока.ФормаВыпуска);
        
        НоваяСтрока.Кол = 1;
        НоваяСтрока.Цена = 10;
        НоваяСтрока.Сумма = 10;
    КонецЦикла;
    
КонецПроцедуры

Быстрая печать через Построитель отчета

Если вам нужно оперативно вывести результат выборки на печать без детального рисования макета, можно воспользоваться объектом ПостроительОтчета. Это «хитрый» и быстрый способ визуализации таблицы значений. Однако здесь есть важный нюанс: ПостроительОтчета требует объект именно типа ТаблицаЗначений, а не ДанныеФормыКоллекция (реквизит формы).

Рассмотрим, как выполнить преобразование и вывод:


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

Программный вывод через макет (Табличный документ)

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


&НаСервере
Функция СформироватьПечатнуюФорму()
    
    ТабДок = Новый ТабличныйДокумент;
    // Получаем макет из текущей обработки
    Макет = ЭтотОбъект.ПолучитьМакет("Макет");
    
    // Получаем области
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    
    // Выводим шапку
    ТабДок.Вывести(ОбластьШапка);
    
    // Цикл по данным
    Для Каждого Стр Из Объект.ТаблицаДанных Цикл
        ОбластьСтрока.Параметры.Товар = Стр.Тов;
        ОбластьСтрока.Параметры.Количество = Стр.Кол;
        ОбластьСтрока.Параметры.Цена = Стр.Цена;
        ОбластьСтрока.Параметры.Сумма = Стр.Сумма;
        
        ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
    
    Возврат ТабДок;
    
КонецФункции

Работа с запросами к регистрам (получение цен)

Часто при выборке данных требуется подтянуть актуальные цены из регистров сведений. Разберем типичную ошибку при использовании оператора ПОДОБНО и выясним, как правильно передавать параметры.

Проанализируем ситуацию: если в строке поиска (наименовании товара) встречаются кавычки или запятые, простая конкатенация строк в тексте запроса приведет к синтаксической ошибке. Всегда используйте УстановитьПараметр.


&НаСервере
Функция ПолучитьЦенуЗапросом(НаименованиеТовара)
    
    Запрос = Новый Запрос;
    // Используем виртуальную таблицу СрезПоследних для получения актуальной цены
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Цены.Цена КАК Цена
        |ИЗ
        |   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
        |       &Период,
        |       Номенклатура.Наименование ПОДОБНО &Наименование
        |   ) КАК Цены";
    
    // Передаем параметры правильно
    Запрос.УстановитьПараметр("Период", ТекущаяДата());
    // Добавляем проценты для поиска по подстроке
    Запрос.УстановитьПараметр("Наименование", "%" + НаименованиеТовара + "%");
    
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Цена;
    КонецЕсли;
    
    Возврат 0;
    
КонецФункции

Важные рекомендации:

Мы рассмотрели основные способы вывода данных: от простых таблиц на форме до программного формирования макетов. Понимание разницы между типами данных и контекстами (Клиент/Сервер) — залог успешной разработки на платформе 1С 8.3.

← На главную