Как рассчитать произведение колонок и итоговую сумму в табличной части 1С 7.7

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

Переход с современной платформы 1С 8.3 на устаревшую, но все еще актуальную 1С 7.7 часто вызывает трудности даже у опытных разработчиков. Основная сложность заключается в ином подходе к работе с контекстом формы и табличными частями. Если в "восьмерке" мы привыкли к объектам типа ДанныеФормыКоллекция и циклу Для Каждого, то в "семерке" механизмы более прямолинейны и требуют понимания того, где именно выполняются вычисления. В этой статье мы подробно разберем, как реализовать расчет произведения (например, Коэффициент * Количество) и как правильно подсчитать итоги по колонке.

Разберем основы: работа с табличной частью документа

В 1С 7.7 табличная часть документа не является отдельным объектом в привычном понимании 8.3. Она встроена в контекст модуля формы документа. Чтобы перебрать строки и выполнить какие-либо вычисления, нам нужно инициализировать выборку. Проанализируем стандартный алгоритм пересчета суммы в каждой строке.

Рассмотрим пример кода, который позволит нам пройтись по всем строкам документа и записать результат умножения К (Коэффициент) на Колво (Количество) в колонку Под:


// Сначала подготавливаем выборку строк табличной части
ВыбратьСтроки(); 

// Запускаем цикл по строкам
Пока ПолучитьСтроку() = 1 Цикл
    // Внутри цикла мы имеем прямой доступ к реквизитам текущей строки по их идентификаторам
    Под = К * Колво;
КонецЦикла;

Важный нюанс: Обратите внимание, что мы не используем префиксы типа "Объект.ТабличнаяЧасть". Если код пишется в модуле формы документа, система автоматически понимает, к каким реквизитам идет обращение. Если вы добавите лишний префикс (например, имя таблицы), 1С 7.7 может выдать ошибку Переменная не определена.

Работа с объектом Таблица Значений (ТЗ)

Ситуация меняется, если вы работаете не с табличной частью документа, а с программно созданным объектом ТаблицаЗначений. Рассмотрим, как в этом случае меняется синтаксис. Здесь нам уже необходимо обращаться к методам конкретного объекта через точку.


// Предположим, ТЗ уже создана и заполнена данными
ТЗ.ВыбратьСтроки();

Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    // Обращаемся к колонкам через объект ТЗ
    ТЗ.Под = ТЗ.К * ТЗ.Колво;
КонецЦикла;

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

Автоматический пересчет "на лету" без циклов

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

Рассмотрим шаги для реализации автоматического пересчета:

  1. Откройте форму документа в Конфигураторе.
  2. Выберите колонку Колво и откройте её свойства.
  3. В поле "Формула" впишите название процедуры, например: ПересчитатьСтроку().
  4. Повторите то же самое для колонки К.
  5. В модуле формы создайте саму процедуру:

Процедура ПересчитатьСтроку()
    // Этот код сработает автоматически при изменении значения в ячейке
    Под = К * Колво;
КонецПроцедуры

Это решение гораздо производительнее, так как оно не перебирает всю таблицу целиком, а работает только с текущей строкой, которую редактирует пользователь.

Как быстро посчитать итог по всей колонке

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

Программный метод: Используем встроенную функцию Итог(). Проанализируем пример ее вызова:


// Для табличной части документа
ВсегоАмортизации = Итог("Под");

// Для объекта Таблица Значений
ВсегоПоТЗ = ТЗ.Итог("Под");

Важное ограничение: Метод Итог() в 1С 7.7 работает только в том случае, если колонка определена в метаданных (в конфигураторе) как числовой реквизит многострочной части. Если вы просто добавили текстовую колонку на форму и вычисляете её значение только визуально, Итог() вернет 0.

Динамическое отображение суммы на форме

Часто требуется просто показать итоговую сумму внизу формы, не сохраняя её в базе данных. В 1С 8.3 для этого мы бы создали реквизит формы и обновляли его. В 1С 7.7 можно поступить проще:

  1. Разместите на форме элемент типа "Текст".
  2. В поле "Формула" этого элемента напишите: Итог("Под").

Теперь система сама будет пересчитывать и обновлять это значение каждый раз, когда меняются данные в таблице. Вам не нужно писать ни одной строчки кода для обновления этого поля!

Типичные ошибки при расчетах в 7.7

Проанализируем ситуации, когда расчет может не работать:

Рассмотрим ситуацию, когда расчет нужно произвести в другом документе, обращаясь к нему извне (например, из отчета). В этом случае мы обязательно используем переменную, содержащую объект документа:


Док = СоздатьОбъект("Документ.ПриходнаяНакладная");
Док.НайтиДокумент(НужнаяСсылка);
ОбщаяСумма = 0;
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
    ОбщаяСумма = ОбщаяСумма + (Док.К * Док.Колво);
КонецЦикла;

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

← На главную