Как использовать интерактивные таблицы в 1С 7.7 и почему не срабатывает ПриВыбореЯчейкиТаблицы

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Разбор ситуации: Режим ввода данных vs Печатная форма

Основная причина, по которой процедура ПриВыбореЯчейкиТаблицы может не вызываться, заключается в фундаментальном различии типов таблиц в 1С 7.7. Проанализируем это различие. Данная предопределенная процедура предназначена исключительно для таблиц, работающих в «Режиме ввода данных» (РВД). Такие таблицы обычно являются элементами диалога формы и не формируются построчно с помощью метода ВывестиСекцию().

Если ваша таблица формируется программно (выводятся шапка, строки и подвал), то это объект типа «Таблица» (отчет), а не форма ввода. В этом случае попытка использовать ПриВыбореЯчейкиТаблицы обречена на провал, так как платформа просто не генерирует это событие для документов такого типа. Выясним, как обойти это ограничение.

Использование процедуры ОбработкаЯчейкиТаблицы

Для интерактивной работы с программно выведенными таблицами в 1С 7.7 существует другой механизм — предопределенная процедура ОбработкаЯчейкиТаблицы. Она срабатывает при двойном щелчке мыши или нажатии Enter на ячейке. Чтобы этот механизм заработал, необходимо выполнить два условия:

  1. Установить у таблицы режим «Только просмотр»: Таб.ТолькоПросмотр(1).
  2. Для конкретной ячейки в конфигураторе (в макете таблицы) в поле «Расшифровка» должно быть указано какое-либо значение или выражение.

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


Процедура ОбработкаЯчейкиТаблицы(Значение, СтандартнаяОбработка, Таб, Адрес)
    // Отключаем стандартное открытие карточки объекта, если это нужно
    СтандартнаяОбработка = 0;
    
    // Парсим адрес ячейки, чтобы понять, где кликнул пользователь
    // Адрес обычно приходит в формате "R1C1:R1C1"
    ПозКолонки = Найти(Адрес, "C");
    СтрокаНомер = Число(Сред(Адрес, 2, ПозКолонки - 2));
    КолонкаНомер = Число(Сред(Адрес, ПозКолонки + 1));
    
    Если СтрокаНомер = Таб.ВысотаТаблицы() Тогда
        Если КолонкаНомер = 9 Тогда
            Предупреждение("Нажата кнопка сохранения!");
            // Здесь ваш код сохранения в Excel
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Одной из самых сложных задач в 1С 7.7 является «живой» пересчет итогов в таблице при удалении строк пользователем. Дело в том, что в платформе отсутствует событие, возникающее непосредственно в момент удаления строки пользователем (через клавишу Del или контекстное меню).

Когда вы устанавливаете Таб.ТолькоПросмотр(0), вы разрешаете пользователю редактировать таблицу и удалять строки, но при этом отключается механизм расшифровок. Это означает, что процедура ОбработкаЯчейкиТаблицы перестанет вызываться, и ваши «кнопки» внутри таблицы перестанут реагировать на клики.

Проанализируем возможные пути решения этой проблемы:

  1. Разделение процессов: Сначала пользователь удаляет строки в режиме редактирования (ТолькоПросмотр(0)), затем программно или вручную включается режим защиты (ТолькоПросмотр(1)), и только после этого нажимается кнопка «Пересчитать» или «Выгрузить».
  2. Использование внешней обработки с Таблицей Значений (ТЗ): Это наиболее надежный и профессиональный метод. Вместо того чтобы заставлять пользователя удалять строки в печатной форме, выведите данные в Таблицу Значений на форме обработки. Там гораздо проще отловить события удаления строк, а после редактирования состава данных — вывести финальную печатную форму.

Программный пересчет суммы по колонке

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


Функция ПересчитатьИтог(Таб, НомерКолонки, ПерваяСтрокаДанных)
    ОбщаяСумма = 0;
    ВсегоСтрок = Таб.ВысотаТаблицы();
    
    // Предположим, что итог находится в последней строке, 
    // поэтому идем до ВысотаТаблицы() - 1
    Для н = ПерваяСтрокаДанных По ВсегоСтрок - 1 Цикл
        // Получаем текст из ячейки
        ТекстЯчейки = Таб.Область(н, НомерКолонки).Текст;
        
        // Очищаем строку от пробелов (разделителей триад), 
        // иначе функция Число() вернет 0
        ЧистоеЗначение = СтрЗаменить(ТекстЯчейки, " ", "");
        ОбщаяСумма = ОбщаяСумма + Число(ЧистоеЗначение);
    КонецЦикла;
    
    Возврат ОбщаяСумма;
КонецФункции

Важный нюанс: Чтобы результат функции Число() был корректным, необходимо убедиться, что в ячейках нет нечисловых символов (кроме точки/запятой). В 1С 7.7 разделитель групп разрядов (пробел) часто мешает прямому преобразованию типов, поэтому использование СтрЗаменить() обязательно.

Универсальный алгоритм взаимодействия

Рассмотрим подробнее по шагам, как построить удобный интерфейс для бухгалтерии:

  1. Выведите таблицу, установив Таб.ТолькоПросмотр(0). Выдайте пользователю сообщение: «Удалите ненужные строки, затем дважды щелкните по ячейке ИТОГО для обновления или выгрузки».
  2. Чтобы ячейка «ИТОГО» сработала, пользователь должен знать, что нужно вернуть режим «Только просмотр» (нажать на иконку «Замок» на панели инструментов).
  3. Если вы хотите автоматизировать этот процесс, добавьте на форму обработки (из которой открывается таблица) кнопку «Подготовить к выгрузке». Эта кнопка программно обратится к объекту Таб, включит ТолькоПросмотр(1) и выполнит обход строк для сбора данных.

Для реализации более продвинутого интерфейса (например, с автоматическим пересчетом без переключения режимов) опытные разработчики используют внешние компоненты, такие как 1С++. Объект ТабличноеПоле из этой компоненты позволяет вставить полноценную сетку данных на форму, которая поддерживает все необходимые события «из коробки», включая удаление строк и изменение значений в ячейках с мгновенной реакцией системы.

Подводя итог, можно сказать: если вы ограничены стандартными средствами 1С 7.7, наиболее стабильным решением будет использование ОбработкаЯчейкиТаблицы в сочетании с четким разделением фаз «Редактирование» и «Выгрузка».

← На главную