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