Как настроить автоматическое изменение цен при росте курса валюты на 5% в 1С:ERP и КА 2

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

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

Механизм порогов срабатывания в типовом функционале

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

Проанализируем ситуацию: если ваша базовая цена (например, себестоимость) заведена в валюте, а продажные цены рассчитываются в рублях по формуле, то при изменении курса валюты в справочнике Валюты система увидит отклонение. Если в настройках вида цены указан порог пересчета 5%, то новые цены будут предложены к установке только в том случае, если разница между старой и новой ценой (вызванная курсом) превысит этот лимит.

Однако автор темы указывает на более сложную логику: нужно отслеживать именно изменение курса относительно момента последней переоценки, а не просто отклонение итоговой цены. Для реализации такой «памяти» системы типовых средств может быть недостаточно.

Реализация логики через систему расчетных цен

Рассмотрим вариант настройки структуры цен, который позволяет минимизировать ручной труд менеджеров. Предложим следующую схему:

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

Выясним причину, почему это удобно: такой подход позволяет четко разделить момент реального изменения цен в прайсе от ежедневных колебаний курсов в ЦБ РФ. Менеджер нажимает кнопку «Пересчитать» только тогда, когда это экономически оправдано.

Программная доработка формы «Установка цен номенклатуры»

Если требуется автоматизировать процесс непосредственно в рабочем месте менеджера, проанализируем пример программной доработки. Основная сложность заключается в том, что в документе Установка цен номенклатуры используется динамическое построение колонок. Данные хранятся в объекте ДеревоЦен.

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


Функция ДеревоЦенЦенаПриИзмененииКлиент(Элемент)
    
    ДанныеДляРасчетаВычисляемыхЦенНаКлиенте = Неопределено;
    ТекущиеДанные = Элементы.ДеревоЦен.ТекущиеДанные;
    
    Если ТекущиеДанные = Неопределено Тогда
        Возврат ДанныеДляРасчетаВычисляемыхЦенНаКлиенте;
    КонецЕсли;
    
    // Получаем курсы для сравнения (логика получения курсов зависит от ваших реквизитов)
    КурсБазовый = ПолучитьКурсВалютыБ(); 
    КурсНовый = ПолучитьКурсВалютыН(); 
    
    РазницаКурсов = КурсБазовый - КурсНовый;
    ПорогИзменения = (КурсНовый / 100 * 5); // 5 процентов
    
    // Если разница превышает порог, запускаем пересчет
    Если Абс(РазницаКурсов) >= ПорогИзменения Тогда
        
        ИмяТекущейКолонки = СтрЗаменить(Элемент.Имя, "ДеревоЦен", "");
        
        // Работаем с динамическими именами колонок вида цены
        Если СтрНайти(ИмяТекущейКолонки, "ПроцентИзмененияВидЦены") Тогда
            ИмяТекущейКолонки = СтрЗаменить(ИмяТекущейКолонки, "ПроцентИзмененияВидЦены", "ВидЦены");
            
            // Расчет новой цены с учетом процента
            ТекущиеДанные[ИмяТекущейКолонки] = Окр(
                ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки] * ((ТекущиеДанные["ПроцентИзменения"+ИмяТекущейКолонки] / 100) + 1),
                2);
                
            // Фиксация суммы изменения
            ТекущиеДанные["СуммаИзменения"+ИмяТекущейКолонки] = ТекущиеДанные[ИмяТекущейКолонки] - ТекущиеДанные["СтараяЦена" + ИмяТекущейКолонки];
        КонецЕсли;
        
    КонецЕсли;

КонецФункции

Важное замечание: При работе с ДеревоЦен в 1С:ERP следует учитывать, что идентификаторы колонок для видов цен содержат уникальный идентификатор (GUID) вида цены. Например: ВидЦены2dfe5138c38011e9a7b04cedfb985449. Чтобы сопоставить колонку с конкретным объектом СправочникСсылка.ВидыЦен, необходимо обращаться к коллекции ПараметрыДереваЦен, которая инициализируется при открытии формы.

Автоматизация через регламентное задание

Для исключения человеческого фактора (так называемых «ленивых менеджеров») рекомендуется реализовать регламентное задание. Проанализируем алгоритм его работы:

  1. Задание запускается по расписанию (например, каждое утро после загрузки курсов валют).
  2. Программа считывает текущий курс валюты из справочника Валюты.
  3. Программа находит последний проведенный документ Установка цен номенклатуры для нужных видов цен и считывает курс, актуальный на дату того документа.
  4. Если текущий курс отличается от «курса последней установки» более чем на 5%, программа программно создает новый документ Установка цен номенклатуры.
  5. В документе заполняются товары по остаткам или по определенному фильтру, рассчитываются новые цены по формулам и документ проводится.

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

Резюме

Подведем итог. Чтобы реализовать выборочный пересчет цен при скачке курса в 1С:ERP или КА:

Помните, что любое автоматическое изменение цен должно логироваться, а ответственные лица должны получать уведомления, чтобы избежать ошибок при резких аномалиях валютного рынка.

← На главную