Перед разработчиком в 1С часто встает задача отобразить пользователю набор данных, хранящийся в массиве. Использовать для этого стандартную функцию Сообщить() неудобно, особенно если элементов много. Хочется, чтобы данные отображались в удобном табличном виде прямо на форме, как это реализовано в других средах разработки, например, в компоненте DBGrid в Delphi. Давайте подробно разберем, какими способами можно решить эту задачу на управляемых формах 1С.
Рассмотрим несколько подходов, от самого простого до наиболее гибкого, чтобы вы могли выбрать оптимальный для вашей ситуации.
Этот вариант идеально подходит, когда у вас есть простой одномерный массив (например, массив строк или чисел), и вам нужно лишь отобразить его в виде списка. Этот способ и помог автору вопроса на форуме, что подчеркивает его эффективность для простых задач.
Как это работает?
Механизм очень прост. Мы создаем на форме специальный реквизит с типом СписокЗначений, а затем одной командой загружаем в него все элементы нашего массива. Платформа сама позаботится об отображении.
Разберем по шагам:
МойСписок.Посмотрим на пример кода:
Предположим, у нас есть кнопка "Заполнить", по нажатию на которую мы хотим вывести массив фруктов.
&НаКлиенте
Процедура ЗаполнитьСписок(Команда)
// Создаем и заполняем массив на клиенте для примера
ИсходныйМассив = Новый Массив;
ИсходныйМассив.Добавить("Яблоко");
ИсходныйМассив.Добавить("Груша");
ИсходныйМассив.Добавить("Апельсин");
ИсходныйМассив.Добавить("Банан");
// МойСписок - это имя нашего реквизита формы с типом СписокЗначений
// Используем метод ЗагрузитьЗначения(), чтобы передать в него массив
МойСписок.ЗагрузитьЗначения(ИсходныйМассив);
КонецПроцедуры
После выполнения этого кода на форме появится список, содержащий все элементы из ИсходныйМассив. Этот метод чрезвычайно удобен, когда нужно быстро вывести данные или предоставить пользователю возможность выбора одного из значений.
Это самый распространенный и универсальный способ для вывода структурированных данных. Он подходит, если у вас массив структур или если вы хотите представить данные в нескольких колонках. Именно этот подход вызвал небольшую дискуссию на форуме о терминах ТЧ и ТП. Давайте разберемся в них.
Пояснение терминологии:
Итак, наша задача — создать ТаблицуЗначений в коде, заполнить ее данными из массива и "отдать" эту таблицу для отображения элементу формы Табличное Поле. Для реализации таких механизмов часто используют программное изменение форм.
Разберем по шагам:
МояТаблицаНаФорме. В качестве типа укажите ТаблицаЗначений.МояТаблицаНаФорме на форму. Платформа создаст элемент "Таблица", который уже связан с вашим реквизитом.Пример кода (перебор массива и добавление строк):
Этот подход хорош, когда нужно выполнить какие-то действия с каждым элементом массива перед добавлением.
&НаКлиенте
Процедура ВывестиМассивВТаблицу(Команда)
// Допустим, у нас есть массив строк
МойМассив = Новый Массив;
МойМассив.Добавить("Яблоко");
МойМассив.Добавить("Банан");
МойМассив.Добавить("Апельсин");
// Вызываем серверную процедуру для заполнения реквизита формы
ЗаполнитьТаблицуНаСервере(МойМассив);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТаблицуНаСервере(МассивДляВывода)
// МояТаблицаНаФорме - это реквизит формы с типом ТаблицаЗначений
// У этого реквизита в конфигураторе уже должна быть колонка "Наименование"
МояТаблицаНаФорме.Очистить(); // Очищаем от старых данных
Для Каждого ЭлементМассива Из МассивДляВывода Цикл
НоваяСтрока = МояТаблицаНаФорме.Добавить();
НоваяСтрока.Наименование = ЭлементМассива;
КонецЦикла;
КонецПроцедуры
Альтернативный пример (создание ТЗ и присвоение реквизиту):
Иногда удобнее сначала полностью сформировать объект ТаблицаЗначений в переменной, а затем целиком передать его на форму. Для этого используется специальная функция ЗначениеВРеквизитФормы().
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Создаем новый объект ТаблицаЗначений в памяти
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Фрукт", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
// Заполняем ее данными (можно из массива структур)
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Фрукт = "Яблоко";
НоваяСтрока.Количество = 5;
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Фрукт = "Банан";
НоваяСтрока.Количество = 10;
// МояТаблицаНаФорме - реквизит формы типа ТаблицаЗначений
// Преобразуем объект ТЗ в данные формы и присваиваем реквизиту
ЗначениеВРеквизитФормы(ТЗ, "МояТаблицаНаФорме");
КонецПроцедуры
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), вы можете воспользоваться готовой удобной функцией для заполнения таблицы из массива: ОбщегоНазначенияКлиентСервер.ДополнитьТаблицуИзМассива().
Этот способ не обсуждался в исходной теме, но он является самым мощным инструментом для вывода данных, если вам требуется сложное форматирование, похожее на Excel.
Когда его использовать?
Как это работает?
На форму добавляется реквизит с типом ТабличныйДокумент. В коде вы программно обращаетесь к ячейкам этого документа по их координатам (как в Excel: "R1C1" — первая строка, первая колонка) и заполняете их текстом, а также настраиваете оформление.
Пример кода:
&НаСервере
Процедура ЗаполнитьТабличныйДокументНаСервере()
// ТабДокНаФорме - реквизит формы с типом ТабличныйДокумент
ТабДокНаФорме.Очистить();
// Выводим заголовок в первую ячейку
ОбластьЗаголовка = ТабДокНаФорме.ПолучитьОбласть("R1C1");
ОбластьЗаголовка.Текст = "Наши данные из массива";
ОбластьЗаголовка.Шрифт = Новый Шрифт(,,Истина); // Делаем жирным
// МойМассив - наш исходный массив
МойМассив = Новый Массив;
МойМассив.Добавить("Элемент 1");
МойМассив.Добавить("Элемент 2");
МойМассив.Добавить("Элемент 3");
// Выводим данные из массива, начиная со второй строки
НомерСтроки = 2;
Для Каждого ЭлементМассива Из МойМассив Цикл
// Получаем область ячейки по ее адресу
ОбластьЯчейки = ТабДокНаФорме.ПолучитьОбласть("R" + НомерСтроки + "C1");
ОбластьЯчейки.Текст = ЭлементМассива;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецПроцедуры
Этот метод дает максимальный контроль над внешним видом, но он и самый трудоемкий для реализации простой задачи вывода списка.
В итоге, выбор способа зависит от вашей конкретной задачи. Для простого списка — СписокЗначений, для стандартной таблицы с данными — ТаблицаЗначений, для отчета со сложным оформлением прямо на форме — ТабличныйДокумент.