Часто при программной работе с формами в обычных приложениях 1С возникает ситуация: мы заполняем Таблицу Значений данными, например, из файла Excel, выводим ее на форму, а стандартные кнопки сортировки («По возрастанию», «По убыванию») на привязанной командной панели остаются неактивными. При этом, если добавить строку вручную, кнопки волшебным образом «оживают». Разберемся, почему так происходит и как это исправить раз и навсегда.
Проанализируем типичный сценарий: есть форма, на ней элемент ТабличноеПоле, связанный с реквизитом типа ТаблицаЗначений. Данные загружаются программно, после чего пользователь должен иметь возможность их интерактивно сортировать. Но кнопки неактивны, хотя их свойство Доступность установлено в Истина.
Ключевая причина такого поведения кроется в метаданных, а точнее, в отсутствии информации о типах данных в колонках вашей таблицы значений. Когда вы программно создаете колонки и загружаете в них данные из нетипизированного источника (например, через COM-объект для работы с Excel), платформа 1С не всегда может автоматически определить тип данных для всей колонки. В итоге колонка создается без типа.
Интерактивные механизмы формы, включая сортировку, поиск и отбор, не могут работать с «бестиповыми» колонками. Система просто не знает, как ей сравнивать значения: как строки, как числа или как даты? Именно поэтому кнопки сортировки деактивируются.
Когда вы добавляете строку вручную, платформа анализирует введенные данные, определяет их тип и присваивает его всей колонке. После этого система «понимает», как работать с данными, и активирует соответствующие кнопки на командной панели.
Самое правильное и надежное решение — всегда принудительно задавать тип для каждой колонки таблицы значений в момент ее создания. Это делается с помощью второго параметра метода Колонки.Добавить(), в который передается объект ОписаниеТипов.
Посмотрим на пример. Допустим, нам нужно создать таблицу для хранения номенклатуры, количества и даты поставки.
Шаг 1. Создаем объект ОписаниеТипов для каждой колонки
Сначала подготовим описания типов, которые нам понадобятся.
// Описание для строковой колонки
ТипСтрока = Новый ОписаниеТипов("Строка");
// Описание для числовой колонки с указанием разрядности и точности
// Например, число длиной 15 знаков, из которых 3 после запятой
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3));
// Описание для колонки с датой
ТипДата = Новый ОписаниеТипов("Дата");
Шаг 2. Создаем колонки с указанием типа
Теперь при добавлении колонок в таблицу значений передадим созданные описания типов.
// Создаем саму таблицу значений
МояТаблица = Новый ТаблицаЗначений;
// Добавляем типизированные колонки
МояТаблица.Колонки.Добавить("Наименование", ТипСтрока, "Товар");
МояТаблица.Колонки.Добавить("Количество", ТипЧисло, "Кол-во");
МояТаблица.Колонки.Добавить("ДатаПоставки", ТипДата, "Дата поставки");
После того как таблица будет создана таким образом и заполнена данными, стандартные кнопки сортировки на командной панели станут активны автоматически, так как платформа будет точно знать, как работать с данными в каждой колонке.
Помимо типизации колонок, убедитесь, что свойства самого элемента формы ТабличноеПоле настроены корректно. Без этих настроек даже правильно созданная таблица может отображаться с неактивными кнопками.
ИсточникДействий)ИсточникДействий должно быть указано ваше табличное поле. Обычно эта связь устанавливается автоматически, если вы добавляете командную панель через контекстное меню табличного поля, но проверить стоит.ТолькоПросмотр)ТолькоПросмотр. В этом режиме многие интерактивные действия, включая сортировку, могут быть заблокированы.ИзменятьПорядокСтрок)В процессе поиска решения часто пробуются методы, которые в данной ситуации не приносят результата. Давайте разберем их, чтобы понимать суть проблемы глубже.
ЭлементыФормы.Таблица.ОбновитьСтроки(): Этот метод заставляет форму перерисовать строки таблицы. Он полезен, если вы изменили данные в уже отображенной таблице и хотите увидеть изменения. Однако он не влияет на метаданные (структуру и типы колонок), поэтому проблему неактивных кнопок он не решит.МояТаблица.Сортировать(): Вы можете отсортировать данные в таблице программно сразу после загрузки.
// Сортировка по возрастанию наименования
МояТаблица.Сортировать("Наименование Возр");
Вывод: Утверждение, что стандартными кнопками можно сортировать только табличные части объектов, а не таблицы значений, является ошибочным. Таблица значений прекрасно поддерживает интерактивную сортировку. Главное — правильно ее инициализировать, задав типы данных для всех колонок. Это гарантирует корректную работу всех стандартных механизмов формы и избавляет от необъяснимого поведения интерфейса.