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

Матрица нормирования ресурсов | узнать больше Автоматизируйте расчёт затрат, обеспечьте единообразие учёта и прозрачность калькуляциик 

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

Схема работы функции получения цены

Общая архитектура функции

Функция построена по модульному принципу и решает две основные задачи:

  1. Получение базовой цены из соответствующего справочника ценообразования (для вариации или изделия) с учетом фасовки.
  2. Корректировка цены и единицы измерения на основе правил пересчета из регистра сведений.

Такой подход обеспечивает разделение ответственности: первый блок отвечает за учетную стоимость материала, второй — за его технологическое применение.

Источники данных: вариация vs изделие

Функция реализует иерархический принцип получения данных: если передана вариация, цена берется из ее индивидуальных настроек, в противном случае — из настроек базового изделия. Это позволяет гибко управлять стоимостью даже в рамках одной номенклатурной группы.

Входной параметр Источник данных Ключевая логика
Вариация изделия (заполнена) Справочник
МЕДЕРП_ВариацииИзделий.Ценообразование
Поиск цены для конкретного артикула, производителя или спецификации. Учитывается тип упаковки (первичная/вторичная).
Вариация изделия (пусто) Справочник
МЕДЕРП_Изделия.Ценообразование
Поиск цены для всей категории материалов. Фасовка принимается равной 1 (цена за базовую единицу).

Таблица 1 — Выбор источника данных в зависимости от типа позиции

Учет фасовки при расчете цены

Критически важным аспектом является расчет цены за единицу использования с учетом фасовки. Для вариаций изделий предусмотрена гибкая настройка упаковки.

Алгоритм расчета для вариации:

  1. Проверяется флаг ИспользоватьВторичнуюУпаковку. Если он установлен и значение ФасовкаВторичнойУпаковки > 0, то именно оно используется для расчета.
  2. В противном случае проверяется флаг ИспользоватьПервичнуюУпаковку. Если он установлен и значение ФасовкаПервичнойУпаковки > 0, то используется оно.
  3. Если ни одно из условий не выполнено, фасовка принимается равной 1.

Формула расчета цены за единицу:

Позиция_Цена = ЦенаИзСправочника / Фасовка

Например, если набор реактивов стоит 10 000 руб. и рассчитан на 100 определений (фасовка = 100), то цена одного определения составит 100 руб.

Алгоритм применения правил пересчета

После получения базовой цены вступает в действие механизм правил пересчета материальных затрат, реализованный в регистре сведений Правила  пересчета материальных затрат технологических карт.

Последовательность действий:

  1. Поиск правила: Выполняется запрос к регистру для переданной позиции (изделия или вариации).
  2. Применение коэффициента:
    • Если правило найдено, полученная ранее цена делится на коэффициент пересчета: Цена = Позиция_Цена / Коэффициент.
    • Единица измерения заменяется на целевую из правила.
  3. Обработка отсутствия правила:
    • Если правило не найдено, используется базовая цена (Позиция_Цена) и базовая единица измерения (Позиция_ЕдИзмерения).
    • Коэффициент пересчета устанавливается в 0.

Особенности математики: Обратите внимание, что в функции выполняется именно деление на коэффициент. Это логично, так как коэффициент показывает, сколько единиц использования содержится в одной учётной единице. Если в упаковке 100 штук (коэффициент = 100), цена за штуку будет в 100 раз меньше цены упаковки.

// Фрагмент кода, демонстрирующий логику
Если Выборка.Следующий() Тогда
    // Цена за новую единицу = Цена за учётную единицу / Коэффициент
    Цена = Позиция_Цена / Выборка.Коэффициент;
    ЕдиницаИзмерения = Выборка.ЕдиницаИзмерения;
Иначе
    // Правило не найдено, используем базовые значения
    Цена = Позиция_Цена;
    ЕдиницаИзмерения = Позиция_ЕдИзмерения;
КонецЕсли;

Формирование результата

Для обеспечения прозрачности расчетов и возможности последующего анализа, функция возвращает не просто итоговую цену, а структуру с полным контекстом:

Поле результата Назначение
Цена Итоговая цена в целевых единицах (с учетом правил пересчета).
ЕдиницаИзмерения Единица измерения, в которой получена итоговая цена (из правил пересчета или базовая).
Позиция_ЕдИзмерения Базовая единица измерения позиции (из карточки номенклатуры).
Позиция_Цена Цена за базовую единицу (после учета фасовки, но до применения правил пересчета).
КоэффициентПересчетаЦены Примененный коэффициент. Равен 0, если правило не использовалось.

Таблица 2 — Состав возвращаемой структуры

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

Заключение

Описанная функция является ярким примером продуманной архитектуры, где гибкость учета сочетается с математической точностью. Четкое разделение этапов получения базовой цены (с фасовкой) и применения правил пересчета позволяет системе корректно рассчитывать себестоимость как для стандартных расходных материалов, так и для сложных многокомпонентных реактивов, гарантируя методологическое единство учетных и производственных данных. Именно эта функция является тем самым «двигателем», который обеспечивает точность калькуляции каждой медицинской услуги.