Разработка и Конфигурация · 10 мин
Как отключить расчет ячеек в 1С
Как отключить автоматический расчет ячеек в 1С: отключение пересчета табличного документа, итогов в табличной части и обработчиков. Практические примеры.
Автоматический пересчет ячеек в 1С удобен, когда данных немного, но на больших табличных документах, формах с сотнями строк и массовых обработках он заметно тормозит работу. Каждое изменение значения запускает пересчет зависимых ячеек, вызов обработчиков «ПриИзменении» и обновление итогов, из-за чего заполнение документа из тысячи строк может занимать минуты вместо секунд.
Отключить расчет можно на нескольких уровнях: глобально для табличного документа, локально для табличной части формы или точечно — обойдя обработчики событий при программном заполнении. Выбор зависит от того, где именно возникает проблема: в печатной форме, в документе на управляемой форме или в фоновой обработке данных.
Важно понимать: отключение пересчета — это всегда временная мера на этап массового изменения данных. После завершения операции расчет нужно включить обратно и принудительно пересчитать итоги, иначе пользователь увидит устаревшие суммы, а проведение документа может опереться на некорректные значения.
Где в 1С возникает автоматический расчет ячеек
Под «расчетом ячеек» обычно понимают три разных механизма платформы. Первый — автопересчет формул в табличном документе: если в ячейке записана формула, она перевычисляется при изменении любой ячейки, от которой зависит. Второй — автоматический расчет итогов по колонкам таблицы на форме (подвал с суммой, количеством). Третий — программные обработчики «ПриИзменении» полей ввода, которые пересчитывают связанные реквизиты: сумму по цене и количеству, НДС по ставке и так далее.
Каждый из этих механизмов отключается по-своему, и универсальной «одной галочки» не существует. Поэтому первый шаг — определить, что именно тормозит работу: формулы табличного документа, итоги в подвале таблицы формы или цепочка пересчетов в модуле формы.
Отключение авторасчета в табличном документе
Если вы формируете большой табличный документ программно — например, выводите печатную форму или отчет без СКД — перед началом заполнения отключите авторасчет. Это делается одной строкой кода до цикла вывода областей.
ТабДок = Новый ТабличныйДокумент;
ТабДок.Авторасчет = Ложь;
// ... цикл вывода областей и заполнения параметров ...
ТабДок.Авторасчет = Истина;
ТабДок.ПересчитатьФормулы();
Метод «ПересчитатьФормулы» в конце обязателен, если в документе есть формулы: без него пользователь увидит непересчитанные значения. Если формул нет, достаточно вернуть свойство «Авторасчет» в исходное состояние.
- 1Перед циклом заполнения установите ТабДок.Авторасчет = Ложь
- 2Выведите все области и заполните параметры
- 3Верните ТабДок.Авторасчет = Истина
- 4Вызовите ТабДок.ПересчитатьФормулы(), если в макете есть формулы
- 5Проверьте итоговые ячейки на корректность значений
Для интерактивного табличного документа на форме (поле вида «ТабличныйДокумент») авторасчет также отключается через свойство, но делать это стоит только на время массового обновления. Если пользователь редактирует ячейки вручную, отключенный авторасчет создаст впечатление «зависших» формул.
Отключение пересчета итогов в таблице на форме
На управляемой форме подвал таблицы с итогами пересчитывается при каждом изменении строки. Если табличная часть большая, а итоги по колонкам не нужны, отключите их: выделите колонку таблицы в редакторе формы и снимите флаг «ОтображатьИтог» (FooterVisible / ShowFooter в свойствах поля). Для всей таблицы можно отключить свойство «Подвал».
Программно это делается через элементы формы:
Элементы.ТоварыКоличество.ОтображатьИтог = Ложь;
Элементы.ТоварыСумма.ОтображатьИтог = Ложь;
Если итоги нужны, но пересчет мешает только во время пакетной загрузки данных, альтернатива — заполнять табличную часть не по одной строке через форму, а целиком на сервере: загрузить данные в объект и вернуть готовый результат. Тогда форма обновится один раз, а не после каждой строки.
Как обойти обработчики «ПриИзменении» при заполнении
Самая частая причина медленного заполнения — обработчики «ПриИзменении» полей «Количество», «Цена», «СтавкаНДС», которые при интерактивном вводе пересчитывают сумму, НДС и итоги. При программном заполнении на сервере эти обработчики не вызываются автоматически, но во многих типовых конфигурациях код заполнения специально вызывает процедуры пересчета для каждой строки.
Если вы пишете собственную обработку загрузки, рассчитывайте зависимые поля один раз в своем коде, а не через цепочку обработчиков. В типовых конфигурациях для этого существуют экспортные процедуры вида «РассчитатьСуммуСтроки», которые можно вызвать один раз после заполнения всех полей строки, а не после каждого поля.
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрока.Количество = СтрокаДанных.Количество;
НоваяСтрока.Цена = СтрокаДанных.Цена;
// Один вызов пересчета вместо трех срабатываний обработчиков
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
Дополнительный прием — использовать метод «Загрузить» табличной части вместо построчного добавления: данные готовятся в таблице значений и загружаются одной операцией, что исключает промежуточные пересчеты.
Отключение пересчета в отчетах на СКД и при выводе печатных форм
В отчетах на системе компоновки данных прямого свойства «Авторасчет» нет, но эффект многократного пересчета возникает при программной доработке результата: если вы обходите ячейки сформированного табличного документа и меняете значения, каждое изменение запускает пересчет формул. Решение то же — отключить «Авторасчет» у результата перед доработкой и включить после.
При выводе печатных форм с большим числом строк (счета, ТОРГ-12 на сотни позиций) отключение авторасчета в сочетании с отключенным отображением документа до полной готовности сокращает время формирования в разы. Дополнительно помогает вывод областей без промежуточных вызовов «Показать» — документ отображается один раз, когда полностью сформирован.
Как выбрать действие
Проверка результата и возврат настроек
После любого отключения расчета проверьте три вещи. Первое: итоговые ячейки с формулами содержат актуальные значения, а не нули или данные до изменения. Второе: свойство «Авторасчет» возвращено в Истина — иначе следующая операция с тем же объектом табличного документа унаследует отключенный пересчет. Третье: суммы в реквизитах объекта (например, «СуммаДокумента») совпадают с итогами по строкам.
Надежный шаблон — использовать конструкцию с гарантированным возвратом настройки: сохранить текущее значение свойства в переменную, отключить, выполнить работу, восстановить сохраненное значение. Это защищает от ситуации, когда документ изначально имел отключенный авторасчет, а ваш код безусловно его включил.
Как проверить результат
Формулы показывают актуальные итоги
Нули, пустые ячейки или значения до изменения
Возвращено исходное значение (обычно Истина)
Осталось Ложь — последующие операции не пересчитываются
Значения совпадают
Расхождение — пересчет строк не выполнен
Ограничения и риски
Отключение расчета не ускоряет сами вычисления — оно лишь откладывает их. Если формул много и они сложные, итоговый «ПересчитатьФормулы» займет заметное время, хотя суммарно это всегда быстрее, чем пересчет после каждой строки. Не отключайте авторасчет в документах, которые пользователь редактирует интерактивно: он не поймет, почему сумма не меняется при вводе цены.
При обходе обработчиков «ПриИзменении» вы берете на себя ответственность за все связанные пересчеты: НДС, скидки, вес, объем, заполнение счетов учета. Если в типовом обработчике выполняется больше одного действия, простое присвоение суммы может оставить документ в частично заполненном состоянии. Перед отказом от типовых процедур изучите, что именно они делают, или вызывайте их один раз на строку после заполнения всех полей.
Что важно запомнить
Расчет ячеек отключается свойством «Авторасчет» для табличного документа, снятием флага «ОтображатьИтог» для колонок формы и отказом от построчных обработчиков при программном заполнении. Всегда возвращайте настройки обратно и пересчитывайте итоги один раз в конце.
Частые вопросы
Как отключить пересчет формул в табличном документе 1С?
Установите свойство табличного документа «Авторасчет» в значение Ложь перед началом заполнения. После завершения верните значение Истина и вызовите метод «ПересчитатьФормулы», чтобы итоговые ячейки обновились.
Почему после отключения авторасчета формулы показывают нули?
Потому что формулы перевычисляются только при включенном авторасчете или по явной команде. Вызовите метод «ПересчитатьФормулы» после возврата свойства в Истина — значения обновятся.
Можно ли отключить пересчет итогов в табличной части документа без программирования?
Да, в конфигураторе: откройте форму документа, выделите колонку таблицы и снимите флаг отображения итога, либо отключите подвал у всей таблицы. На данные документа это не влияет, меняется только отображение.
Ускорит ли метод «Загрузить» заполнение табличной части?
Да, обычно заметно: данные подготавливаются в таблице значений и переносятся одной операцией без промежуточных обновлений. Дополнительно это исключает многократные вызовы обработчиков, характерные для построчного заполнения через форму.
Опасно ли обходить обработчики «ПриИзменении» при загрузке данных?
Опасно, если обработчик выполняет несколько связанных действий — расчет НДС, скидок, заполнение счетов учета. Безопасный вариант: заполнить все поля строки и вызвать типовую процедуру пересчета строки один раз, а не после каждого поля.
Работает ли свойство «Авторасчет» для результата отчета на СКД?
Результат СКД — это табличный документ, поэтому свойство доступно при программной доработке результата. Отключайте авторасчет перед обходом и изменением ячеек, затем включайте обратно и пересчитывайте формулы.