Переход с версии 1С:Управление торговлей 10.3 на 11.4 часто вызывает вопросы у пользователей и разработчиков, особенно в части ценообразования. В старой редакции механизм установки цен был более линейным, в то время как в 11-й версии архитектура стала гибче, но потребовала иного подхода к настройке. Рассмотрим ситуацию: в системе ведется учет по характеристикам (например, цвет или размер), но цена на товар должна быть единой, независимо от выбранного свойства. Разберем, как реализовать это стандартными средствами и как автоматизировать процесс с помощью программного кода.
Для начала проанализируем, как система 1С:Управление торговлей 11 ищет цену при подборе товара в документ реализации или заказа. Понимание этой логики позволит нам избежать лишнего программирования. Когда мы выбираем позицию с характеристикой, система обращается к регистру сведений ЦеныНоменклатуры и выполняет поиск по следующему приоритету:
Таким образом, если мы установим цену только на саму номенклатуру (оставив поле характеристики пустым), система теоретически должна подтягивать её для всех характеристик. Однако в УТ 11.4 штатный документ УстановкаЦенНоменклатуры часто принуждает пользователя к детализации, если в карточке номенклатуры включено использование характеристик. Выясним, как это обойти.
Прежде чем приступать к написанию кода, проверим настройки в пользовательском режиме. Рассмотрим параметры, которые влияют на требование детализации цен. Основная логика управления разрезами цен сосредоточена в справочнике ВидыЦен.
Выполним следующие шаги:
Если этот флаг установлен, программа будет требовать указания цены для каждой конкретной характеристики. Если мы снимаем этот флаг, то при создании документа УстановкаЦенНоменклатуры система позволит указать одну общую цену на товар. При этом в документах продажи, какую бы характеристику мы ни выбрали, будет подставляться именно эта общая цена.
Важный нюанс: Если для части товаров цены должны различаться по характеристикам, а для части — нет, рекомендуется использовать Ценовые группы. В настройках вида цены можно задать правила детализации индивидуально для каждой ценовой группы.
Бывают ситуации, когда бизнес-процесс требует физического наличия записей в регистре для каждой характеристики (например, для выгрузки на сторонние сайты или в специфические отчеты). В этом случае рассмотрим программный метод. Мы можем создать подписку на событие, которая при появлении новой характеристики или при проведении документа установки цен будет "размножать" цену на все доступные варианты товара.
Проанализируем ситуацию: пользователь создал новую характеристику "Размер XL", а цена на товар была установлена месяц назад. Чтобы цена подтянулась автоматически, нам нужно создать запись в регистре сведений ЦеныНоменклатуры.
Рассмотрим пример кода для подписки на событие ПриЗаписи справочника ХарактеристикиНоменклатуры:
Процедура ПриЗаписиХарактеристики(Источник, Отказ) Экспорт
// Получим актуальные цены для номенклатуры-владельца без учета характеристик
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
| ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, Номенклатура = &Номенклатура И Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("Номенклатура", Источник.Владелец);
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать();
// Создадим новый документ установки цен или запишем напрямую в регистр (зависит от настроек системы)
// В УТ 11 лучше использовать создание документа для сохранения истории и логичности учета
Пока Выборка.Следующий() Цикл
// Логика записи в регистр или формирования документа
КонецЦикла;
КонецПроцедуры
Однако, как справедливо отмечали эксперты, запись напрямую в регистр сведений, подчиненный регистратору, невозможна без самого документа. Поэтому правильнее будет использовать подписку на проведение документа УстановкаЦенНоменклатуры.
Рассмотрим еще один подход: создание обработки, которая помогает пользователю заполнить документ УстановкаЦенНоменклатуры всеми характеристиками номенклатуры с одинаковой ценой. Это позволит избежать "ковыряния" типовой конфигурации и остаться в рамках стандартных бизнес-процессов.
Посмотрим на алгоритм работы такой обработки:
ВидНоменклатуры).Пример фрагмента кода для реализации такого заполнения:
&НаСервере
Процедура ЗаполнитьХарактеристикиНаСервере(ТекущаяНоменклатура, ТекущаяЦена, ДокументОбъект)
// Получаем все характеристики номенклатуры
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Характеристики.Ссылка КАК Характеристика
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК Характеристики
|ГДЕ
| Характеристики.Владелец = &Владелец";
// Если характеристики общие для вида номенклатуры, запрос нужно изменить
Если ТекущаяНоменклатура.ИспользоватьХарактеристики Тогда
ВладелецХарактеристик = ?(ТекущаяНоменклатура.ВладелецХарактеристик = Неопределено,
ТекущаяНоменклатура,
ТекущаяНоменклатура.ВладелецХарактеристик);
Запрос.УстановитьПараметр("Владелец", ВладелецХарактеристик);
КонецЕсли;
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = ТекущаяНоменклатура;
НоваяСтрока.Характеристика = Результат.Характеристика;
НоваяСтрока.Цена = ТекущаяЦена;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию с точки зрения производительности. Если у вас 10 000 товаров, и у каждого по 20 характеристик, то при установке цен на каждую характеристику в регистре ЦеныНоменклатуры появится 200 000 записей вместо 10 000. При наличии 5-10 видов цен это количество вырастает до миллионов строк.
Рекомендация: Всегда отдавайте приоритет Способу 1 (настройка Вида цен). Это не только экономит место в базе данных, но и значительно ускоряет работу запросов при подборе товаров в документах, так как системе не приходится перебирать огромные массивы данных в регистре.
В 1С:УТ 11.4 механизм ценообразования тесно связан с понятием "Верхний уровень цен". Если вы используете иерархию (Номенклатура -> Характеристика), система всегда ожидает, что характеристика может иметь свою специфику. Если же ваша бизнес-модель подразумевает, что "Ботинки" стоят одинаково вне зависимости от размера, то само использование характеристик в разрезе цен является избыточным.
Если после отключения флага «Уточнять цену до характеристик» программа все равно требует их указания, проверьте, не установлены ли индивидуальные настройки в соглашениях с клиентами или в ценовых группах. Иногда настройки в этих объектах перекрывают общие настройки вида цены.
Для реализации логики "как в УТ 10.3" в современных редакциях программы:
Вида цен для отключения уточнения до характеристик.