При переходе к разработке в конфигурации 1С:Розница 3 (или 1С:УНФ 3.0) специалисты, привыкшие к архитектуре 1С:Управление торговлей 11 или переходящие с версии 2.3, где часто требовалась установка цен номенклатуры на основании перемещения, часто сталкиваются с проблемой отсутствия привычных инструментов. Одной из таких проблем является поиск аналога общего модуля ОбработкаТабличнойЧастиКлиент и его процедуры ОбработатьСтрокуТЧ. В этой статье мы подробно разберем, как реализовать аналогичный механизм пересчета строки (цены, суммы, НДС, отклонения) в новой архитектуре.
Для начала проанализируем ситуацию: Розница 3 построена на ядре УНФ, где логика работы с товарными позициями сосредоточена в специализированных модулях работы с номенклатурой. В отличие от УТ 11, где расчеты сильно инкапсулированы внутри универсальных механизмов ТЧ, здесь используется более распределенный подход. Если мы программно меняем реквизит Количество в коде, нам необходимо самостоятельно инициировать цепочку пересчетов зависимых полей, что особенно критично при реализации таких задач, как установка закупочной и заполнение розничной цены в приходной накладной.
Рассмотрим наиболее близкий аналог для базовых арифметических операций. В конфигурации существует общий модуль НоменклатураКлиентСервер, который доступен как на клиенте, так и на сервере. Это делает его крайне удобным для использования в обработках заполнения.
Основная процедура, которая нам интересна — РассчитатьСуммуВСтрокеТЧ. Давайте разберем по шагам, как ее применить:
Количество).Посмотрим на пример кода, который можно использовать в серверном контексте:
// Предположим, ТекущаяСтрока — это строка нашей ТЧ
ТекущаяСтрока.Количество = НовоеЗначениеКоличества;
// Подготавливаем параметры для расчета (обычно это структура)
ПараметрыРасчета = Новая Структура;
ПараметрыРасчета.Вставить("ПересчитыватьСумму", Истина);
// Вызываем типовой механизм
НоменклатураКлиентСервер.РассчитатьСуммуВСтрокеТЧ(ТекущаяСтрока, "Количество", ПараметрыРасчета);
В данном примере система автоматически пересчитает Сумма, исходя из текущей Цена и нового Количество. Важно помнить, что этот метод отвечает преимущественно за базовую математику.
Проанализируем ситуацию, когда нам нужно не просто перемножить числа, а полностью заполнить строку данными, как если бы пользователь выбрал товар вручную. Для этого в Рознице 3 используется модуль НоменклатураСервер. Подобная логика часто встраивается в дополнительные обработки установки цен, которые расширяют стандартные формы документов оприходования или накладных — для этой задачи есть автоматизация расчета и массовой установки цен в документах.
Процедура ЗаполнитьПараметрыСтрокиТабличнойЧасти позволяет подтянуть единицы измерения, счета учета и, что немаловажно, актуальные ставки НДС. Рассмотрим пример интеграции этого метода в свою обработку:
ПараметрыЗаполнения = Новая Структура;
ПараметрыЗаполнения.Вставить("ДокументОбъект", ЭтотОбъект);
ПараметрыЗаполнения.Вставить("ИмяТабличнойЧасти", "Запасы");
// Процедура заполнит недостающие реквизиты строки из данных справочника Номенклатура
НоменклатураСервер.ЗаполнитьПараметрыСтрокиТабличнойЧасти(СтрокаТЧ, ПараметрыЗаполнения);
Выясним причину, по которой сумма НДС может не пересчитаться автоматически. В Рознице 3 расчет налогов часто вынесен в отдельный модуль УчетНДСКлиентСервер. Если ваша задача — обеспечить корректность налоговых показателей после изменения суммы строки, используйте процедуру РассчитатьСуммуНДС.
Разберем пример кода для расчета НДС «в том числе» или «сверху»:
// Рассчитываем НДС для конкретной строки
// Параметры: СтрокаТЧ, ЦенаВключаетНДС (Булево), СтавкаНДС (Число или Ссылка)
УчетНДСКлиентСервер.РассчитатьСуммуНДС(СтрокаТЧ, ЭтотОбъект.ЦенаВключаетНДС);
Обратите внимание: реквизиты Сумма и СуммаНДС в Рознице 3 тесно связаны, и ручное изменение одного без вызова типовых процедур может привести к расхождениям в движениях документа.
Если ваша задача — изменить сразу множество строк ТЧ, например, реализовать изменение всех цен на процент для УНФ 3.0, стоит обратить внимание на модуль ГрупповоеИзменениеСтрокСервер — для этого подойдёт автоматический расчет цен по формулам для УНФ 3.0. Рассмотрим процедуру ОбработатьТаблицу, которая является мощным инструментом автоматизации.
Синтаксис вызова выглядит следующим образом:
ГрупповоеИзменениеСтрокСервер.ОбработатьТаблицу(
ЭтаФорма,
Объект.Запасы,
Перечисления.ДействияГрупповогоИзмененияСтрок.УстановитьКоличество,
"Количество",
НовоеЗначение,
"Номенклатура"
);
Этот метод удобен тем, что он инкапсулирует внутри себя все необходимые вызовы пересчетов, включая скидки и налоги, имитируя интерактивные действия пользователя в форме документа.
В Рознице 3 реализован сложный механизм автоматических скидок. Простым перемножением Количество * Цена вы не добьетесь корректного итогового результата, если в системе настроены маркетинговые акции. Проанализируем, как вызвать пересчет скидок программно.
Для этого используется модуль СкидкиНаценкиСервер. После изменения количественных показателей в ТЧ необходимо вызвать процедуру расчета:
// Пересчет автоматических скидок для всего документа
СкидкиНаценкиСервер.РассчитатьСкидкиНаценки(ЭтотОбъект);
Только после этого шага итоговая Сумма строки будет считаться окончательной и корректной. Если же расчет производится в рамках специфических задач, таких как установка цен при сборке комплекта для УНФ, важно следить за последовательностью вызовов серверных методов.
Подводя итог, можно сказать, что универсальной «одной кнопки» в Рознице 3 нет, но API конфигурации позволяет гибко управлять расчетами. Рекомендуем придерживаться следующего алгоритма при написании обработок, будь то обычное заполнение или сложное создание документов установки цен за выбранный период:
Количество или Цена).НоменклатураКлиентСервер.РассчитатьСуммуВСтрокеТЧ для первичной арифметики.УчетНДСКлиентСервер.РассчитатьСуммуНДС для актуализации налогов.СкидкиНаценкиСервер.РассчитатьСкидкиНаценки, чтобы учесть маркетинговые условия.Такой системный подход гарантирует, что данные в вашей ТЧ не будут противоречить друг другу, а документ проведется без ошибок по регистрам накопления.