Обновление цен по видам цен

Опубликовано Павел Путков 19.08.2022 0 Комментарии

Доработка типовой функции УТ 11.5 для обновления зависящих видов цен.

Например, мы с помощью Простой мониторинг цен (так просто ещё не было) считываем цены и регистрируем их в базе 1С как цены поставщика. Так же хотим, чтобы в зависимости от цен поставщика/конкурента, наши цены автоматически бы изменялись по той или иной формуле. Добавляем в справочник видов цен вид цены с формулой, например - "ЦенаКонкурента*0.9". Для автоматического расчета используем процедуру из общего модуля "УстановкаЦенСервер":

 

// Запускает обновление цен по видам цен
// 
// Параметры:
//   ВидыЦен - массив - элементов типа СправочникСсылка.ВидыЦен - виды цен, по которым необходимо обновить цены.
//   ПараметрыОбновленияЦен - Структура - со свойствами. Может содержать:
//    * ВариантОбновленияЦен - Число - вариант формирования видов цен (0 - все, 1- Только выбранные, 2 - Выбранные и зависисмые, 3 - Все кроме выбранных).
//
Процедура ВыполнитьОбновлениеЦен(ВидыЦен, ПараметрыОбновленияЦен) Экспорт
// Вставить содержимое метода.
//ПродолжитьВызов(ВидыЦен, ПараметрыОбновленияЦен, СписокНоменклатуры); 
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ОбновлениеЦен);
 
Если ПустаяСтрока(ИмяПользователя()) Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;
ВариантОбновленияЦен = ПараметрыОбновленияЦен.ВариантОбновленияЦен;
Если ВариантОбновленияЦен <> 0 И Не ЗначениеЗаполнено(ВидыЦен) Тогда
Возврат;
КонецЕсли;
 
МассивВидовЦен = ВидыЦен.ВыгрузитьКолонку("ВидЦены");
// инициализация структур для рассчета
  СтруктураФормы = ИнициализироватьСтруктуруФормы();
СтруктураФормы.Объект.ВидыЦен = ВидыЦен.Скопировать(,"ВидЦены");
 
УстановкаЦенСервер.ИнициализироватьВыбранныеЦены(СтруктураФормы);
СтруктураФормы.ТаблицаНастройкиКомпоновкиДанных = ПолучитьИзВременногоХранилища(СтруктураФормы.АдресХранилищаНастройкиКомпоновкиДанных);
 
СтруктураФормы.ВыбранныеЦены.Колонки.Добавить("СхемаКомпоновкиДанных");
Для каждого СтрокаВидЦен Из СтруктураФормы.ВыбранныеЦены Цикл
Схема = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(СтрокаВидЦен.АдресСхемыКомпоновкиДанных));
СтрокаВидЦен.СхемаКомпоновкиДанных = Схема.Получить();
//<<   18.08.2022
Если ПараметрыОбновленияЦен.Свойство("СписокНоменклатуры")
и ВидыЦен.Найти(СтрокаВидЦен.Ссылка,"ВидЦены")  <> Неопределено Тогда
СтрокаВидЦен.Выбрана = Истина;
 
НайденаяСтрока = СтруктураФормы.ТаблицаНастройкиКомпоновкиДанных.Найти(СтрокаВидЦен.Ссылка,"ВидЦены");
 
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(
НайденаяСтрока.НастройкиКомпоновкиДанных.Отбор,
"Номенклатура",
ВидСравненияКомпоновкиДанных.ВСписке,
ПараметрыОбновленияЦен.СписокНоменклатуры,
Неопределено,
Истина,
РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
 
 
КонецЕсли;
//>>    18.08.2022
КонецЦикла;
// применить настройки варианта обновления цен (0 - все цены; 1 - вбыранные; 2 - выбранные и зависимые; 3 - все кроме выбранных)
Если ВариантОбновленияЦен = 0 Тогда
// все цены
УстановкаЦенКлиентСервер.ИнвертироватьВыбранныеЦены(СтруктураФормы);
ИначеЕсли ВариантОбновленияЦен = 1 Тогда
// Только выбранные цены
// Ничего дополнительно не делаем
ИначеЕсли ВариантОбновленияЦен = 2 Тогда
// Выбранные и зависимые цены
УстановкаЦенКлиентСервер.ВыбратьВсеЗависимыеЦены(СтруктураФормы);
ИначеЕсли ВариантОбновленияЦен = 3 Тогда
// Все кроме выбранных цен
УстановкаЦенКлиентСервер.ИнвертироватьВыбранныеЦены(СтруктураФормы);
КонецЕсли;
// заполнить товары по отборам номенклатуры
УстановкаЦенСервер.ПостроитьДеревоЦен(СтруктураФормы);
 
Для индекс = 1 По 2 Цикл
СтруктураФормы.ДеревоЦен.Строки.Очистить();
УстановитьЦены(МассивВидовЦен, СтруктураФормы, ?(индекс = 1, "Обновление", "Обнуление"));
КонецЦикла;
КонецПроцедуры