Первый шаг в 1С — абсолютно бесплатно.

📋 Таблица значений в 1С 8.3

Таблица значений и Дерево значений

Таблица значений в 1С 8.3 — это универсальный объект встроенного языка для хранения и обработки наборов данных в оперативной памяти, представляющий собой двумерную матрицу из колонок и строк.

Дерево значений — это аналогичный таблице значений объект в памяти, но поддерживающий древовидную (иерархическую) структуру данных, где каждая строка может содержать в себе коллекцию подчиненных строк.

 

Как создать таблицу значений и заполнить ее поля

// Создание таблицы значений

ТЗ = Новый ТаблицаЗначений;

// Добавление колонок (Имя, Тип, Заголовок, Ширина)

ТЗ.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)));

ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

// Добавление и заполнение строк

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Товар = СсылкаНаТовар1;

НоваяСтрока.Количество = 10;

НоваяСтрока.Цена = 150;

// Альтернативный способ быстрого заполнения через явное указание индекса или имени

ДругаяСтрока = ТЗ.Добавить();

ДругаяСтрока["Товар"] = СсылкаНаТовар2;

ДругаяСтрока["Количество"] = 5;

ДругаяСтрока["Цена"] = 300;

Как перебрать строки таблицы значений

Для обхода строк используется стандартный цикл Для Каждого. 

// Прямой обход таблицы значений

Для Каждого ТекущаяСтрока Из ТЗ Цикл

Сообщить(СтрШаблон("Товар: %1, Сумма: %2",

ТекущаяСтрока.Товар,

ТекущаяСтрока.Количество * ТекущаяСтрока.Цена));

КонецЦикла;

Сортировка таблиц значений

Упорядочивание данных производится методом Сортировать():

ТЗ.Сортировать("Цена Убыв, Товар Возр");

Метод Свернуть()

Крайне важный инструмент аналитики, который группирует строки по ключевым колонкам и суммирует числовые данные: 

// Первым параметром — колонки группировки, вторым — колонки суммирования

ТЗ.Свернуть("Товар", "Количество, Сумма");

Как добавить колонки к таблице значений

ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2)));

Как найти значение в таблице значений

// Способ 1: Найти() — возвращает первую найденную строку или Неопределено

// Параметры: ЗначениеПоиска, ИменаКолонок (необязательно)

НайденнаяСтрока = ТЗ.Найти(СсылкаНаТовар1, "Товар");

Если НайденнаяСтрока <> Неопределено Тогда

Сообщить("Найдена цена: " + НайденнаяСтрока.Цена);

КонецЕсли;

// Способ 2: НайтиСтроки() — возвращает Массив строк, подходящих под условия отбора

СтруктураОтбора = Новый Структура;

СтруктураОтбора.Вставить("Товар", СсылкаНаТовар1);

СтруктураОтбора.Вставить("Цена", 150);

МассивСтрок = ТЗ.НайтиСтроки(СтруктураОтбора);

Для Каждого Стр Из МассивСтрок Цикл

// Обработка подходящих строк

КонецЦикла;

Как удалить строки (колонки) таблицы значений

Для удаления используются методы Удалить(). При удалении строк в цикле крайне важно делать обход **с конца**, чтобы индексы оставшихся строк не смещались. 

// Удаление строки по индексу или по объекту строки

ТЗ.Удалить(0); // Удалит первую строку

ТЗ.Удалить(НайденнаяСтрока); // Удалит конкретный объект строки

// ВАЖНО: Удаление строк в цикле (правильный обход с конца)

ВсегоСтрок = ТЗ.Количество();

Для Индекс = 1 По ВсегоСтрок Цикл

ОбратныйИндекс = ВсегоСтрок - Индекс;

ТекущаяСтрока = ТЗ[ОбратныйИндекс];

Если ТекущаяСтрока.Количество = 0 Тогда

ТЗ.Удалить(ОбратныйИндекс);

КонецЕсли;

КонецЦикла;

Как удалить колонку

// Удаление колонки (по имени или по индексу/объекту)

ТЗ.Колонки.Удалить("Цена");

Очистка данных

Для полного удаления всех строк используется метод

ТЗ.Очистить().

//Для удаления и строк, и колонок проще переинициализировать переменную:

ТЗ = Новый ТаблицаЗначений;.

Как добавить колонки к таблице значений

Колонки добавляются в коллекцию Колонки с помощью методов Добавить() (в конец) или Вставить() (на определенную позицию). 

// Добавление в конец коллекции

ТЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

// Вставка на первое место (индекс 0)

ТЗ.Колонки.Вставить(0, "ИндексСтроки", Новый ОписаниеТипов("Число"));

Как заполнить таблицу значений, если имена колонок содержатся в переменных

Используется обращение к колонкам через квадратные скобки:

ИмяКолонки1 = "Товар";

ИмяКолонки2 = "Количество";

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока[ИмяКолонки1] = Справочники.Номенклатура.ПустаяСсылка();

НоваяСтрока[ИмяКолонки2] = 5;

Как заполнить всю колонку таблицы значений нужным значением

Метод ЗаполнитьЗначения() позволяет за один вызов прописать конкретное значение во все строки указанной колонки (или нескольких колонок). 

// Параметры: Значение, ИменаКолонок (через запятую)

ТЗ.ЗаполнитьЗначения(Истина, "ФлагАктивации");

ТЗ.ЗаполнитьЗначения(0, "Количество, Цена");

Как перекопировать одну таблицу в другую

Для копирования используется метод Скопировать(). Его можно вызывать как без параметров (полная копия структуры и данных), так и с параметрами (копирование структуры определенных колонок или копирование по отбору). 

// 1. Полная копия (структура + все данные)

ТЗ_Копия = ТЗ.Скопировать();

// 2. Копия только структуры (без строк)

ТЗ_ТолькоСтруктура = ТЗ.СкопироватьКолонки();

// 3. Копия определенных колонок со всеми строками

ТЗ_Ограниченная = ТЗ.Скопировать(, "Товар, Цена");

// 4. Копия строк по отбору

Отбор = Новый Структура("Цена", 150);

ТЗ_ПоОтбору = ТЗ.Скопировать(Отбор, "Товар, Количество, Цена");

Как изменить тип значения колонки таблицы значений, полученной выгрузкой из запроса

напрямую у колонки выгруженной ТЗ тип поменять нельзя. Нужно создать новую колонку с правильным типом или скопировать данные через обход:

// Пример: добавляем новую колонку с нужным типом, переносим данные, старую удаляем

ТЗ.Колонки.Добавить("КоличествоНовое", Новый ОписаниеТипов("Число"));

Для Каждого Стр Из ТЗ Цикл

Стр.КоличествоНовое = Число(Стр.КоличествоСтарое);

КонецЦикла;

ТЗ.Колонки.Удалить("КоличествоСтарое");

Как самостоятельно заполнить дерево значений

ДЗ = Новый ДеревоЗначений;

ДЗ.Колонки.Добавить("Название", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));

ДЗ.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));

// 1. Создаем строку первого уровня (Родитель)

СтрокаГруппа = ДЗ.Строки.Добавить();

СтрокаГруппа.Название = "Бытовая техника";

// 2. Создаем подчиненную строку (Потомок)

СтрокаТовар1 = СтрокаГруппа.Строки.Добавить();

СтрокаТовар1.Название = "Холодильник";

СтрокаТовар1.Сумма = 45000;

// Еще одна подчиненная строка

СтрокаТовар2 = СтрокаГруппа.Строки.Добавить();

СтрокаТовар2.Название = "Микроволновка";

СтрокаТовар2.Сумма = 8000;

// Рассчитаем сумму по группе (опционально)

СтрокаГруппа.Сумма = СтрокаТовар1.Сумма + СтрокаТовар2.Сумма;

Как в дереве значений найти строку по определенному условию

У дерева нет простого метода Найти() для всей иерархии сразу, поэтому используется рекурсивный обход:

Функция НайтиСтрокуДерева(КоллекцияСтрок, ИскомоеЗначение)

Для Каждого Стр Из КоллекцияСтрок Цикл

Если Стр.Наименование = ИскомоеЗначение Тогда

Возврат Стр;

КонецЕсли;

// Рекурсивный поиск в дочерних строках

Найденная = НайтиСтрокуДерева(Стр.Строки, ИскомоеЗначение);

Если Найденная <> Неопределено Тогда

Возврат Найденная;

КонецЕсли;

КонецЦикла;

Возврат Неопределено;

КонецФункции

// Вызов:

РезультатПоиска = НайтиСтрокуДерева(Дерево.Строки, "Элемент 1.1");

Важные нюансы и дополнительные моменты

* Индексирование: Если в таблице значений много строк (более 10 000) и планируется частый поиск, используйте метод

ТЗ.Колонки.ИмяКолонки.Индексированная = Истина;

— это ускорит поиск в разы.

*Выгрузка из запроса: Метод РезультатЗапроса.Выгрузить() мгновенно создает заполненную таблицу значений.

Передача на клиент/сервер: Таблицы и деревья значений являются объектами «Встроенного языка» и могут передаваться между клиентом и сервером (если они сериализуемы, то есть содержат базовые типы данных, ссылки, структуры).

Почему ТЗ и ДЗ не живут на клиенте

В платформе «1С:Предприятие 8.3» типы данных ТаблицаЗначений и ДеревоЗначений являются мутабельными (изменяемыми) объектами и доступны **только на стороне Сервера** (или в устаревшем Толстом клиенте).  Тонкий клиент и Веб-клиент ничего не знают про эти типы данных. Если вы попытаетесь передать ТаблицуЗначений напрямую в процедуру с директивой компиляции &НаКлиенте или вернуть её как результат функции, система выдаст критическую ошибку: «Мутабельные объекты не могут быть переданы на клиент».  Для работы с табличными данными на клиенте (например, для отображения их на форме) используются специальные типы-суррогаты: 

* ДанныеФормыКоллекция (аналог Таблицы значений)

* ДанныеФормыДерево (аналог Дерева значений)

 

Схема взаимодействия и конвертации

Чтобы отобразить готовую серверную ТаблицуЗначений на управляемой форме, её необходимо преобразовать в реквизит формы с помощью встроенных методов: 

1. **ЗначениеВРеквизитФормы()** — преобразует серверный объект (ТЗ/ДЗ) в тип данных формы.

2. **РеквизитФормыВЗначение()** — выполняет обратную операцию: превращает данные формы обратно в полноценную ТЗ/ДЗ на сервере для выполнения сложных операций (например, свертки или индексации).

 

Практический пример 1: Вывод Таблицы значений на форму Представим задачу: на форме есть кнопка «Заполнить таблицу». Нам нужно сходить на сервер, заполнить ТЗ данными и вывести их пользователю.  **Предварительное условие:** На управляемой форме должен быть создан реквизит формы с именем ТоварыНаФорме и типом ТаблицаЗначений. В этот реквизит на форме добавлены колонки Товар и Количество. 

&НаКлиенте

Процедура ЗаполнитьТаблицуНаФорме(Команда)

// Вызываем серверный контекст для формирования данных

ЗаполнитьТаблицуНаСервере();

КонецПроцедуры

&НаСервере

Процедура ЗаполнитьТаблицуНаСервере()

// 1. Создаем чистую серверную Таблицу Значений

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Товар", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));

ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));

// 2. Заполняем ТЗ какими-то данными (например, выборкой или запросом)

НоваяСтр = ТЗ.Добавить();

НоваяСтр.Товар = Справочники.Номенклатура.НайтиПоНаименованию("Кофемашина");

НоваяСтр.Количество = 5;

// 3. Магия конвертации: загоняем серверную ТЗ в реквизит управляемой формы.

// Первый параметр — наша серверная ТЗ.

// Второй параметр — ИМЯ реквизита формы в виде строки.

ЗначениеВРеквизитФормы(ТЗ, "ТоварыНаФорме");

// С этого момента данные мгновенно отобразятся на экране у пользователя

КонецПроцедуры

Практический пример 2: Обратная конвертация (Форма -> Серверная ТЗ) Представим, что пользователь вручную заполнил таблицу на форме, нажал кнопку «Обработать данные», и нам нужно на сервере быстро сгруппировать (свернуть) эти данные. Напрямую вызвать метод .Свернуть() у реквизита формы нельзя — у типа ДанныеФормыКоллекция такого метода просто нет. 

&НаКлиенте

Процедура ОбработатьДанныеФормы(Команда)

ОбработатьДанныеНаСервере();

КонецПроцедуры

&НаСервере

Процедура ОбработатьДанныеНаСервере()

// 1. Конвертируем данные с формы в полноценную серверную Таблицу Значений

// Параметр — сам реквизит формы (НЕ строка)

ТЗ = РеквизитФормыВЗначение(ТоварыНаФорме);

// 2. Теперь нам доступны все мощные серверные методы ТЗ

ТЗ.Свернуть("Товар", "Количество"); // Группируем дубли товаров и суммируем количество

// 3. Возвращаем измененную и чистую ТЗ обратно на форму пользователю

ЗначениеВРеквизитФормы(ТЗ, "ТоварыНаФорме");

КонецПроцедуры

Особенности работы с Деревом значений

С деревом значений логика абсолютно идентична, меняется только тип реквизита на форме (он будет иметь тип ДанныеФормыДерево). 

&НаСервере

Процедура ЗаполнитьДеревоНаСервере()

// Создаем серверное дерево значений

ДЗ = Новый ДеревоЗначений;

ДЗ.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("Строка"));

// ... тут логика заполнения уровней дерева (как в п.11 основной статьи) ...

// Загружаем дерево в реквизит формы с именем "ДеревоНаФорме"

ЗначениеВРеквизитФормы(ДЗ, "ДеревоНаФорме");

КонецПроцедуры

Важное резюме для разработчика:

* Если в коде под директивой &НаКлиенте написать ТЗ = Новый ТаблицаЗначений; — программа выдаст **ошибку компиляции** (тип не определен).

* Передача ТЗ в параметрах между клиентом и сервером (например, Процедура Расчет(МояТЗ)) **запрещена**.

* Методы Свернуть(), Сортировать(), Индексы.Добавить() работают **только на сервере** и только с типом ТаблицаЗначений. Если нужно отсортировать данные прямо на форме без контекстного серверного вызова, у элементов формы используются встроенные механизмы сортировки самого отображения (свойства коллекции данных формы), но для серьезной бизнес-логики всегда применяется связка РеквизитФормыВЗначение -> Операция -> ЗначениеВРеквизитФормы.

📋 Запутанная тема для новичков в 1С.

Разделение данных и интерфейса: Реквизит vs Элемент

Когда вы работаете в конфигураторе 1С с управляемой формой (в Тонком/Легком клиенте), окно редактора разделено на две основные части: Реквизиты (база данных формы, её «память») и Элементы (то, что видит пользователь на экране, её «визуальная часть»). 

Когда вы берете созданную ТаблицуЗначений из окна реквизитов и перетаскиваете её мышкой на саму форму (в окно элементов), платформа автоматически создает визуальный элемент управления.  В терминах 1С этот элемент называется Табличное поле (или элемент формы типа Таблица). 

В чем разница в названиях?

Чтобы не путаться в терминологии в статье, используйте следующее разделение: 

1. Реквизит формы (Данные): Имеет тип ДанныеФормыКоллекция. Это «невидимая» таблица в памяти формы, где лежат ваши строки и колонки.

2. Элемент формы (Интерфейс): Имеет тип ТаблицаФормы (в коде к нему обращаются через Элементы.ИмяВашейТаблицы). Это именно то Табличное поле, которое отображается на экране: с сеткой, кнопками «Добавить», «Удалить», полосами прокрутки и выделением строк.

 

Простая аналогия для статьи:

Реквизит формы (ДанныеФормыКоллекция) — это **актер за кулисами**, который знает весь текст и сценарий (данные).

Элемент формы (ТаблицаФормы / Табличное поле) — это **сцена и костюм**, благодаря которым зритель видит этого актера на экране. 

Как это выглядит в свойствах и коде

Когда вы перетащили таблицу, платформа автоматически связывает визуальное **Табличное поле** с данными в памяти. В свойствах элемента формы это поле называется **ПутьКДанным** (DataPath). 

Там будет написано имя вашего реквизита, например: Объект.Товары или просто ТоварыНаФорме. 

 

Зачем разработчику знать это разделение?

Потому что в коде вы управляете ими совершенно по-разному: 

* Если вам нужно добавить строку, посчитать сумму или очистить данные**, вы обращаетесь к *Реквизиту: 

// Работаем с данными

НоваяСтрока = ТоварыНаФорме.Добавить();

* Если вам нужно скрыть таблицу с экрана, запретить пользователю удалять строки или сделать колонку доступной только для чтения, вы обращаетесь к *Элементу* (к Табличному полю): 

// Работаем с интерфейсом

Элементы.ТоварыНаФорме.Видимость = Ложь;

Элементы.ТоварыНаФорме.ТолькоПросмотр = Истина;

 

Когда мы перетащили таблицу на форму и она стала **Таблицей формы** (ТаблицаФормы), перед нами открываются огромные возможности по управлению поведением интерфейса прямо на клиенте (&НаКлиенте). Для этого нам не нужно каждый раз «бегать» на сервер. 

 

Ниже приведены самые популярные и полезные фишки с готовыми примерами кода.

1. Как программно активизировать (выделить) конкретную строку Пользователю часто нужно показать результат работы программы: например, автоматически встать курсором на добавленную или найденную строку.  За выбор текущей строки отвечает свойство элемента формы ТекущаяСтрока. В него передается **Идентификатор строки** (уникальное число, которое платформа присваивает каждой строке в данных формы). 

&НаКлиенте

Процедура АктивизироватьПервуюСтроку()

// Проверяем, есть ли вообще строки в данных

Если ТоварыНаФорме.Количество() > 0 Тогда

// 1. Получаем строку данных (например, самую первую, с индексом 0)

СтрокаДанных = ТоварыНаФорме[0];

// 2. Получаем её внутренний идентификатор

ИдентификаторСтроки = СтрокаДанных.ПолучитьИдентификатор();

// 3. Передаем идентификатор в элемент формы (Табличное поле)

Элементы.ТоварыНаФорме.ТекущаяСтрока = ИдентификаторСтроки;

КонецЕсли;

КонецПроцедуры

 

2. Как перехватить двойной клик (выбор строки) пользователем Если пользователь дважды кликает по строке таблицы или нажимает Enter, срабатывает событие таблицы **Выбор**. Это идеальное место, чтобы открыть карточку товара, показать связанный документ или выполнить расчет.  *Чтобы это заработало, в конфигураторе в свойствах таблицы нажмите на лупу напротив события «Выбор» (OnActivate).* 

&НаКлиенте

Процедура ТоварыНаФормеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

// Параметр "ВыбраннаяСтрока" сразу содержит Идентификатор строки, по которой кликнули!

// Получаем саму строку данных по этому идентификатору

ТекущаяСтрокаДанных = ТоварыНаФорме.НайтиПоИдентификатору(ВыбраннаяСтрока);

// Пример бизнес-логики: открываем карточку товара

Если ЗначениеЗаполнено(ТекущаяСтрокаДанных.Товар) Тогда

ПоказатьЗначение(, ТекущаяСтрокаДанных.Товар);

КонецЕсли;

// Отменяем стандартное действие 1С (чтобы система не пыталась параллельно начать редактирование ячейки)

СтандартнаяОбработка = Ложь;

КонецПроцедуры

 

3. Как узнать, какие строки выделил пользователь (Множественный выбор) У Табличного поля в свойствах можно включить флаг **РежимВыделения = Множественный**. Тогда пользователь сможет выделять строки пачками (зажав Ctrl или Shift). Как прочитать этот выбор в коде?  За это отвечает свойство элемента формы ВыделенныеСтроки (это массив идентификаторов). 

&НаКлиенте

Процедура ПосчитатьСуммуВыделенныхСтрок(Команда)

ИтогоВыделено = 0;

// Обходим массив идентификаторов выделенных строк

Для Каждого ИдСтроки Из Элементы.ТоварыНаФорме.ВыделенныеСтроки Цикл

// Находим строку данных

СтрокаДанных = ТоварыНаФорме.НайтиПоИдентификатору(ИдСтроки);

// Суммируем показатель

ИтогоВыделено = ИтогоВыделено + СтрокаДанных.Количество;

КонецЦикла;

ПоказатьПредупреждение(, "В выделенных строках содержится товаров: " + ИтогоВыделено);

КонецПроцедуры

4. Динамическое управление доступностью и видимостью

Иногда в зависимости от условий (например, роли пользователя или статуса документа) нужно мгновенно заблокировать таблицу или скрыть какую-то колонку. 

&НаКлиенте

Процедура УправлятьИнтерфейсомТаблицы(ТолькоЧтение)

// Запретить/разрешить редактирование всей таблицы целиком

Элементы.ТоварыНаФорме.ТолькоПросмотр = ТолькоЧтение;

// Запретить пользователю добавлять новые строки кнопкой "Добавить"

Элементы.ТоварыНаФорме.ИзменятьСоставСтрок = Не ТолькоЧтение;

// Скрыть или показать конкретную колонку (например, колонку "Цена")

Элементы.ТоварыНаФормеЦена.Видимость = Не ТолькоЧтение;

КонецПроцедуры

Полезный лайфхак: Быстрый поиск в данных формы на клиенте

Метод НайтиСтроки() у реквизита ДанныеФормыКоллекция доступен прямо на клиенте без вызова сервера! Однако у него есть важное ограничение: он работает только по точному равенству (нельзя искать «содержит» или «больше»). 

&НаКлиенте

Процедура БыстрыйПоискНаКлиенте()

// Ищем на клиенте все строки, где товар равен определенной ссылке

ПараметрыОтбора = Новый Структура("Товар", СсылкаНаНужныйТовар);

// Метод вернет Массив объектов типа ДанныеФормыЭлементКоллекции

НайденныеСтроки = ТоварыНаФорме.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда

// Меняем количество в первой найденной строке прямо на клиенте

НайденныеСтроки[0].Количество = 100;

КонецЕсли;

КонецПроцедуры

Чек-лист терминов для закрепления (чтобы не путать в коде):

* Объект.Товары или ТоварыНаФорме — это **Данные** (ДанныеФормыКоллекция). У них вызываются методы: .Добавить(), .Очистить(), .Количество(), .НайтиПоИдентификатору().

* Элементы.ТоварыНаФорме — это **Интерфейс** (ТаблицаФормы). У него вызываются свойства: .ТекущаяСтрока, .ВыделенныеСтроки, .ТолькоПросмотр, .Видимость.

Запутанный вопрос

Действительно, в платформе есть два типа данных в памяти (ТаблицаЗначений и ДеревоЗначений) и три режима отображения элемента на форме (Список, Иерархический список, Дерево).

Давайте разберем простым языком, как они между собой сочетаются, в чем разница и когда какой вариант выбирать.

На форме элемент типа «Таблица формы» имеет свойство Отображение (Representation). Это свойство определяет, как именно пользователю нарисуют строки на экране — плоской сеткой или с плюсиками для раскрытия веток. В качестве данных для неё могут быть Таблица значений (плоская структура) и Дерево значений (иерархическая структура).

Очевидно, если ваши данные — это Таблица значений, вы можете показать её только как обычный плоский Список. Но если ваши данные — это Дерево значений, вы можете переключать его отображение на форме как угодно!

Возникает каверзный вопрос, что будет если в реквизита ТаблицаЗначений у Таблице формы в свойстве Отображение выставить значение Дерево.

Увы, в режиме «Иерархический список» или «Дерево»: На экране таблица останется абсолютно плоским списком. Никаких папок, раскрывающихся ветвей или плюсиков не появится.

Почему свойство доступно, если структура плоская?

Это связано с принципом универсальности элементов формы в управляемом интерфейсе 1С.

На форме визуальный элемент «Таблица» (ТаблицаФормы) — это один и тот же универсальный объект-конструктор. Платформа не создает под каждый тип данных свой уникальный элемент. Вместо этого она использует общее «Табличное поле», у которого изначально заложены все возможные свойства отображения.

Разбор режимов отображения для Дерева значений

Посмотрим, как изменится интерфейс, если мы будем менять свойство Отображение:

1. Режим «Дерево»

• Как выглядит: Классический вид папок и файлов. Слева от родительской строки (Бытовая техника) появляется «плюсик» / стрелочка. Подчиненные строки смещены вправо.

• Поведение: Пользователь может сворачивать и разворачивать группы.

• Когда использовать: Когда вам нужно показать жесткую логическую вложенность.

 

2. Режим «Иерархический список»

• Как выглядит: На экране отображается только один уровень иерархии за раз. Никаких «плюсиков» для раскрытия строк нет. Группы выглядят как обычные папки в проводнике Windows.

• Поведение: Чтобы увидеть, что лежит внутри группы «Бытовая техника», пользователь должен дважды кликнуть по ней. Таблица «провалится» внутрь этой группы, а сверху появится навигация (ссылка для возврата назад на уровень выше).

• Когда использовать: Идеально подходит, когда у вас огромный объем данных на разных уровнях иерархии, и если вывести всё деревом с плюсиками — экран превратится в бесконечную «кашу».

 

3. Режим «Список»

• Как выглядит: Платформа берет ваше иерархическое Дерево значений и насильно «разворачивает» его в одну плоскую таблицу. Все строки (и родители, и дети) идут друг за другом сплошным списком, без смещений и без папок.

• Поведение: Теряется визуальная подчиненность, но данные никуда не пропадают. Родительские строки будут чередоваться с дочерними.

• Когда использовать: На практике для Дерева значений этот режим используется крайне редко. Он может пригодиться, например, если вам нужно временно дать пользователю возможность быстро пролистать вообще все элементы без необходимости заходить в папки, или для реализации плоского текстового поиска по всей иерархии.

Программное разворачивание ветвей дерева

Рассмотрим, как управлять автоматическим развертыванием всех веток дерева при открытии формы.

Элементы.ИмяДерева.Развернуть();

Условное оформление Таблицы формы

Условное оформление — это механизм управляемых форм, который позволяет динамически менять внешний вид элементов (цвет текста, цвет фона, шрифт, видимость или доступность) в зависимости от выполнения определенных условий. 

 

Например: 

* Выделить строки с нулевым остатком **красным цветом**.

* Выделить строки, где товар является услугой, *курсивным шрифтом*.

* Заблокировать для редактирования ячейку «Цена», если колонка «Товар» не заполнена.

 

Главное правило: Условное оформление применяется на сервере один раз (обычно при создании формы), а красится и обновляется таблица на клиенте автоматически сама, без повторных вызовов сервера, когда пользователь меняет данные! 

 

Два способа настройки:

1. Через конфигуратор (Интерактивно):

Открыть свойства формы / Вкладка «Условное оформление»

настроить правила. Это просто, но не всегда гибко.

2. Программно (В коде): Самый мощный и профессиональный способ, так как правила можно менять «на лету» в зависимости от прав пользователя или настроек программы. Ниже приведен готовый шаблон программной настройки условного оформления. 

 

Практический пример: Красим строки с Количество = 0 в красный цвет Код пишется в модуле формы в предопределенной процедуре ПриСозданииНаСервере. 

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// 1. Создаем новый элемент условного оформления

ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// 2. ЧТО МЕНЯЕМ (Оформление)

// Задаем цвет фона ячейки/строки

ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоРозовый);

// Можно также задать цвет текста:

ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

// 3. ПРИ КАКОМ УСЛОВИИ (Условие)

// Формируем условие: "ТоварыНаФорме.Количество РАВНО 0"

ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТоварыНаФорме.Количество");

ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементУсловия.ПравоеЗначение = 0;

// Флаг использования условия

ЭлементУсловия.Использование = Истина;

// 4. ДЛЯ КАКИХ ПОЛЕЙ (Оформляемые поля)

// Если указать конкретную колонку — покрасится только эта ячейка.

// Если не указывать поля вообще — покрасится ВСЯ СТРОКА целиком.

ПолеОформления = ЭлементОформления.Поля.Добавить();

ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ТоварыНаФормеКоличество"); // Красим только колонку "Количество"

ПолеОформления.Использование = Истина;

// Если нужно покрасить еще одну колонку, просто добавляем её:

// ПолеОформления2 = ЭлементОформления.Поля.Добавить();

// ПолеОформления2.Поле = Новый ПолеКомпоновкиДанных("ТоварыНаФормеТовар");

КонецПроцедуры

Топ-3 частых ошибок новичков при работе с оформлением:

1. Попытка раскрасить таблицу в цикле Для Каждого Строка...: Начинающие разработчики, пришедшие из старой версии 1С 7.7/8.1, пытаются перебрать строки таблицы и покрасить каждую вручную. В Управляемом приложении (1С 8.2/8.3) так делать **категорически нельзя**. Оформление задается как общее правило (декларативно) через коллекцию УсловноеОформление.

2. Неверный путь к полю отбора: В пункте 3 (в отборе) путь к полю всегда указывается через точку от имени реквизита: "ТоварыНаФорме.Количество".

3. Неверный путь к оформляемому полю: В пункте 4 (поля оформления) указывается **имя элемента формы (колонки)**, а не реквизита. Обычно платформа называет элемент склеиванием имени таблицы и имени колонки, например: "ТоварыНаФормеКоличество".