Как вывести цену поступления в табличную часть документа реализации?

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

При оформлении документов продажи менеджерам нередко требуется видеть актуальную цену закупки номенклатуры непосредственно в строках табличной части документа. Это позволяет оперативно контролировать наценку и не допускать продаж ниже себестоимости. Рассмотрим, как правильно извлечь данные о закупочных ценах и отобразить их в документе реализации в конфигурациях на платформе 1С:Предприятие (таких как УТП, УТ 10.3, УПП).

Анализ источников данных о ценах поступления

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

В зависимости от учетной политики и используемого функционала цена закупки может храниться в двух регистрах:

  1. РегистрСведений.ЦеныНоменклатуры — хранит собственные типы цен компании (в том числе закупочные или плановые цены), которые регистрируются документом УстановкаЦенНоменклатуры.
  2. РегистрСведений.ЦеныНоменклатурыКонтрагентов — хранит прайс-листы поставщиков и цены, автоматически фиксируемые документами поступления при включенном флаге регистрации цен поставщика.

Формирование запроса к виртуальной таблице «СрезПоследних»

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

Разберем пример запроса для получения цен из регистра ЦеныНоменклатуры по списку товаров документа:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЦеныСрез.Номенклатура КАК Номенклатура,
    |	ЦеныСрез.Цена КАК ЦенаПоступления
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
    |		&Период,
    |		Номенклатура В (&МассивНоменклатуры)
    |			И ТипЦен = &ТипЦенЗакупочный) КАК ЦеныСрез";

Запрос.УстановитьПараметр("Период", ЭтотОбъект.Дата);
Запрос.УстановитьПараметр("МассивНоменклатуры", ЭтотОбъект.Товары.ВыгрузитьКолонку("Номенклатура"));
Запрос.УстановитьПараметр("ТипЦенЗакупочный", Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочная"));

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	НайденныеСтроки = ЭтотОбъект.Товары.НайтиСтроки(Новый Структура("Номенклатура", Выборка.Номенклатура));
	Для Каждого СтрокаТЧ Из НайденныеСтроки Цикл
		СтрокаТЧ.ЦенаПоступления = Выборка.ЦенаПоступления;
	КонецЦикла;
КонецЦикла;

Если учет цен поставщиков ведется в регистре ЦеныНоменклатурыКонтрагентов, то структура запроса строится аналогично с указанием измерения ТипЦен (или ВидЦены) и отбором по контрагенту-поставщику при необходимости.

Использование типовых функций конфигурации

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

Посмотрим на пример вызова типовой функции при изменении номенклатуры в строке табличной части:


СтрокаТабличнойЧасти = ЭлементыФормы.Товары.ТекущиеДанные;
Если СтрокаТабличнойЧасти <> Неопределено И ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура) Тогда
	ТипЦеныЗакупки = Константы.ТипЦенЗакупочная.Получить();
	
	СтруктураЦены = Ценообразование.ПолучитьЦенуНоменклатуры(
		СтрокаТабличнойЧасти.Номенклатура,
		, // Характеристика
		ТипЦеныЗакупки,
		ЭтотОбъект.Дата,
		ЭтотОбъект.ДоговорКонтрагента.ВалютаВзаиморасчетов
	);
	
	СтрокаТабличнойЧасти.ЦенаПоступления = СтруктураЦены.Цена;
КонецЕсли;

Важные нюансы при расчете цены поступления

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

  1. Учет характеристик: если по номенклатуре включен учет по характеристикам, срез последних обязательно должен учитывать измерение ХарактеристикаНоменклатуры, иначе будет получена неверная цена.
  2. Коэффициенты единиц измерения: в документе позиция может быть указана в упаковках, тогда как цена в регистре задается за базовую единицу. Необходимо выполнять пересчет: умножать базовую цену на коэффициент единицы измерения из строки документа.
  3. Курсы валют: если закупка фиксируется в иностранной валюте, а документ реализации оформляется в национальной, требуется выполнять пересчет по регистру КурсыВалют на дату проведения документа.
  4. Оптимизация структуры данных: если цена нужна менеджеру только для визуального контроля в момент создания документа, не обязательно добавлять реквизит в структуру метаданных документа. Достаточно добавить колонку на форму и заполнять ее динамически при открытии документа и при выборе товара.
  5. Права доступа: видимость колонки с ценой закупки следует программно ограничивать при открытии формы в зависимости от ролей пользователя, чтобы закрыть коммерческую информацию от менеджеров без соответствующих прав.
← На главную