Первый шаг в 1С — абсолютно бесплатно.
Таблица значений и Дерево значений Таблица значений в 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 основной статьи) ...
// Загружаем дерево в реквизит формы с именем "ДеревоНаФорме" ЗначениеВРеквизитФормы(ДЗ, "ДеревоНаФорме");
КонецПроцедуры |
Важное резюме для разработчика: * Если в коде под директивой &НаКлиенте написать ТЗ = Новый ТаблицаЗначений; — программа выдаст **ошибку компиляции** (тип не определен). * Передача ТЗ в параметрах между клиентом и сервером (например, Процедура Расчет(МояТЗ)) **запрещена**. * Методы Свернуть(), Сортировать(), Индексы.Добавить() работают **только на сервере** и только с типом ТаблицаЗначений. Если нужно отсортировать данные прямо на форме без контекстного серверного вызова, у элементов формы используются встроенные механизмы сортировки самого отображения (свойства коллекции данных формы), но для серьезной бизнес-логики всегда применяется связка РеквизитФормыВЗначение -> Операция -> ЗначениеВРеквизитФормы. |
Разделение данных и интерфейса: Реквизит 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 (поля оформления) указывается **имя элемента формы (колонки)**, а не реквизита. Обычно платформа называет элемент склеиванием имени таблицы и имени колонки, например: "ТоварыНаФормеКоличество". |