Почему не пересчитывается сумма документа при заполнении табличной части из внешней обработки и как это исправить

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробно причины возникновения такой проблемы в платформах 1С:Предприятие и разберем практические способы её решения.

Причины некорректного расчета итогов при программном заполнении

Проанализируем механику работы формы документа и платформы 1С при интерактивном и программном вводе данных:

  1. Пропуск событий формы: При ручном изменении или добавлении строки на форме платформой вызываются клиентские события элементов (например, ПриИзменении), в которых заложена логика пересчета связанных колонок и итогов шапки. При программном заполнении табличной части через внешнюю обработку эти события не выравниваются и не запускаются автоматически.
  2. Незаполненные вычисляемые или итоговые реквизиты: Во многих конфигурациях колонки Сумма, СуммаНДС, Всего или реквизит шапки СуммаДокумента являются реальными реквизитами объекта, а не просто вычисляемыми декоративными полями формы. Если запрос внешней обработки выбирает и загружает только базовые данные (например, номенклатуру, количество и цену), но игнорирует итоговое поле Всего, документ остаётся с неполными данными.
  3. Недоступность приватных процедур формы: Процедуры пересчета строк (такие как ПересчитатьСтрокуТЧ), находящиеся в модуле формы без ключевого слова Экспорт, недоступны для вызова из контекста внешней обработки.

Способы решения проблемы

Способ 1. Заполнение всех расчетных колонок в запросе внешней обработки

Наиболее надежным и эффективным решением является явный расчет и выборка всех необходимых полей непосредственно в запросе внешней обработки заполнения табличной части.

Если в документе присутствует колонка Всего или Сумма, обязательнее всего вычислить её значение внутри запроса и передать в заполняемую табличную часть. Рассмотрим пример оформления выборки в запросе:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура КАК Номенклатура,
    |	Количество КАК Количество,
    |	Цена КАК Цена,
    |	ВЫРАЗИТЬ(Количество * Цена КАК Число(15, 2)) КАК Всего
    |ИЗ
    |	РегистрСведений.ИсходныеДанные";

РезультатЗапроса = Запрос.Выполнить();
ДокументОбъект.Начисления.Загрузить(РезультатЗапроса.Выгрузить());

После добавления расчетного поля Всего в результат запроса система начнет корректно учитывать суммы строк и подсчитывать общие итоги документа.

Способ 2. Явное вычисление итогов шапки и вызов процедур модуля объекта

Если итоговая сумма документа хранится в реквизите шапки (например, СуммаДокумента), после загрузки строк в табличную часть необходимо программно рассчитать итог по колонке и записать его в соответствующий реквизит объекта:


// Заполняем табличную часть
ДокументОбъект.Начисления.Загрузить(ТаблицаДанных);

// Пересчитываем итоговую сумму в шапке документа
ДокументОбъект.СуммаДокумента = ДокументОбъект.Начисления.Итог("Всего");

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


// Вызов экспортной процедуры пересчета из модуля объекта документа
ДокументОбъект.РассчитатьИтоги();

Способ 3. Работа с контекстом формы в обычных и управляемых формах

Если обработка заполнения табличной части работает непосредственно с открытой формой документа, разберем порядок действий для обновления отображаемых данных:

  1. Обходим строки табличной части формы и рассчитываем суммы для каждой строки.
  2. Устанавливаем признак модифицированности формы ЭтаФорма.Модифицированность = Истина, чтобы платформа зафиксировала факт изменения данных.
  3. При необходимости обновляем отображение итогов на форме с помощью вызова штатных экспортных процедур модуля формы или вызова пересчета итогов шапки.

Резюме

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

← На главную