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