В разработке на платформе 1С:Предприятие 8.3 часто возникает задача сделать интерфейс более «отзывчивым» и интуитивно понятным для пользователя. Один из классических примеров — управление доступностью команд. Если табличная часть пуста, кнопка «Удалить» не должна быть активной, чтобы не вводить пользователя в заблуждение. В этой статье мы подробно разберем, как реализовать удаление именно последней строки и как правильно связать состояние интерфейса с данными таблицы.
Рассмотрим ситуацию: у нас есть табличная часть Услуга. Нам необходимо создать команду, которая при нажатии удаляет самую последнюю строку. Первая сложность, с которой сталкиваются начинающие разработчики, — это индексация коллекций в 1С. В языке программирования 1С индексация строк в табличных частях (как и в массивах) начинается с нуля.
Проанализируем ошибочный код, который часто встречается на практике:
СЧ = Объект.Услуга.Количество();
Если СЧ > 0 Тогда
Объект.Услуга.Удалить(СЧ); // Ошибка!
КонецЕсли;
Почему этот код не работает? Метод Удалить() ожидает индекс строки. Если в таблице 5 строк, то метод Количество() вернет число 5. Однако индексы строк будут идти от 0 до 4. Попытка удалить строку с индексом 5 вызовет ошибку «Индекс находится за пределами границы», так как строки с таким номером не существует. Выясним причину: нам нужно передать значение Количество - 1.
Правильный алгоритм удаления последней строки выглядит следующим образом:
КоличествоСтрок = Объект.Услуга.Количество();
Если КоличествоСтрок > 0 Тогда
// Удаляем строку по индексу (общее количество минус один)
Объект.Услуга.Удалить(КоличествоСтрок - 1);
КонецЕсли;
Теперь разберем вторую часть задачи: как сделать кнопку «Удалить» недоступной, если в таблице не осталось данных. Для этого мы будем использовать свойство Доступность (в английском варианте Enabled) элемента формы, который связан с нашей командой.
Доступ к кнопкам на форме осуществляется через коллекцию Элементы. Важно понимать разницу между командой и кнопкой. Команда описывает логику (что произойдет), а кнопка — это визуальный элемент на форме. Мы будем управлять именно визуальным элементом.
Рассмотрим пример кода для управления доступностью:
// Если количество строк больше 0, доступность будет Истина, иначе Ложь
Элементы.УслугаУдалить.Доступность = (Объект.Услуга.Количество() > 0);
Просто написать код недостаточно, нужно определить событие, в котором он будет выполняться. Рассмотрим несколько вариантов размещения логики, чтобы интерфейс всегда оставался актуальным.
Вариант 1. В обработчиках изменения таблицы.
Это наиболее точный метод. Нам нужно отслеживать моменты, когда состав строк меняется. Основные события табличной части на форме:
ПриИзменении — срабатывает при добавлении или окончании редактирования строки.ПослеУдаления — срабатывает сразу после того, как строка была удалена.Рекомендуется создать общую процедуру на клиенте и вызывать её из этих событий:
&НаКлиенте
Процедура ОбновитьДоступностьКнопок()
Колво = Объект.Услуга.Количество();
Элементы.ФормаУдалитьПоследнююСтроку.Доступность = (Колво > 0);
КонецПроцедуры
&НаКлиенте
Процедура УслугаПриИзменении(Элемент)
ОбновитьДоступностьКнопок();
КонецПроцедуры
&НаКлиенте
Процедура УслугаПослеУдаления(Элемент)
ОбновитьДоступностьКнопок();
КонецПроцедуры
Вариант 2. Использование события «ПриОбновленииОтображения».
Этот обработчик формы вызывается платформой автоматически при любом изменении состояния данных или фокуса. Проанализируем ситуацию: если мы пропишем условие здесь, кнопка будет блокироваться мгновенно, как только таблица станет пустой, без необходимости прописывать вызовы в каждом событии таблицы.
&НаКлиенте
Процедура ПриОбновленииОтображения()
// Платформа сама вызовет этот код, когда нужно обновить экран
Элементы.ФормаУдалитьПоследнююСтроку.Доступность = (Объект.Услуга.Количество() > 0);
КонецПроцедуры
Важно: Не размещайте в этом событии тяжелые серверные вызовы, так как оно срабатывает очень часто.
В процессе разработки часто возникает вопрос: что лучше — скрывать кнопку совсем (Видимость) или делать её неактивной (Доступность)?
Мы рекомендуем использовать именно Доступность для команд редактирования таблиц.
Объединим всё вышесказанное в единый блок кода, который можно использовать в модуле управляемой формы. Предположим, ваша команда называется УдалитьПоследнюю, а кнопка на форме — ФормаУдалитьПоследнюю.
&НаКлиенте
Процедура УдалитьПоследнюю(Команда)
// 1. Получаем текущее количество строк
КоличествоСтрок = Объект.Услуга.Количество();
// 2. Проверяем наличие строк перед удалением
Если КоличествоСтрок > 0 Тогда
// Удаляем последнюю строку (индекс = Кол-во - 1)
Объект.Услуга.Удалить(КоличествоСтрок - 1);
КонецЕсли;
// 3. Обновляем состояние кнопки сразу после действия
ОбновитьСостояниеИнтерфейса();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьСостояниеИнтерфейса()
// Проверяем количество строк для управления доступностью
ЕстьСтроки = (Объект.Услуга.Количество() > 0);
Элементы.ФормаУдалитьПоследнюю.Доступность = ЕстьСтроки;
КонецПроцедуры
Таким образом, мы обеспечили надежную работу программы: исключили возможность ошибки при попытке удаления из пустой таблицы и сделали интерфейс живым и предсказуемым. Помните, что чистота кода и удобство пользователя — это залог качественной разработки в системе 1С:Предприятие.