НейроАгент

Смещение выделенного ряда в табличной форме 1С: полное руководство

Узнайте, как программно задать смещение выделенного ряда в табличной форме 1С. Полное руководство по выделению целых строк, ручному перемещению и аналогам Excel.

Как программно задать смещение выделенного ряда в табличной форме 1С? Возможно ли выделить весь ряд целиком в пользовательском режиме и сместить его вручную? Как выделить весь ряд сразу, а не по отдельным элементам? Как в Excel кликнуть на заголовок столбца для выделения всего ряда?

НейроАгент

В 1С программирование табличных форм существует несколько способов управления выделением строк и их смещением. Можно программно задать смещение выделенного ряда, выделить весь ряд целиком в пользовательском режиме и сместить его вручную, а также использовать различные методы выделения целого ряда вместо отдельных элементов, аналогично функции Excel с заголовками столбцов.

Содержание

Программное управление выделением строк

В 1С программное управление выделением строк в табличной форме осуществляется через объект формы и его элементы. Основные методы и свойства для работы с выделением включают:

  • Элементы.ТабличнаяФорма.ТекущаяСтрока - получение и установка текущей строки
  • Элементы.ТабличнаяФорма.ВыделенныеСтроки - коллекция выделенных строк
  • Элементы.ТабличнаяФорма.ВыделитьСтроку() - метод для выделения строки

Для программного задания смещения выделенного ряда можно использовать следующий подход:

1c
// Получаем текущую выделенную строку
ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;

// Если строка выделена
Если ТекущаяСтрока <> Неопределено Тогда
    // Получаем индекс текущей строки
    ИндексСтроки = ТекущаяСтрока.Индекс;
    
    // Задаем смещение (например, на 2 позиции вниз)
    Смещение = 2;
    НовыйИндекс = ИндексСтроки + Смещение;
    
    // Проверяем, что новый индекс находится в пределах таблицы
    Если НовыйИндекс >= 0 И НовыйИндекс < Элементы.ТабличнаяФорма.Строки.Количество() Тогда
        // Устанавливаем новую текущую строку
        Элементы.ТабличнаяФорма.ТекущаяСтрока = Элементы.ТабличнаяФорма.Строки[НовыйИндекс];
    КонецЕсли;
КонецЕсли;

Выделение нескольких строк и их массовое смещение также возможно через коллекцию ВыделенныеСтроки:

1c
// Получаем коллекцию выделенных строк
ВыделенныеСтроки = Элементы.ТабличнаяФорма.ВыделенныеСтроки;

// Если есть выделенные строки
Если ВыделенныеСтроки.Количество() > 0 Тогда
    // Задаем смещение
    Смещение = 1;
    
    // Проходим по выделенным строкам в обратном порядке
    // чтобы избежать проблем с изменением индексов
    Для i = ВыделенныеСтроки.Количество() - 1 По 0 Шаг -1 Цикл
        ТекущаяСтрока = ВыделенныеСтроки[i];
        НовыйИндекс = ТекущаяСтрока.Индекс + Смещение;
        
        // Проверяем границы
        Если НовыйИндекс >= 0 И НовыйИндекс < Элементы.ТабличнаяФорма.Строки.Количество() Тогда
            // Сдвигаем строку
            Элементы.ТабличнаяФорма.Строки.Переместить(НовыйИндекс, ТекущаяСтрока);
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Выделение всего ряда в пользовательском режиме

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

  1. Настройки табличной формы:

    • Свойство “Режим выделения” должно быть установлено в “Строка”
    • Должен быть разрешен режим редактирования
  2. Ручное смещение строк:

    • Выделите строку кликом на заголовке строки (обычно слева)
    • Перетащите выделенную строку в новое положение
    • Или используйте кнопки перемещения в панели инструментов

Для программной поддержки ручного перемещения строк необходимо:

1c
// В обработчике события НачалоПереноса
&НаКлиенте
Процедура ТабличнаяФормаНачалоПереноса(Элемент, ПеретаскиваемыеДанные, Источник)
    // Проверяем, что перетаскивается строка таблицы
    Если ТипЗнч(Источник) = Тип("СтрокаТабличнойЧасти") Тогда
        // Разрешаем операцию
        ПеретаскиваемыеДанные.Допустимо = Истина;
    КонецЕсли;
КонецПроцедуры

// В обработчике события ЗавершениеПереноса
&НаКлиенте
Процедура ТабличнаяФормаЗавершениеПереноса(Элемент, ПеретаскиваемыеДанные, Цель)
    // Обрабатываем завершение переноса
    Если ТипЗнч(Цель) = Тип("СтрокаТабличнойЧасти") Тогда
        // Можно добавить дополнительную логику
        Сообщить("Строка успешно перемещена");
    КонецЕсли;
КонецПроцедуры

Методы выделения целого ряда

В 1С существует несколько способов выделить целый ряд сразу, а не по отдельным элементам:

1. Через заголовки строк

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

1c
// Настройка отображения заголовков строк
Элементы.ТабличнаяФорма.ПоказыватьЗаголовкиСтрок = Истина;

2. Выделение по первому столбцу

Можно настроить выделение всей строки при клике на первом столбце:

1c
// В обработчике события НачалоВыбора
&НаКлиенте
Процедура ТабличнаяФормаНачалоВыбора(Элемент, СтандартнаяОбработка, ВыбранноеЗначение, Источник)
    // Если кликнули на первом столбце
    Если Элемент.Имя = "ПервыйСтолбец" Тогда
        // Выделяем всю строку
        СтандартнаяОбработка = Ложь;
        Элементы.ТабличнаяФорма.ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
    КонецЕсли;
КонецПроцедуры

3. Массовое выделение строк

Для выделения нескольких строк сразу используйте клавиатурные сочетания:

  • Ctrl + клик - выделение нескольких несмежных строк
  • Shift + клик - выделение диапазона строк
1c
// Программное выделение диапазона строк
&НаКлиенте
Процедура ВыделитьДиапазонСтрок(НачальныйИндекс, КонечныйИндекс)
    // Очищаем текущее выделение
    Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
    
    // Выделяем строки в диапазоне
    Для i = НачальныйИндекс По КонечныйИндекс Цикл
        Если i < Элементы.ТабличнаяФорма.Строки.Количество() Тогда
            Элементы.ТабличнаяФорма.ВыделитьСтроку(Элементы.ТабличнаяФорма.Строки[i], Истина);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Аналогия с Excel и реализация в 1С

В Excel клик на заголовке столбца выделяет весь столбец, а клик на заголовке строки - всю строку. В 1С можно реализовать аналогичную функциональность:

Выделение столбца по заголовку

1c
// В обработчике события ЗаголовокОформления
&НаКлиенте
Процедура ТабличнаяФормаЗаголовокОформления(Элемент, Оформление, ДанныеСтроки)
    // Если это заголовок столбца
    Если Оформление.ЭлементФормы.Заголовок Тогда
        // Добавляем обработчик клика
        Оформление.ЭлементФормы.УстановитьДействие("Нажатие", "ВыделитьВесьСтолбец");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыделитьВесьСтолбец(Элемент)
    // Получаем индекс столбца
    ИндексСтолбца = Элемент.Индекс;
    
    // Выделяем все строки в этом столбце
    Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
    
    Для Каждая Строка Из Элементы.ТабличнаяФорма.Строки Цикл
        Элементы.ТабличнаяФорма.ВыделитьСтроку(Строка, Истина);
    КонецЦикла;
    
    // Устанавливаем фокус на столбец
    Элементы.ТабличнаяФорма.ТекущийСтолбец = ИндексСтолбца;
КонецПроцедуры

Выделение строки по заголовку

1c
// В обработчике события ЗаголовокОформления
&НаКлиенте
Процедура ТабличнаяФормаЗаголовокОформления(Элемент, Оформление, ДанныеСтроки)
    // Если это заголовок строки
    Если Оформление.ЭлементФормы.ТипЗаголовка = ТипЗаголовкаСтроки.Строка Тогда
        // Добавляем обработчик клика
        Оформление.ЭлементФормы.УстановитьДействие("Нажатие", "ВыделитьВсюСтроку");
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыделитьВсюСтроку(Элемент)
    // Получаем строку по заголовку
    Строка = Элементы.ТабличнаяФорма.Строки[Элемент.Индекс];
    
    // Выделяем только эту строку
    Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
    Элементы.ТабличнаяФорма.ВыделитьСтроку(Строка, Истина);
    
    // Устанавливаем фокус на строку
    Элементы.ТабличнаяФорма.ТекущаяСтрока = Строка;
КонецПроцедуры

Практические примеры кода

Пример 1: Перемещение выделенных строк вверх

1c
&НаКлиенте
Процедура ПереместитьВыделенныеСтрокиВверх(Команда)
    ВыделенныеСтроки = Элементы.ТабличнаяФорма.ВыделенныеСтроки;
    
    Если ВыделенныеСтроки.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    // Сортируем выделенные строки по индексу
    ВыделенныеСтроки.Сортировать("Индекс");
    
    // Перемещаем каждую строку вверх
    Для Каждая Строка Из ВыделенныеСтроки Цикл
        Индекс = Строка.Индекс;
        Если Индекс > 0 Тогда
            Элементы.ТабличнаяФорма.Строки.Переместить(Индекс - 1, Строка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

1c
&НаКлиенте
Процедура ТабличнаяФормаПриНажатииКлавиши(Элемент, Клавиша, ОбработкаКлавиши)
    // Ctrl+A - выделить все строки
    Если Клавиша = Клавиши.Ctrl + "A" Тогда
        Элементы.ТабличнаяФорма.ВыделенныеСтроки.Очистить();
        
        Для Каждая Строка Из Элементы.ТабличнаяФорма.Строки Цикл
            Элементы.ТабличнаяФорма.ВыделитьСтроку(Строка, Истина);
        КонецЦикла;
        
        ОбработкаКлавиши = Истина;
        Возврат;
    КонецЕсли;
    
    // Ctrl+Up - выделить строку выше
    Если Клавиша = Клавиши.Ctrl + Клавиши.Up Тогда
        ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
        Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс > 0 Тогда
            НоваяСтрока = Элементы.ТабличнаяФорма.Строки[ТекущаяСтрока.Индекс - 1];
            Элементы.ТабличнаяФорма.ТекущаяСтрока = НоваяСтрока;
            Элементы.ТабличнаяФорма.ВыделитьСтроку(НоваяСтрока, Истина);
        КонецЕсли;
        
        ОбработкаКлавиши = Истина;
        Возврат;
    КонецЕсли;
    
    // Ctrl+Down - выделить строку ниже
    Если Клавиша = Клавиши.Ctrl + Клавиши.Down Тогда
        ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
        Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс < Элементы.ТабличнаяФорма.Строки.Количество() - 1 Тогда
            НоваяСтрока = Элементы.ТабличнаяФорма.Строки[ТекущаяСтрока.Индекс + 1];
            Элементы.ТабличнаяФорма.ТекущаяСтрока = НоваяСтрока;
            Элементы.ТабличнаяФорма.ВыделитьСтроку(НоваяСтрока, Истина);
        КонецЕсли;
        
        ОбработкаКлавиши = Истина;
        Возврат;
    КонецЕсли;
КонецПроцедуры

Пример 3: Контекстное меню для управления строками

1c
// В модуле формы
&НаКлиенте
Функция ПолучитьКонтекстноеМенюДляСтроки(Элемент, ДанныеСтроки) Экспорт
    Команды = Новый СписокЗначений;
    
    // Добавляем команды управления строкой
    Команды.Добавить("Переместить вверх", "Переместить строку вверх", "ВыполнитьПеремещениеВверх");
    Команды.Добавить("Переместить вниз", "Переместить строку вниз", "ВыполнитьПеремещениеВниз");
    Команды.Добавить("Дублировать", "Скопировать строку", "ВыполнитьДублированиеСтроки");
    Команды.Добавить("Удалить", "Удалить строку", "ВыполнитьУдалениеСтроки");
    
    Возврат Команды;
КонецФункции

&НаКлиенте
Процедура ВыполнитьПеремещениеВверх(Команда)
    ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс > 0 Тогда
        Элементы.ТабличнаяФорма.Строки.Переместить(ТекущаяСтрока.Индекс - 1, ТекущаяСтрока);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПеремещениеВниз(Команда)
    ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Индекс < Элементы.ТабличнаяФорма.Строки.Количество() - 1 Тогда
        Элементы.ТабличнаяФорма.Строки.Переместить(ТекущаяСтрока.Индекс + 1, ТекущаяСтрока);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьДублированиеСтроки(Команда)
    ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено Тогда
        Копия = ТекущаяСтрока.Скопировать();
        Элементы.ТабличнаяФорма.Строки.Добавить(Копия);
        Элементы.ТабличнаяФорма.ТекущаяСтрока = Копия;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьУдалениеСтроки(Команда)
    ТекущаяСтрока = Элементы.ТабличнаяФорма.ТекущаяСтрока;
    Если ТекущаяСтрока <> Неопределено Тогда
        Элементы.ТабличнаяФорма.Строки.Удалить(ТекущаяСтрока);
    КонецЕсли;
КонецПроцедуры

Заключение

Программирование табличных форм в 1С предоставляет широкие возможности для управления выделением и перемещением строк. Основные выводы:

  1. Программное управление выделением осуществляется через свойства ТекущаяСтрока и ВыделенныеСтроки, а также методы выделения строк.

  2. Ручное выделение и перемещение строк возможно в пользовательском режиме при правильной настройке табличной формы и разрешении операций переноса.

  3. Целостное выделение ряда достигается через заголовки строк, столбцов или программно через коллекции выделенных элементов.

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

  5. Практические рекомендации:

    • Используйте клавиатурные сочетания для быстрого выделения диапазонов
    • Реализуйте контекстные меню для удобного управления строками
    • Обрабатывайте события начала и завершения переноса для плавной работы с пользовательским интерфейсом
    • Проверяйте границы при программном перемещении строк

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

Источники

  1. Официальная документация 1С:Предприятие - Работа с табличными частями
  2. Руководство по программированию в 1С: Табличные документы и формы
  3. Библиотека разработчика 1С: Управление элементами форм
  4. Советы по оптимизации работы с табличными формами в 1С
  5. Примеры программного управления табличными формами