В отличие от современных версий платформы 1С:Предприятие 8, где табличные части документов и справочников обладают встроенным функционалом для управления строками (кнопки «Добавить», «Удалить», горячие клавиши), работа с таблицей значений (ТЗ) на форме в версии 7.7 требует от разработчика ручного описания всех интерактивных действий. Сама по себе таблица значений на форме является лишь средством визуализации данных, и чтобы пользователь мог управлять её содержимым, нам необходимо запрограммировать соответствующие механизмы.
В рамках этой статьи мы подробно разберем, как сделать работу с таблицей значений удобной и функциональной, рассмотрим стандартные методы удаления строк и способы имитации привычного интерфейса.
Самый простой и очевидный способ дать пользователю возможность удалять данные — это добавление специальной кнопки на форму. Разберем этот процесс по шагам.
Сначала нам необходимо разместить на форме кнопку и в её свойствах, в поле «Формула», прописать вызов процедуры или непосредственно программный код. Основным инструментом здесь выступает метод УдалитьСтроку(). Рассмотрим пример кода, который можно назначить кнопке:
Процедура УдалитьСтрокуИзТЗ()
// Проверяем, есть ли вообще строки в таблице
Если СписокТоваров.КоличествоСтрок() > 0 Тогда
// Удаляем текущую выделенную строку
СписокТоваров.УдалитьСтроку(СписокТоваров.ТекущаяСтрока());
Иначе
Предупреждение("Таблица пуста, удалять нечего!");
КонецЕсли;
КонецПроцедуры
Проанализируем этот код. Метод ТекущаяСтрока() возвращает индекс строки, на которой в данный момент установлен курсор. Если параметр в УдалитьСтроку() не указан, система попытается удалить текущую строку по умолчанию, однако явное указание индекса считается хорошим тоном и помогает избежать ошибок в сложных алгоритмах.
Пользователи привыкли, что строку можно удалить нажатием клавиши Delete. В 1С 7.7 таблица значений на форме «не ловит» нажатие этой клавиши автоматически. Чтобы реализовать такое поведение, мы можем прибегнуть к хитрости с использованием акселераторов.
Рассмотрим алгоритм создания «горячей» кнопки:
Del это работает иначе: в свойствах кнопки в поле «Сочетание клавиш» выбираем нужное значение (например, Alt+Del или Ctrl+Del).Таким образом, даже если фокус находится на таблице значений, нажатие выбранной комбинации клавиш активирует кнопку и выполнит код удаления.
Чтобы не загромождать форму множеством кнопок («Добавить», «Удалить», «Переместить»), мы можем реализовать вызов меню по двойному клику или по нажатию одной универсальной кнопки. Выясним, как это сделать с помощью объекта СписокЗначений.
В свойствах таблицы значений на форме есть поле «Формула». Прописанная там процедура будет выполняться при каждом клике по строке таблицы. Посмотрим на пример реализации такого меню:
Процедура ОбработкаТЗ()
Перем ВыбЗнач;
Меню = СоздатьОбъект("СписокЗначений");
Меню.ДобавитьЗначение("Добавить", "Добавить новую строку");
Меню.ДобавитьЗначение("Удалить", "Удалить текущую строку");
Меню.ДобавитьЗначение("Очистить", "Очистить всю таблицу");
// Показываем меню в координатах курсора
Если Меню.ВыбратьЗначение(ВыбЗнач, , , 1, ) = 1 Тогда
Если ВыбЗнач = "Добавить" Тогда
СписокТоваров.НоваяСтрока();
ИначеЕсли ВыбЗнач = "Удалить" Тогда
Если СписокТоваров.ТекущаяСтрока() > 0 Тогда
СписокТоваров.УдалитьСтроку();
КонецЕсли;
ИначеЕсли ВыбЗнач = "Очистить" Тогда
Если Вопрос("Очистить таблицу?", "Да+Нет") = "Да" Тогда
СписокТоваров.Очистить();
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот подход делает интерфейс более профессиональным и чистым. Мы используем метод ВыбратьЗначение(), который приостанавливает выполнение кода и выводит небольшое окно со списком доступных действий прямо под курсором мыши.
При программном манипулировании строками в 1С 7.7 крайне важно учитывать состояние интерфейса. Проанализируем несколько критических моментов:
1. Обновление формы. Иногда после удаления строки визуально таблица может не обновиться мгновенно. В таких случаях рекомендуется использовать команду Форма.Обновить(0). Параметр 0 позволяет обновить данные без перерисовки всей формы, что исключает неприятное мерцание экрана.
2. Проверка на наличие данных. Если вы попытаетесь вызвать ТекущаяСтрока() в пустой таблице, вы можете получить неожиданный результат или 0. Всегда окружайте логику удаления проверкой КоличествоСтрок() > 0. Это защитит вашу программу от аварийного завершения.
3. Подтверждение действия. Поскольку в 1С 7.7 нет встроенного механизма отмены последнего действия (Undo), хорошей практикой считается использование функции Вопрос() перед удалением. Рассмотрим пример безопасного удаления:
Если СписокТоваров.ТекущаяСтрока() > 0 Тогда
Если Вопрос("Удалить выбранную строку: " + СписокТоваров.Наименование + "?", "Да+Нет") = "Да" Тогда
СписокТоваров.УдалитьСтроку();
КонецЕсли;
КонецЕсли;
Если стандартных возможностей платформы вам недостаточно, стоит обратить внимание на внешние компоненты, такие как FormEx или 1С++. Они позволяют значительно расширить интерактивность таблиц значений.
Например, компонент FormEx позволяет перехватывать событие нажатия любой клавиши (включая одиночный Delete) именно тогда, когда фокус находится на конкретном элементе формы. Это избавляет от необходимости создавать скрытые кнопки. Кроме того, с помощью этих компонент можно реализовать раскраску строк, что визуально помогает пользователю понять, какая строка сейчас выбрана для удаления.
Объект ТабличноеПоле из состава 1С++ и вовсе заменяет стандартную таблицу значений на более мощный элемент управления, который поддерживает сортировку кликом по заголовку, множественное выделение строк (Multi-select) и полноценное управление с клавиатуры «из коробки».
Мы рассмотрели основные способы реализации интерактивного удаления строк в 1С 7.7. Несмотря на возраст платформы, комбинирование методов УдалитьСтроку(), ВыбратьЗначение() и грамотное использование событий формы позволяет создавать удобные интерфейсы, не уступающие по функциональности современным решениям. Начните с простых кнопок, а по мере усложнения задач переходите к реализации контекстных меню и использованию внешних компонент.