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