При проектировании сложных документов в среде 1С:Предприятие 8.3 разработчики часто сталкиваются с проблемой «перегруженных» табличных частей. Когда количество колонок превышает 15–20 штук, пользователю становится крайне неудобно работать с документом: появляется бесконечная горизонтальная прокрутка, теряется фокус ввода, повышается вероятность ошибок при заполнении реквизитов.
Логичным решением в такой ситуации является визуальное разделение колонок одной табличной части по тематическим вкладкам (страницам) формы. В этой статье мы подробно разберем по шагам, как правильно реализовать данный механизм, проанализируем основные подводные камни и выясним причины возможных ошибок интерфейса.
Для реализации подобного интерфейса на управляемых формах 1С существуют два принципиально разных подхода. Рассмотрим подробнее каждый из них.
Способ 1. Создание нескольких элементов формы типа «Таблица»
При этом подходе для каждой вкладки на форме создается отдельный визуальный элемент Таблица. Однако свойство ПутьКДанным (DataPath) у всех этих таблиц указывает на один и тот же реквизит — Объект.ИмяВашейТЧ. На первой вкладке в таблицу выводятся одни колонки, на второй — другие.
Этот способ интуитивно понятен, но таит в себе технические сложности (подводные камни), связанные с синхронизацией строк и поведением стандартных команд платформы.
Способ 2. Один визуальный элемент «Таблица» с динамическим управлением видимостью (Рекомендуемый)
На форме размещается только один визуальный элемент Таблица. Сама группа страниц (вкладок) используется исключительно как декоративный переключатель. При смене вкладки пользователем программно меняется свойство Видимость у колонок этой единственной таблицы.
Этот способ является наиболее стабильным, поскольку исключает любые проблемы с синхронизацией активной строки, фокусом ввода и командными панелями.
---
Если специфика вашей задачи требует создания физически разных таблиц на разных вкладках формы, вам придется программно обойти стандартные ограничения платформы. Разберем основные проблемы и способы их решения.
Поскольку таблицы на разных вкладках ссылаются на одну и ту же коллекцию данных, при переключении пользователя между закладками фокус (активная строка) в другой таблице может сбиваться. Выясним причину: платформа обновляет данные, но не позиционирует курсор на той же строке автоматически.
Чтобы решить эту проблему, нам потребуется синхронизировать индекс текущей строки. Напишем код в модуле формы:
&НаКлиенте
Процедура Товары1ПриАктивизацииСтроки(Элемент)
ТекущаяСтрокаИД = Элементы.Товары1.ТекущаяСтрока;
Если ТекущаяСтрокаИД <> Неопределено Тогда
// Проверяем, отличается ли активная строка во второй таблице, и синхронизируем её
Если Элементы.Товары2.ТекущаяСтрока <> ТекущаяСтрокаИД Тогда
Элементы.Товары2.ТекущаяСтрока = ТекущаяСтрокаИД;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Товары2ПриАктивизацииСтроки(Элемент)
ТекущаяСтрокаИД = Элементы.Товары2.ТекущаяСтрока;
Если ТекущаяСтрокаИД <> Неопределено Тогда
// Синхронизируем первую таблицу при работе во второй
Если Элементы.Товары1.ТекущаяСтрока <> ТекущаяСтрокаИД Тогда
Элементы.Товары1.ТекущаяСтрока = ТекущаяСтрокаИД;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При использовании нескольких таблиц стандартные командные панели (кнопки «Добавить», «Удалить», «Скопировать») могут запутать пользователя. Если нажать «Добавить» на Вкладке 1, пустая строка создается в коллекции. Перейдя на Вкладку 2, пользователь увидит эту пустую строку, но ключевые поля (например, Номенклатура), которые остались на Вкладке 1, будут скрыты.
Решение: Рекомендуется использовать единую командную панель для всей группы страниц либо дублировать ключевые идентификационные колонки на всех вкладках. Также можно программно переопределять стандартные команды добавления строк, чтобы гарантировать корректное заполнение обязательных реквизитов.
Представим ситуацию: на Вкладке 2 есть обязательное для заполнения поле (например, СчетУчета), у которого в конфигураторе свойство Проверка заполнения установлено в значение Выдавать ошибку. Пользователь находится на Вкладке 1, заполняет видимые данные и нажимает кнопку «Записать».
Платформа выдаст ошибку заполнения и обведет красной рамкой незаполненное поле. Но так как это поле находится на скрытой Вкладке 2, пользователь не увидит визуального предупреждения и не поймет, в чем дело. Для решения этой проблемы напишем обработчик проверки заполнения на клиенте:
&НаКлиенте
Процедура ПередЗаписьюНаКлиенте(Отказ, ПараметрыЗаписи)
// Обходим табличную часть и проверяем заполнение обязательных полей на скрытых вкладках
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если Не ЗначениеЗаполнено(СтрокаТЧ.СчетУчета) Тогда
Отказ = Истина;
// Программный переход на вкладку, где расположено незаполненное поле
Элементы.ГруппаСтраницыДокумента.ТекущаяСтраница = Элементы.ГруппаБухгалтерскиеДанные;
// Активизируем нужную строку и колонку для удобства пользователя
Элементы.ТаблицаТоварыБухучет.ТекущаяСтрока = СтрокаТЧ.ПолучитьИдентификатор();
Элементы.ТаблицаТоварыБухучет.ТекущийЭлемент = Элементы.ТаблицаТоварыБухучетСчетУчета;
ПоказатьПредупреждение(, "Необходимо заполнить счет учета на вкладке 'Бухучет'!");
Прервать;
EndIf;
КонецЦикла;
КонецПроцедуры
---
Теперь проанализируем более изящный способ, который рекомендуют ведущие специалисты по разработке интерфейсов 1С. Мы размещаем на форме одну таблицу, а переключение страниц используем как триггер для изменения видимости колонок.
ГруппаВкладкиТаблицы) и установите свойство ОтображениеСтраниц в значение Закладки.СтраницаОсновные и СтраницаДополнительно). При этом сами таблицы внутрь этих страниц переносить не нужно!Таблица (связанный с вашей ТЧ) под группой страниц или в основной области формы.ПриСменеСтраницы для группы страниц и опишите в нем управление видимостью колонок.Посмотрим на пример реализации программного управления видимостью:
&НаКлиенте
Процедура ГруппаВкладкиТаблицыПриСменеСтраницы(Элемент, ТекущаяСтраница)
ИмяАктивнойСтраницы = ТекущаяСтраница.Имя;
УправлениеВидимостьюКолонок(ИмяАктивнойСтраницы);
КонецПроцедуры
&НаКлиенте
Процедура УправлениеВидимостьюКолонок(ИмяСтраницы)
// Определяем видимость групп колонок в зависимости от выбранной вкладки
ВидимостьОсновных = (ИмяСтраницы = "СтраницаОсновные");
ВидимостьДополнительных = (ИмяСтраницы = "СтраницаДополнительно");
// Управляем свойствами элементов формы
Элементы.ТоварыКоличество.Видимость = ВидимостьОсновных;
Элементы.ТоварыЦена.Видимость = ВидимостьОсновных;
Элементы.ТоварыСумма.Видимость = ВидимостьОсновных;
Элементы.ТоварыСчетУчета.Видимость = ВидимостьДополнительных;
Элементы.ТоварыСчетНДС.Видимость = ВидимостьДополнительных;
Элементы.ТоварыСтатьяЗатрат.Видимость = ВидимостьДополнительных;
КонецПроцедуры
Используя этот метод, мы полностью избавляемся от необходимости синхронизировать строки и управлять множеством командных панелей. Интерфейс работает плавно и предсказуемо для конечного пользователя.
---
При проектировании форм документов с большими табличными частями фирма «1С» рекомендует придерживаться следующих правил эргономики:
ФиксацияСлева в значение Фиксировать.Группа колонок с типом группы Вместе или Вертикальная. Это позволяет компактно разместить в два раза больше информации в одной строке без потери читаемости.Резюмируя: разделение большой табличной части на несколько вкладок — это отличная и проверенная временем практика. Использование правильных методов синхронизации данных и динамического управления видимостью элементов позволит вам создать удобный, быстрый и безошибочный интерфейс для пользователей вашей системы.