Как программно пересчитать строку табличной части в 1С:Розница 3 и 1С:УНФ

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

При переходе к разработке в конфигурации 1С:Розница 3 (или 1С:УНФ 3.0) специалисты, привыкшие к архитектуре 1С:Управление торговлей 11 или переходящие с версии 2.3, где часто требовалась установка цен номенклатуры на основании перемещения, часто сталкиваются с проблемой отсутствия привычных инструментов. Одной из таких проблем является поиск аналога общего модуля ОбработкаТабличнойЧастиКлиент и его процедуры ОбработатьСтрокуТЧ. В этой статье мы подробно разберем, как реализовать аналогичный механизм пересчета строки (цены, суммы, НДС, отклонения) в новой архитектуре.

Анализ архитектурных отличий Розницы 3

Для начала проанализируем ситуацию: Розница 3 построена на ядре УНФ, где логика работы с товарными позициями сосредоточена в специализированных модулях работы с номенклатурой. В отличие от УТ 11, где расчеты сильно инкапсулированы внутри универсальных механизмов ТЧ, здесь используется более распределенный подход. Если мы программно меняем реквизит Количество в коде, нам необходимо самостоятельно инициировать цепочку пересчетов зависимых полей, что особенно критично при реализации таких задач, как установка закупочной и заполнение розничной цены в приходной накладной.

Метод 1: Использование модуля НоменклатураКлиентСервер

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

Основная процедура, которая нам интересна — РассчитатьСуммуВСтрокеТЧ. Давайте разберем по шагам, как ее применить:

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

Посмотрим на пример кода, который можно использовать в серверном контексте:


// Предположим, ТекущаяСтрока — это строка нашей ТЧ
ТекущаяСтрока.Количество = НовоеЗначениеКоличества;

// Подготавливаем параметры для расчета (обычно это структура)
ПараметрыРасчета = Новая Структура;
ПараметрыРасчета.Вставить("ПересчитыватьСумму", Истина);

// Вызываем типовой механизм
НоменклатураКлиентСервер.РассчитатьСуммуВСтрокеТЧ(ТекущаяСтрока, "Количество", ПараметрыРасчета);

В данном примере система автоматически пересчитает Сумма, исходя из текущей Цена и нового Количество. Важно помнить, что этот метод отвечает преимущественно за базовую математику.

Метод 2: Комплексное заполнение через НоменклатураСервер

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

Процедура ЗаполнитьПараметрыСтрокиТабличнойЧасти позволяет подтянуть единицы измерения, счета учета и, что немаловажно, актуальные ставки НДС. Рассмотрим пример интеграции этого метода в свою обработку:


ПараметрыЗаполнения = Новая Структура;
ПараметрыЗаполнения.Вставить("ДокументОбъект", ЭтотОбъект);
ПараметрыЗаполнения.Вставить("ИмяТабличнойЧасти", "Запасы");

// Процедура заполнит недостающие реквизиты строки из данных справочника Номенклатура
НоменклатураСервер.ЗаполнитьПараметрыСтрокиТабличнойЧасти(СтрокаТЧ, ПараметрыЗаполнения);

Метод 3: Расчет налогов и НДС

Выясним причину, по которой сумма НДС может не пересчитаться автоматически. В Рознице 3 расчет налогов часто вынесен в отдельный модуль УчетНДСКлиентСервер. Если ваша задача — обеспечить корректность налоговых показателей после изменения суммы строки, используйте процедуру РассчитатьСуммуНДС.

Разберем пример кода для расчета НДС «в том числе» или «сверху»:


// Рассчитываем НДС для конкретной строки
// Параметры: СтрокаТЧ, ЦенаВключаетНДС (Булево), СтавкаНДС (Число или Ссылка)
УчетНДСКлиентСервер.РассчитатьСуммуНДС(СтрокаТЧ, ЭтотОбъект.ЦенаВключаетНДС);

Обратите внимание: реквизиты Сумма и СуммаНДС в Рознице 3 тесно связаны, и ручное изменение одного без вызова типовых процедур может привести к расхождениям в движениях документа.

Метод 4: Групповое изменение строк

Если ваша задача — изменить сразу множество строк ТЧ, например, реализовать изменение всех цен на процент для УНФ 3.0, стоит обратить внимание на модуль ГрупповоеИзменениеСтрокСервер — для этого подойдёт автоматический расчет цен по формулам для УНФ 3.0. Рассмотрим процедуру ОбработатьТаблицу, которая является мощным инструментом автоматизации.

Синтаксис вызова выглядит следующим образом:


ГрупповоеИзменениеСтрокСервер.ОбработатьТаблицу(
    ЭтаФорма, 
    Объект.Запасы, 
    Перечисления.ДействияГрупповогоИзмененияСтрок.УстановитьКоличество, 
    "Количество", 
    НовоеЗначение, 
    "Номенклатура"
);

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

Работа со скидками и наценками

В Рознице 3 реализован сложный механизм автоматических скидок. Простым перемножением Количество * Цена вы не добьетесь корректного итогового результата, если в системе настроены маркетинговые акции. Проанализируем, как вызвать пересчет скидок программно.

Для этого используется модуль СкидкиНаценкиСервер. После изменения количественных показателей в ТЧ необходимо вызвать процедуру расчета:


// Пересчет автоматических скидок для всего документа
СкидкиНаценкиСервер.РассчитатьСкидкиНаценки(ЭтотОбъект);

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

Резюме и рекомендации

Подводя итог, можно сказать, что универсальной «одной кнопки» в Рознице 3 нет, но API конфигурации позволяет гибко управлять расчетами. Рекомендуем придерживаться следующего алгоритма при написании обработок, будь то обычное заполнение или сложное создание документов установки цен за выбранный период:

  1. Измените базовый показатель (Количество или Цена).
  2. Используйте НоменклатураКлиентСервер.РассчитатьСуммуВСтрокеТЧ для первичной арифметики.
  3. Примените УчетНДСКлиентСервер.РассчитатьСуммуНДС для актуализации налогов.
  4. В конце процедуры вызовите СкидкиНаценкиСервер.РассчитатьСкидкиНаценки, чтобы учесть маркетинговые условия.

Такой системный подход гарантирует, что данные в вашей ТЧ не будут противоречить друг другу, а документ проведется без ошибок по регистрам накопления.

← На главную