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