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

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

При использовании стандартной обработки «Загрузка данных из табличного документа» пользователи часто сталкиваются с тем, что после импорта данных из Excel в табличную часть документа (например, «Поступление товаров и услуг») колонки «Сумма» остаются пустыми или не пересчитываются. Это происходит потому, что обработка записывает значения напрямую в свойства объекта, не вызывая стандартные обработчики событий формы, такие как ПриИзменении. В результате математическая логика Цена * Количество = Сумма, заложенная в интерфейсе, просто не срабатывает.

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

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

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

Рассмотрим ошибку, которую часто совершают начинающие разработчики. При попытке прописать алгоритм расчета в окне «События», многие пишут код вида Объект.Товары.Сумма = Объект.Товары.Цена * Объект.Товары.Количество. Система выдает ошибку «Поле объекта не обнаружено (Сумма)». Это происходит потому, что Объект.Товары — это вся коллекция строк (таблица целиком), и у нее нет свойства Сумма. Нам же нужно обратиться к конкретной строке, которая обрабатывается в данный момент.

Способ 1. Использование события «После загрузки строки»

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

Разберем по шагам, как это сделать:

  1. Откройте обработку «Загрузка данных из табличного документа» и настройте сопоставление полей.
  2. Перейдите на вкладку или в окно «События» (в зависимости от версии обработки).
  3. Найдите обработчик события «После загрузки строки».
  4. Введите программный код, используя специальную переменную ТекущаяСтрока.

В контексте этой обработки переменная ТекущаяСтрока представляет собой объект строки табличной части, в которую только что были записаны данные из файла. Пример правильного кода:


// Простейший пересчет суммы без учета налогов
ТекущаяСтрока.Сумма = ТекущаяСтрока.Количество * ТекущаяСтрока.Цена;

Теперь при загрузке каждой строки 1С будет автоматически умножать количество на цену и записывать результат в поле Сумма.

Способ 2. Расчет НДС и использование типовых функций

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

Рассмотрим ситуацию для классических конфигураций (таких как УПП 1.3 или Бухгалтерия 2.0). Вместо того чтобы вручную вычислять налог (делить на 120, умножать на 20 и т.д.), лучше вызвать стандартную функцию из общего модуля. Это гарантирует точность округления и соблюдение учетной политики.

Пример расширенного кода в событии «После загрузки строки»:


// 1. Рассчитываем основную сумму
ТекущаяСтрока.Сумма = ТекущаяСтрока.Количество * ТекущаяСтрока.Цена;

// 2. Рассчитываем НДС, используя типовой механизм (пример для старых конфигураций)
СтруктураТиповЦен = РаботаСНоменклатурой.ПолучитьЦенуНоменклатуры(ТекущаяСтрока.Номенклатура, , Объект.Дата);
// Вызываем функцию расчета суммы НДС из общего модуля
ТекущаяСтрока.СуммаНДС = ОбщегоНазначения.РассчитатьСуммуНДС(ТекущаяСтрока.Сумма, ТекущаяСтрока.СтавкаНДС);

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

Способ 3. Современные конфигурации на базе БСП (УТ 11, ERP, БП 3.0)

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

В событии «После загрузки строки» можно попробовать использовать следующий подход:


// Для конфигураций на БСП (например, Управление торговлей 11)
// Используем серверный модуль обработки табличных частей
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСумму", Истина);
СтруктураДействий.Вставить("ПересчитатьНДС", Истина);

// Вызов типового пересчета строки
ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий);

Этот метод является наиболее «правильным» с точки зрения архитектуры 1С, так как он задействует все механизмы, предусмотренные вендором для конкретного типа документа.

Нюансы с единицами измерения и коэффициентами

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

В таких случаях в событии «При загрузке реквизита» для Номенклатуры стоит добавить код, который будет подтягивать правильную единицу измерения и её коэффициент из карточки товара:


// Пример установки коэффициента
ТекущаяСтрока.Коэффициент = ТекущаяСтрока.ЕдиницаИзмерения.Коэффициент;

Альтернативный вариант: Подготовка данных в Excel

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

Проанализируем этот путь:

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

Заключение

Мы рассмотрели различные способы решения проблемы отсутствия пересчета сумм. Самым гибким и профессиональным является использование события «После загрузки строки» с обращением к ТекущаяСтрока. Это позволяет не только умножать числа, но и вызывать сложные типовые механизмы конфигурации, обеспечивая целостность данных в вашей базе 1С.

← На главную