Как программно рассчитать скидки в 1С:УТ 11 на сервере без открытия форм

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

При разработке интеграций, таких как HTTP-сервисы или регламентные задания, программисты часто сталкиваются с необходимостью получить итоговые цены товаров с учетом всех автоматических скидок. В типовых конфигурациях (УТ 11, ERP, КА 2) логика расчета скидок исторически тесно связана с интерфейсом документа. Однако попытка вызвать процедуры формы на сервере — это тупиковый путь. Рассмотрим, как правильно использовать штатные механизмы конфигурации для решения этой задачи. Если обмен данными должен выполняться регулярно, можно автоматизировать обмен данными между конфигурациями 1С по расписанию без написания собственных сервисов.

Проблема использования клиентских процедур на сервере

Разберем типичную ситуацию: разработчику нужно отправить актуальные цены во внешнюю систему. Он видит, что в форме документа РеализацияТоваровУслуг есть кнопка "Рассчитать скидки", и пытается программно "нажать" её через ПолучитьФорму. Проблема заключается в том, что в контексте сервера (в сеансе HTTP-сервиса или фонового задания) клиентское приложение отсутствует. Использование объектов типа Форма там невозможно.

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

Подготовка данных для расчета

Для корректного расчета скидок системе недостаточно просто знать номенклатуру и цену. Скидки в 1С зависят от множества условий: партнера, соглашения, склада и даже времени суток. Рассмотрим по шагам, как подготовить объект для расчета. При выгрузке данных на внешние площадки используется модуль интеграции 1С:УТ 11, КА 2 и ERP с маркетплейсами для автоматической синхронизации цен и акций.

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


// Создаем объект документа (без записи в БД)
Реализация = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
Реализация.Дата = ТекущаяДата();
Реализация.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
Реализация.Партнер = Справочники.Партнеры.НайтиПоКоду("00001");
Реализация.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
Реализация.Валюта = Справочники.Валюты.НайтиПоНаименованию("RUB");

Важный момент: Обязательно заполняйте Соглашение (типовое или индивидуальное). Именно в нем хранятся правила применения скидок. Без указания соглашения типовой механизм может просто не найти подходящих условий.

Заполнение табличной части и использование служебных модулей

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

Посмотрим на пример заполнения строки:


НоваяСтрока = Реализация.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("КодТовара");
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = 1000; // Базовая цена до скидок

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

Вызов серверного метода расчета скидок

Теперь перейдем к самому главному — запуску расчета. Для этого используется метод СкидкиНаценкиСервер.Рассчитать. Нам потребуется подготовить структуру параметров, которая управляет поведением алгоритма.

Проанализируем необходимые параметры:

  1. ПрименятьКОбъекту — Истина (скидки будут записаны в ТЧ документа).
  2. ТолькоПредварительныйРасчет — Ложь (выполняем полный расчет).
  3. ВосстанавливатьУправляемыеСкидки — Истина.
  4. ИмяТабличнойЧасти — "Товары" (указываем, где лежат данные).

Пример программного вызова:


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

// Выполняем расчет
СкидкиНаценкиСервер.Рассчитать(Реализация, ПараметрыРасчета);

Получение результата и расчет итоговой цены

После выполнения метода Рассчитать, типовой механизм заполнит колонки СуммаАвтоматическойСкидки и ПроцентАвтоматическойСкидки в табличной части Товары. Также будут заполнены данные в служебной таблице ПримененныеСкидкиНаценки.

Выясним, как рассчитать итоговую цену для каждой строки:


Для Каждого СтрокаТовар Из Реализация.Товары Цикл
    // Итоговая сумма по строке после всех скидок
    ИтоговаяСумма = СтрокаТовар.Сумма - СтрокаТовар.СуммаАвтоматическойСкидки;
    
    // Вычисляем цену со скидкой
    ЦенаСоСкидкой = ?(СтрокаТовар.Количество <> 0, ИтоговаяСумма / СтрокаТовар.Количество, 0);
    
    // Теперь данные можно упаковывать в JSON для ответа HTTP-сервиса
    Сообщить("Товар: " + СтрокаТовар.Номенклатура + " | Цена со скидкой: " + ЦенаСоСкидкой);
КонецЦикла;

Особенности работы в сеансах без клиента

При работе через HTTP-сервис важно помнить, что любые попытки вызвать интерактивные действия (сообщения пользователю, вопросы, предупреждения) приведут к аварийному завершению сеанса. Хотя модуль СкидкиНаценкиСервер предназначен для работы на сервере, всегда проверяйте, чтобы ваши собственные обертки не использовали клиентский контекст.

Если расчет не дает ожидаемого результата (скидки равны нулю), проанализируйте следующие причины:

Использование связки СозданиеОбъекта -> ЗаполнениеРеквизитов -> СкидкиНаценкиСервер.Рассчитать является наиболее правильным и стабильным способом автоматизации расчетов в современных конфигурациях 1С. Это позволяет избежать дублирования сложной логики и гарантирует, что ваши цены всегда будут совпадать с теми, которые видит менеджер в интерфейсе программы. При необходимости ускорить выполнение данных алгоритмов при пакетной обработке можно использовать расширение для оптимизации и ускорения расчета скидок.

← На главную