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