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