К статье
Практический материал

Разработка и Конфигурация · 13 мин

Как скрыть строки в табличной части 1С

Как скрыть строки в табличной части 1С: отбор строк, условное оформление, программные методы для управляемых и обычных форм. Примеры кода и типичные ошибки.

Задача скрыть часть строк табличной части возникает постоянно: нужно показать пользователю только непроведённые позиции, скрыть отменённые товары, отфильтровать услуги среди номенклатуры или оставить строки по выбранному складу. В 1С нет отдельной команды «скрыть строку» — вместо этого используются отборы, условное оформление и программная работа с данными формы, и выбор способа зависит от типа формы и версии платформы.

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

Ниже разобраны рабочие способы для управляемых форм (1С 8.3, тонкий и веб-клиент) и обычных форм (8.2 и ранние конфигурации), а также вариант для динамических списков и типичные ошибки, из-за которых отбор «не срабатывает».

Какой способ выбрать: отбор, оформление или отдельная таблица

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

Маршрут решения

Как выбрать действие

Нужно скрыть строки по значению реквизита (склад, вид номенклатуры, пометка)Используйте ОтборСтрок с фиксированным отбором — самый простой и безопасный способ
Условие сложное (диапазон дат, расчётное поле, несколько условий ИЛИ)Выведите данные в отдельную таблицу значений формы или используйте динамический список с отбором
Строки нужно не скрыть, а визуально приглушитьПримените условное оформление формы
Форма обычная (платформа 8.2, толстый клиент)Используйте ОтборСтрок у табличной части объекта или у табличного поля

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

Скрытие строк через ОтборСтрок в управляемой форме

В управляемой форме табличная часть объекта отображается через элемент «Таблица формы». У данных, связанных с этой таблицей, есть свойство ОтборСтрок — именно оно отвечает за то, какие строки видны пользователю. Отбор задаётся объектом типа ФиксированноеСоответствие, где ключ — имя реквизита табличной части, а значение — требуемое значение.

Пример: в документе «Реализация товаров и услуг» нужно показать только строки с конкретным складом. Код размещается в модуле формы, например в обработчике команды или при изменении реквизита-фильтра.

bsl
&НаКлиенте
Процедура ПоказатьТолькоСклад(Команда)
    Отбор = Новый ФиксированноеСоответствие(
        Новый Соответствие);
    Соответствие = Новый Соответствие;
    Соответствие.Вставить("Склад", ВыбранныйСклад);
    Элементы.Товары.ОтборСтрок = Новый ФиксированноеСоответствие(Соответствие);
КонецПроцедуры

Чтобы снять отбор и показать все строки, достаточно присвоить свойству Неопределено:

Элементы.Товары.ОтборСтрок = Неопределено;

Обратите внимание: отбор применяется к элементу формы (Элементы.Товары), а не к данным объекта. Сами строки в табличной части документа остаются, при записи и проведении учитываются все — и видимые, и скрытые. Это нужно явно доносить до пользователей, иначе возможны ошибки в учёте: человек видит три строки, считает итог по ним, а документ проводится по десяти.

Отбор по нескольким условиям и его ограничения

Фиксированное соответствие поддерживает несколько ключей — условия объединяются по «И». Например, показать строки с конкретным складом и конкретным видом номенклатуры:

Соответствие = Новый Соответствие;

Соответствие.Вставить("Склад", ВыбранныйСклад);

Соответствие.Вставить("ВидНоменклатуры", ВидТовара);

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

Главное ограничение: фиксированный отбор умеет сравнивать только на равенство. Условия «не равно», «больше», «в списке», «содержит подстроку» таким способом задать нельзя. Для них есть обходные пути:

  • добавить в табличную часть служебный реквизит-флаг (например, «Скрытая»), вычислять его при изменении строк и фильтровать по нему;
  • вывести данные в отдельную таблицу значений на форме и заполнять её программно по любому условию;
  • если таблица построена на динамическом списке — использовать полноценный отбор динамического списка с произвольными видами сравнения.

Скрытие строк в обычных формах (обычное приложение)

В обычных формах механика похожая, но отбор задаётся у данных табличной части или у табличного поля. У табличной части объекта есть свойство ОтборСтрок, доступное на сервере и на клиенте в толстом клиенте:

// Обычная форма, модуль формы

ЭлементыФормы.Товары.ОтборСтрок.Склад.Установить(ВыбранныйСклад);

// Снятие отбора:

ЭлементыФормы.Товары.ОтборСтрок.Сбросить();

В обычных формах отбор строится на объекте Отбор, похожем на отбор в динамических списках: у него есть элементы с видом сравнения, поэтому здесь доступны условия «не равно», «в списке» и другие — в отличие от фиксированного соответствия управляемых форм. Это делает обычные формы гибче для простой фильтрации.

Дополнительно в обычном приложении у табличного поля есть событие ПриВыводеСтроки, где можно управлять оформлением каждой строки. Скрыть строку полностью через это событие нельзя, но можно сделать её визуально «пустой» — однако правильнее всё же использовать отбор.

Альтернатива: отдельная таблица значений на форме

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

Порядок действий
  1. 1
    Добавьте реквизит формы типа «ТаблицаЗначений» с колонками, повторяющими нужные поля табличной части
  2. 2
    Перетащите реквизит в дерево элементов формы — появится таблица
  3. 3
    В серверной процедуре переберите табличную часть объекта и скопируйте в новую таблицу только строки, удовлетворяющие условию
  4. 4
    При необходимости редактирования реализуйте обратную синхронизацию: перенос изменённых строк обратно в табличную часть объекта
  5. 5
    Протестируйте запись и проведение документа, убедившись, что скрытые строки не потеряны

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

Упрощённый вариант без редактирования — заполнение таблицы запросом:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ Товары.Номенклатура, Товары.Количество

|ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары

|ГДЕ Товары.Ссылка = &Ссылка И Товары.Количество > 0";

Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);

ТаблицаОтбора.Загрузить(Запрос.Выполнить().Выгрузить());

Условное оформление и динамические списки

Если цель — не скрыть строки, а сделать часть из них невзрачными (отменённые, архивные, с нулевым количеством), используйте условное оформление формы. Оно настраивается в конфигураторе на закладке «Условное оформление» формы или программно через УсловноеОформление.Элементы. Можно менять цвет текста, шрифт (например, зачёркнутый), доступность и видимость отдельных полей строки.

Полностью скрыть строку условное оформление не может — оно управляет только представлением полей. Но для многих задач «приглушить» строку удобнее, чем прятать: пользователь видит, что позиция существует, и не теряет контекст документа.

Если таблица на форме построена на динамическом списке (основной реквизит — «ДинамическийСписок»), фильтрация делается через его отбор: Список.Отбор.Элементы либо параметры произвольного запроса. Динамический список поддерживает все виды сравнения, группы условий «И/ИЛИ» и отбор по периоду — это самый гибкий вариант, но он применим только к спискам, а не к табличным частям объекта напрямую.

Сравнение вариантов

ОтборСтрок (фиксированное соответствие)

Быстро и просто, работает на клиенте; ограничение — только сравнение на равенство

Отдельная таблица значений

Любые условия, включая запросы; минус — нужна синхронизация при редактировании

Условное оформление

Строка остаётся видимой, но приглушается; не подходит, если строку нужно именно убрать

Динамический список с отбором

Максимальная гибкость условий; применим только к спискам, а не к табличным частям документа

Проверка результата и типичные ошибки

После внедрения отбора проверьте сценарий целиком: открытие формы, применение и снятие фильтра, добавление новой строки при включённом отборе, запись и проведение документа, печать. Особое внимание — новым строкам: если они не соответствуют условию отбора, они «исчезнут» сразу после ввода, что выглядит как потеря данных.

Контрольные точки

Как проверить результат

Применение отбора
Норма

В таблице остаются только строки, удовлетворяющие условию; снятие отбора возвращает все строки

Тревожный признак

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

Новая строка при включённом отборе
Норма

Строка добавляется и либо соответствует отбору, либо пользователь предупреждён, что она скрыта

Тревожный признак

Строка исчезает сразу после ввода без объяснений

Запись и проведение
Норма

Документ проводится по всем строкам, скрытые строки сохраняются

Тревожный признак

Скрытые строки теряются при записи — признак того, что данные хранятся не в объекте, а только в таблице формы

Итоги по колонкам
Норма

Пользователь видит итог по отобранным строкам или явно понимает, что итог общий

Тревожный признак

Итоговая сумма не совпадает с суммой видимых строк и вводит в заблуждение

Типичные ошибки
01
Присваивать ОтборСтрок данным объекта вместо элемента формы в управляемом приложении — отбор просто не применится
02
Использовать в фиксированном отборе несовпадающие типы (строка вместо ссылки) — строки не найдутся, таблица станет пустой
03
Удалять «ненужные» строки из табличной части вместо отбора — данные документа теряются безвозвратно после записи
04
Забыть снять отбор при изменении контекста — пользователь не видит нужные строки и считает это ошибкой программы
05
Применять отбор в ПриОткрытии до загрузки данных формы — отбор сбрасывается или даёт непредсказуемый результат

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

Если фильтр нужен постоянно, вынесите реквизит-условие (например, «Показывать только мой склад») на форму рядом с таблицей и применяйте отбор в обработчике ПриИзменении. Так пользователь сам управляет видимостью строк, и не нужно создавать отдельные команды и кнопки.
ПЗ
Практическое замечание

Частые вопросы

Можно ли скрыть строки табличной части без программирования?

Стандартной пользовательской настройки «скрыть строки» у табличной части документа нет — в отличие от динамических списков, где отбор доступен через «Ещё → Настроить список». Для табличных частей фильтр нужно добавлять в конфигураторе или через расширение. В некоторых типовых документах есть готовые команды фильтрации (например, по складу или подразделению) — проверьте меню «Ещё» табличной части.

Почему после установки ОтборСтрок таблица стала пустой?

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

Скрытые отбором строки участвуют в проведении документа?

Да. Отбор влияет только на отображение в форме. При записи, проведении, расчёте итогов и печати учитываются все строки табличной части, включая скрытые. Если нужно исключить строки из проведения, их придётся удалять или помечать отдельным реквизитом с учётом в логике проведения.

Как скрыть строки по условию «не равно» или «в списке»?

Фиксированное соответствие в управляемой форме поддерживает только равенство. Обходные пути: добавить служебный реквизит-флаг и фильтровать по нему, вывести данные в отдельную таблицу значений с программным заполнением или использовать динамический список, где доступны все виды сравнения.

Как показать пользователю, что часть строк скрыта?

Добавьте на форму декорацию-надпись вида «Показано 5 из 12 строк» и обновляйте её при применении и снятии отбора. Количество отобранных строк можно получить через НайтиСтроки с тем же условием по данным объекта, а общее число — через Количество() табличной части.

Работает ли ОтборСтрок на мобильной платформе и в веб-клиенте?

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

Итог

Что важно запомнить

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