Переход с платформы 1С 8.x на 1С 7.7 часто вызывает вопросы у разработчиков, привыкших к событийной модели. Одной из самых частых задач является автоматический пересчет данных в строке табличной части документа — например, когда при изменении количества или цены должна мгновенно обновляться сумма. Если в восьмой версии мы используем событие ПриИзменении, то в "семерке" логика работы интерфейса строится на иных принципах.
В этой статье мы подробно разберем, как правильно настроить интерактивный пересчет данных, рассмотрим использование формул колонок и выясним, какие процедуры модуля формы за это отвечают.
Разберем типичную ошибку начинающих. В 1С 7.7 существует предопределенная процедура ПриНачалеРедактированияСтроки(). Однако, вопреки ожиданиям, она не является аналогом ПриИзменении. Эта процедура срабатывает в момент, когда пользователь только нажал клавишу Enter или дважды кликнул по строке, чтобы войти в режим правки. Для задачи пересчета "на лету" при выходе из конкретной ячейки она бесполезна.
Основным механизмом отслеживания изменений в табличной части 1С 7.7 является поле "Формула" в свойствах элементов управления формы.
Проанализируем самый простой и надежный способ реализации автоматического расчета. В конфигураторе откройте форму нужного документа и перейдите к табличной части. Выполните следующие шаги:
Количество).Рассмотрим пример. Допустим, мы хотим, чтобы при изменении цены или количества пересчитывалась сумма. Мы можем прописать в поле "Формула" для обеих колонок простую математическую операцию:
Сумма = Цена * Количество;
Однако такой подход "в лоб" не всегда удобен, если логика расчета сложнее (например, нужно учитывать НДС, скидки или валютные курсы). Правильнее будет вызвать в формуле процедуру модуля формы.
Выясним, как организовать централизованный пересчет через код. В поле "Формула" для колонок Цена и Количество напишем название функции: Пересчет(). Теперь перейдем в модуль формы документа и опишем эту процедуру.
Посмотрим на пример универсального кода:
Процедура Пересчет()
// В 1С 7.7 в контексте формы переменные колонок ТЧ доступны напрямую
Сумма = Цена * Количество;
// Если нужно обновить итоги в подвале документа
// (при условии, что там есть текстовое поле с формулой Итог("Сумма"))
Форма.Обновить();
КонецПроцедуры
Важно помнить: в 1С 7.7, когда вы находитесь в строке табличной части, имена реквизитов (Цена, Количество, Сумма) обращаются именно к данным текущей строки. Вам не нужно определять ТекущиеДанные, как это делается в 1С 8.x.
Иногда нам нужно понимать, какая именно колонка была изменена, чтобы выполнить специфические действия. Для этого проанализируем использование системной функции Форма.ТекущаяКолонка(). Это позволяет использовать одну процедуру для обработки разных полей.
Процедура ПриИзмененииДанных()
ТекКол = Форма.ТекущаяКолонка();
Если (ТекКол = "Количество") Или (ТекКол = "Цена") Тогда
Сумма = Цена * Количество;
ИначеЕсли ТекКол = "Сумма" Тогда
// Если пользователь сам ввел сумму, пересчитаем цену при фиксированном количестве
Если Количество <> 0 Тогда
Цена = Сумма / Количество;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Не забудьте указать ПриИзмененииДанных() в свойствах всех трех колонок (Количество, Цена, Сумма) на вкладке "Дополнительно".
Если вы работаете с типовыми конфигурациями, такими как "Торговля и Склад" (ТиС) или "Бухгалтерия", вы увидите, что там расчеты реализованы через глобальный модуль. Это сделано для единообразия учета во всех документах. Рассмотрим, как это работает.
Обычно в формуле колонки стоит вызов локальной процедуры, например, глПересчет(Контекст, "Количество"). Внутри модуля формы это выглядит примерно так:
Процедура Пересчет(ИмяРеквизита)
// Вызов глобальной функции из глобального модуля
глПересчетТаблЧасти(Контекст, ИмяРеквизита);
КонецПроцедуры
Функция глПересчетТаблЧасти берет на себя сложную математику: расчет налогов (НДС, НПП), распределение скидок и проверку типов цен. Использование Контекст позволяет глобальной процедуре получить доступ ко всем реквизитам и методам текущей формы документа.
Проанализируем важный нюанс: механизм "Формулы" срабатывает только при интерактивном вводе данных пользователем. Если вы решите изменить количество программно, например, в коде кнопки:
Количество = 100;
То сумма не пересчитается автоматически, так как событие интерфейса не возникло. В таких случаях вы должны явно вызвать процедуру пересчета сразу после изменения значения в коде:
Количество = 100;
Пересчет("Количество"); // Вызываем принудительно
Рассмотрим ситуацию, когда вам нужно выводить в табличной части расчетную величину, которую не требуется сохранять в базе данных (например, "Всего с НДС" или "Остаток на складе"). В 1С 7.7 для этого идеально подходят текстовые колонки.
РассчитатьВсего().
Функция РассчитатьВсего()
Возврат Сумма + НДС;
КонецФункции
Система будет автоматически вызывать эту функцию при каждой перерисовке строки (скроллинг, перемещение курсора). Это мощный инструмент для создания динамичного интерфейса без лишней нагрузки на базу данных.
Для завершения картины разберем, как отображать итоговую сумму по документу в подвале формы. В отличие от 8.x, где итоги часто считаются программно в цикле, в 7.7 достаточно разместить под таблицей элемент типа "Текст" и в поле "Формула" написать:
Итог("Сумма")
Эта встроенная функция автоматически суммирует значения в указанной колонке по всем строкам документа. Если в модуле формы после изменения данных в строке вы вызываете Форма.Обновить(), это значение в подвале будет актуализироваться мгновенно.
Таким образом, мы выяснили, что автоматизация расчетов в 1С 7.7 строится вокруг грамотного использования свойств колонок и связки "Формула — Процедура". Это позволяет создавать гибкие и отзывчивые интерфейсы даже на старых версиях платформы.