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