Как программно удалить последнюю строку табличной части и управлять доступностью кнопки в 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Анализ задачи и типичные ошибки при удалении строк

Рассмотрим ситуацию: у нас есть табличная часть Услуга. Нам необходимо создать команду, которая при нажатии удаляет самую последнюю строку. Первая сложность, с которой сталкиваются начинающие разработчики, — это индексация коллекций в 1С. В языке программирования 1С индексация строк в табличных частях (как и в массивах) начинается с нуля.

Проанализируем ошибочный код, который часто встречается на практике:


СЧ = Объект.Услуга.Количество();
Если СЧ > 0 Тогда 
    Объект.Услуга.Удалить(СЧ); // Ошибка!
КонецЕсли;

Почему этот код не работает? Метод Удалить() ожидает индекс строки. Если в таблице 5 строк, то метод Количество() вернет число 5. Однако индексы строк будут идти от 0 до 4. Попытка удалить строку с индексом 5 вызовет ошибку «Индекс находится за пределами границы», так как строки с таким номером не существует. Выясним причину: нам нужно передать значение Количество - 1.

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


КоличествоСтрок = Объект.Услуга.Количество();
Если КоличествоСтрок > 0 Тогда
    // Удаляем строку по индексу (общее количество минус один)
    Объект.Услуга.Удалить(КоличествоСтрок - 1);
КонецЕсли;

Управление доступностью кнопок через элементы формы

Теперь разберем вторую часть задачи: как сделать кнопку «Удалить» недоступной, если в таблице не осталось данных. Для этого мы будем использовать свойство Доступность (в английском варианте Enabled) элемента формы, который связан с нашей командой.

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

Рассмотрим пример кода для управления доступностью:


// Если количество строк больше 0, доступность будет Истина, иначе Ложь
Элементы.УслугаУдалить.Доступность = (Объект.Услуга.Количество() > 0);

Где разместить код проверки доступности?

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

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

Рекомендуется создать общую процедуру на клиенте и вызывать её из этих событий:


&НаКлиенте
Процедура ОбновитьДоступностьКнопок()
    Колво = Объект.Услуга.Количество();
    Элементы.ФормаУдалитьПоследнююСтроку.Доступность = (Колво > 0);
КонецПроцедуры

&НаКлиенте
Процедура УслугаПриИзменении(Элемент)
    ОбновитьДоступностьКнопок();
КонецПроцедуры

&НаКлиенте
Процедура УслугаПослеУдаления(Элемент)
    ОбновитьДоступностьКнопок();
КонецПроцедуры

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


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

Важно: Не размещайте в этом событии тяжелые серверные вызовы, так как оно срабатывает очень часто.

Разница между Доступностью и Видимостью

В процессе разработки часто возникает вопрос: что лучше — скрывать кнопку совсем (Видимость) или делать её неактивной (Доступность)?

  1. Доступность: Кнопка остается на месте, но становится серой. Это лучший вариант для UX (пользовательского опыта), так как элементы интерфейса не «прыгают», и пользователь понимает, что функция удаления в принципе существует, но сейчас недоступна.
  2. Видимость: Кнопка исчезает. Это может запутать пользователя («куда делась кнопка?»), но позволяет максимально разгрузить интерфейс.

Мы рекомендуем использовать именно Доступность для команд редактирования таблиц.

Полный пример реализации команды удаления

Объединим всё вышесказанное в единый блок кода, который можно использовать в модуле управляемой формы. Предположим, ваша команда называется УдалитьПоследнюю, а кнопка на форме — ФормаУдалитьПоследнюю.


&НаКлиенте
Процедура УдалитьПоследнюю(Команда)
    
    // 1. Получаем текущее количество строк
    КоличествоСтрок = Объект.Услуга.Количество();
    
    // 2. Проверяем наличие строк перед удалением
    Если КоличествоСтрок > 0 Тогда
        // Удаляем последнюю строку (индекс = Кол-во - 1)
        Объект.Услуга.Удалить(КоличествоСтрок - 1);
    КонецЕсли;
    
    // 3. Обновляем состояние кнопки сразу после действия
    ОбновитьСостояниеИнтерфейса();
    
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСостояниеИнтерфейса()
    // Проверяем количество строк для управления доступностью
    ЕстьСтроки = (Объект.Услуга.Количество() > 0);
    Элементы.ФормаУдалитьПоследнюю.Доступность = ЕстьСтроки;
КонецПроцедуры

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

← На главную