При программной работе с документами в современных конфигурациях на базе 1С:ERP, таких как «Управление торговлей 11» или «Комплексная автоматизация 2», разработчики часто сталкиваются с ситуацией: документ создается, табличная часть «Товары» заполнена, цены и суммы в строках стоят, но в шапке документа реквизит СуммаДокумента остается равным нулю. Даже если попытаться присвоить значение этому реквизиту напрямую перед записью, после выполнения метода Записать() сумма все равно «слетает».
В этой статье мы подробно разберем, почему это происходит, как работают внутренние механизмы пересчета итогов в 1С и что именно нужно добавить в код, чтобы данные отображались корректно.
Рассмотрим стандартную логику работы документа ЗаказПоставщику. В отличие от старых конфигураций (например, УТ 10.3), где многие расчеты велись непосредственно в формах или простыми процедурами в модуле, в УТ 11 внедрена сложная система управления данными. Реквизит СуммаДокумента является расчетным.
Это означает, что при вызове события ПередЗаписью или через подписки на события срабатывают программные механизмы, которые обходят табличную часть и суммируют данные. Если эти механизмы не находят данных в тех колонках, на которые они «настроены», итоговая сумма обнуляется. Попытка принудительно записать Заказ.СуммаДокумента = ИтогПоТЧ бесполезна, так как системный пересчет произойдет позже вашего присвоения и перезапишет результат нулем.
Проанализируем код, который часто приводит к ошибке. Обычно программист заполняет только Цена, Количество и Сумма. Однако для корректного расчета итога в УТ 11 критически важно заполнение колонки СуммаСНДС. Именно по этой колонке система чаще всего агрегирует итоговое значение шапки.
Выясним, какие колонки в ТЧ Товары должны быть заполнены обязательно:
Сумма — чистая стоимость (может быть как с НДС, так и без, в зависимости от флага в шапке).СуммаНДС — выделенная сумма налога.СуммаСНДС — итоговая сумма по строке (Сумма + НДС или Сумма, если НДС уже включен).Посмотрим на пример исправленного кода заполнения строки:
Для каждого Товар из ИсточникДанных Цикл
НоваяСтрочка = Заказ.Товары.Добавить();
НоваяСтрочка.Номенклатура = Товар.Номенклатура;
НоваяСтрочка.Количество = Товар.Количество;
НоваяСтрочка.Цена = Товар.Цена;
// Важно заполнить все три составляющие суммы
НоваяСтрочка.Сумма = Товар.Сумма;
НоваяСтрочка.СуммаНДС = Товар.СуммаНДС; // Рассчитайте заранее или получите из источника
НоваяСтрочка.СуммаСНДС = Товар.Сумма + Товар.СуммаНДС; // Или просто Товар.СуммаВсего
НоваяСтрочка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
КонецЦикла;
Вместо того чтобы вручную вычислять НДС и суммы в каждой строке, правильнее использовать экспортные методы конфигурации. Это гарантирует, что ваша логика не будет противоречить настройкам учетной политики организации. В УТ 11 для этого существуют специальные общие модули.
Рассмотрим, как можно автоматизировать расчет строки с помощью типового функционала. Обратите внимание на модуль ОбработкаТабличнойЧастиТоварыКлиентСервер (название может незначительно меняться в зависимости от версии релиза).
Проанализируем последовательность действий:
Пример использования функций пересчета:
// Предположим, мы уже создали строку НоваяСтрочка
СтруктураПересчета = Новый Структура;
СтруктураПересчета.Вставить("ЦенаВключаетНДС", Заказ.ЦенаВключаетНДС);
СтруктураПересчета.Вставить("СпособИспользованияСтавкиНДС", Перечисления.СпособыИспользованияСтавокНДС.ОбщаяСтавка);
// Используем типовой механизм для заполнения сумм
// Параметры метода зависят от конкретной версии УТ 11
// Обычно это РассчитатьСуммуСтрокиТЧ или аналоги
// В последних релизах это часто делается через модуль ОбработкаТабличнойЧастиТоварыКлиентСервер
Если ТЧ заполнена идеально, но сумма все равно ноль, проанализируем состояние шапки документа. Система не сможет корректно рассчитать итоги, если нарушена логика ценообразования или валютного учета. Проверьте следующие поля:
Валюта документа. Если реквизит Валюта не заполнен, механизмы агрегации данных могут давать сбой, так как система «не понимает», в каком числовом формате и с какой точностью представлять итог. Всегда устанавливайте валюту явно:
Заказ.Валюта = Справочники.Валюты.НайтиПоКоду("643");
Налогообложение НДС. Этот реквизит (НалогообложениеНДС) определяет, как интерпретируются ставки в строках. Если в шапке указано «Продажа облагается НДС», а в строках вы ставите «Без НДС», или наоборот, алгоритм ПередЗаписью может сбросить расчетные значения из-за логического конфликта.
Хозяйственная операция. Для некоторых операций (например, ПриемНаКомиссию) в УТ 11 требуется обязательное наличие Соглашения или Договора. Если они не заполнены, документ может считаться недозаполненным, и его проведение/запись не инициирует полные цепочки расчетов.
В современных версиях УТ 11 табличные части связаны между собой техническими идентификаторами — КлючСвязи. Например, строка в ТЧ Товары связана со строкой в ТЧ ЭтапыОплаты или СкидкиНаценки именно по этому числовому полю. При программном заполнении программисты часто забывают про него.
Хотя напрямую на СуммаДокумента отсутствие ключей связи в простейшем случае может не влиять, это часто приводит к тому, что не заполняется график оплаты. А если в настройках системы стоит жесткий контроль заполнения графиков, документ может вести себя непредсказуемо при записи.
Рекомендуем использовать метод Заказ.ЗаполнитьПоляАвтоматическогоЗаполнения() (если доступен в вашем релизе) или вручную генерировать уникальные ключи для каждой строки ТЧ Товары:
МаксимальныйКлюч = 0;
Для каждого СтрокаТЧ Из Заказ.Товары Цикл
МаксимальныйКлюч = МаксимальныйКлюч + 1;
СтрокаТЧ.КлючСвязи = МаксимальныйКлюч;
КонецЦикла;
Для того чтобы программно созданный Заказ поставщику в УТ 11 имел корректную итоговую сумму, придерживайтесь следующего алгоритма:
СуммаДокумента вручную — доверьте это системе.Товары обязательно заполняйте СуммаСНДС и СуммаНДС. Именно на них ориентируется алгоритм расчета итога.Валюты и НалогообложенияНДС в шапке.Записать() попробуйте вызвать метод объекта Заказ.ЗаполнитьСтавкиНДС().ОбработкаТабличнойЧастиТоварыКлиентСервер.РассчитатьСуммуСтрокиТЧ() для каждой новой строки.Соблюдение этих правил позволит избежать «исчезновения» сумм и гарантирует правильное поведение документа при проведении и в отчетах.