К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как отключить расчет ячеек в 1С

Как отключить автоматический расчет ячеек в 1С: отключение пересчета табличного документа, итогов в табличной части и обработчиков. Практические примеры.

Автоматический пересчет ячеек в 1С удобен, когда данных немного, но на больших табличных документах, формах с сотнями строк и массовых обработках он заметно тормозит работу. Каждое изменение значения запускает пересчет зависимых ячеек, вызов обработчиков «ПриИзменении» и обновление итогов, из-за чего заполнение документа из тысячи строк может занимать минуты вместо секунд.

Отключить расчет можно на нескольких уровнях: глобально для табличного документа, локально для табличной части формы или точечно — обойдя обработчики событий при программном заполнении. Выбор зависит от того, где именно возникает проблема: в печатной форме, в документе на управляемой форме или в фоновой обработке данных.

Важно понимать: отключение пересчета — это всегда временная мера на этап массового изменения данных. После завершения операции расчет нужно включить обратно и принудительно пересчитать итоги, иначе пользователь увидит устаревшие суммы, а проведение документа может опереться на некорректные значения.

Где в 1С возникает автоматический расчет ячеек

Под «расчетом ячеек» обычно понимают три разных механизма платформы. Первый — автопересчет формул в табличном документе: если в ячейке записана формула, она перевычисляется при изменении любой ячейки, от которой зависит. Второй — автоматический расчет итогов по колонкам таблицы на форме (подвал с суммой, количеством). Третий — программные обработчики «ПриИзменении» полей ввода, которые пересчитывают связанные реквизиты: сумму по цене и количеству, НДС по ставке и так далее.

Каждый из этих механизмов отключается по-своему, и универсальной «одной галочки» не существует. Поэтому первый шаг — определить, что именно тормозит работу: формулы табличного документа, итоги в подвале таблицы формы или цепочка пересчетов в модуле формы.

Отключение авторасчета в табличном документе

Если вы формируете большой табличный документ программно — например, выводите печатную форму или отчет без СКД — перед началом заполнения отключите авторасчет. Это делается одной строкой кода до цикла вывода областей.

ТабДок = Новый ТабличныйДокумент;

ТабДок.Авторасчет = Ложь;

// ... цикл вывода областей и заполнения параметров ...

ТабДок.Авторасчет = Истина;

ТабДок.ПересчитатьФормулы();

Метод «ПересчитатьФормулы» в конце обязателен, если в документе есть формулы: без него пользователь увидит непересчитанные значения. Если формул нет, достаточно вернуть свойство «Авторасчет» в исходное состояние.

Порядок действий для табличного документа
  1. 1
    Перед циклом заполнения установите ТабДок.Авторасчет = Ложь
  2. 2
    Выведите все области и заполните параметры
  3. 3
    Верните ТабДок.Авторасчет = Истина
  4. 4
    Вызовите ТабДок.ПересчитатьФормулы(), если в макете есть формулы
  5. 5
    Проверьте итоговые ячейки на корректность значений

Для интерактивного табличного документа на форме (поле вида «ТабличныйДокумент») авторасчет также отключается через свойство, но делать это стоит только на время массового обновления. Если пользователь редактирует ячейки вручную, отключенный авторасчет создаст впечатление «зависших» формул.

Отключение пересчета итогов в таблице на форме

На управляемой форме подвал таблицы с итогами пересчитывается при каждом изменении строки. Если табличная часть большая, а итоги по колонкам не нужны, отключите их: выделите колонку таблицы в редакторе формы и снимите флаг «ОтображатьИтог» (FooterVisible / ShowFooter в свойствах поля). Для всей таблицы можно отключить свойство «Подвал».

Программно это делается через элементы формы:

Элементы.ТоварыКоличество.ОтображатьИтог = Ложь;

Элементы.ТоварыСумма.ОтображатьИтог = Ложь;

Если итоги нужны, но пересчет мешает только во время пакетной загрузки данных, альтернатива — заполнять табличную часть не по одной строке через форму, а целиком на сервере: загрузить данные в объект и вернуть готовый результат. Тогда форма обновится один раз, а не после каждой строки.

Как обойти обработчики «ПриИзменении» при заполнении

Самая частая причина медленного заполнения — обработчики «ПриИзменении» полей «Количество», «Цена», «СтавкаНДС», которые при интерактивном вводе пересчитывают сумму, НДС и итоги. При программном заполнении на сервере эти обработчики не вызываются автоматически, но во многих типовых конфигурациях код заполнения специально вызывает процедуры пересчета для каждой строки.

Если вы пишете собственную обработку загрузки, рассчитывайте зависимые поля один раз в своем коде, а не через цепочку обработчиков. В типовых конфигурациях для этого существуют экспортные процедуры вида «РассчитатьСуммуСтроки», которые можно вызвать один раз после заполнения всех полей строки, а не после каждого поля.

НоваяСтрока = Объект.Товары.Добавить();

НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;

НоваяСтрока.Количество = СтрокаДанных.Количество;

НоваяСтрока.Цена = СтрокаДанных.Цена;

// Один вызов пересчета вместо трех срабатываний обработчиков

НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

Дополнительный прием — использовать метод «Загрузить» табличной части вместо построчного добавления: данные готовятся в таблице значений и загружаются одной операцией, что исключает промежуточные пересчеты.

Типичные ошибки
01
Отключили Авторасчет и забыли вернуть Истина — формулы перестают считаться для всех последующих операций с документом
02
Не вызвали ПересчитатьФормулы после включения — пользователь видит нулевые или устаревшие итоги
03
Заполняют строки через форму в цикле вместо серверной загрузки — форма обновляется на каждой строке
04
Пересчитывают итоги документа после каждой строки вместо одного пересчета в конце цикла

Отключение пересчета в отчетах на СКД и при выводе печатных форм

В отчетах на системе компоновки данных прямого свойства «Авторасчет» нет, но эффект многократного пересчета возникает при программной доработке результата: если вы обходите ячейки сформированного табличного документа и меняете значения, каждое изменение запускает пересчет формул. Решение то же — отключить «Авторасчет» у результата перед доработкой и включить после.

При выводе печатных форм с большим числом строк (счета, ТОРГ-12 на сотни позиций) отключение авторасчета в сочетании с отключенным отображением документа до полной готовности сокращает время формирования в разы. Дополнительно помогает вывод областей без промежуточных вызовов «Показать» — документ отображается один раз, когда полностью сформирован.

Маршрут решения

Как выбрать действие

Тормозит формирование печатной формы или отчета с формуламиУстановите Авторасчет = Ложь перед заполнением, верните Истина и вызовите ПересчитатьФормулы после
Медленно работает таблица на форме с итогами в подвалеОтключите ОтображатьИтог у колонок или перенесите заполнение на сервер
Долго заполняется табличная часть в обработке загрузкиГотовьте данные в таблице значений и используйте метод Загрузить, пересчет делайте один раз в конце
Пользователь редактирует ячейки вручную и формулы не считаютсяАвторасчет отключен — верните значение Истина, интерактивную работу без пересчета оставлять нельзя

Проверка результата и возврат настроек

После любого отключения расчета проверьте три вещи. Первое: итоговые ячейки с формулами содержат актуальные значения, а не нули или данные до изменения. Второе: свойство «Авторасчет» возвращено в Истина — иначе следующая операция с тем же объектом табличного документа унаследует отключенный пересчет. Третье: суммы в реквизитах объекта (например, «СуммаДокумента») совпадают с итогами по строкам.

Надежный шаблон — использовать конструкцию с гарантированным возвратом настройки: сохранить текущее значение свойства в переменную, отключить, выполнить работу, восстановить сохраненное значение. Это защищает от ситуации, когда документ изначально имел отключенный авторасчет, а ваш код безусловно его включил.

Контрольные точки

Как проверить результат

Значения ячеек с формулами после заполнения
Норма

Формулы показывают актуальные итоги

Тревожный признак

Нули, пустые ячейки или значения до изменения

Свойство Авторасчет после завершения кода
Норма

Возвращено исходное значение (обычно Истина)

Тревожный признак

Осталось Ложь — последующие операции не пересчитываются

Итог по документу против суммы строк
Норма

Значения совпадают

Тревожный признак

Расхождение — пересчет строк не выполнен

Ограничения и риски

Отключение расчета не ускоряет сами вычисления — оно лишь откладывает их. Если формул много и они сложные, итоговый «ПересчитатьФормулы» займет заметное время, хотя суммарно это всегда быстрее, чем пересчет после каждой строки. Не отключайте авторасчет в документах, которые пользователь редактирует интерактивно: он не поймет, почему сумма не меняется при вводе цены.

При обходе обработчиков «ПриИзменении» вы берете на себя ответственность за все связанные пересчеты: НДС, скидки, вес, объем, заполнение счетов учета. Если в типовом обработчике выполняется больше одного действия, простое присвоение суммы может оставить документ в частично заполненном состоянии. Перед отказом от типовых процедур изучите, что именно они делают, или вызывайте их один раз на строку после заполнения всех полей.

Итог

Что важно запомнить

Расчет ячеек отключается свойством «Авторасчет» для табличного документа, снятием флага «ОтображатьИтог» для колонок формы и отказом от построчных обработчиков при программном заполнении. Всегда возвращайте настройки обратно и пересчитывайте итоги один раз в конце.

Частые вопросы

Как отключить пересчет формул в табличном документе 1С?

Установите свойство табличного документа «Авторасчет» в значение Ложь перед началом заполнения. После завершения верните значение Истина и вызовите метод «ПересчитатьФормулы», чтобы итоговые ячейки обновились.

Почему после отключения авторасчета формулы показывают нули?

Потому что формулы перевычисляются только при включенном авторасчете или по явной команде. Вызовите метод «ПересчитатьФормулы» после возврата свойства в Истина — значения обновятся.

Можно ли отключить пересчет итогов в табличной части документа без программирования?

Да, в конфигураторе: откройте форму документа, выделите колонку таблицы и снимите флаг отображения итога, либо отключите подвал у всей таблицы. На данные документа это не влияет, меняется только отображение.

Ускорит ли метод «Загрузить» заполнение табличной части?

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

Опасно ли обходить обработчики «ПриИзменении» при загрузке данных?

Опасно, если обработчик выполняет несколько связанных действий — расчет НДС, скидок, заполнение счетов учета. Безопасный вариант: заполнить все поля строки и вызвать типовую процедуру пересчета строки один раз, а не после каждого поля.

Работает ли свойство «Авторасчет» для результата отчета на СКД?

Результат СКД — это табличный документ, поэтому свойство доступно при программной доработке результата. Отключайте авторасчет перед обходом и изменением ячеек, затем включайте обратно и пересчитывайте формулы.