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

Общая архитектура функции
Функция построена по модульному принципу и решает две основные задачи:
- Получение базовой цены из соответствующего справочника ценообразования (для вариации или изделия) с учетом фасовки.
- Корректировка цены и единицы измерения на основе правил пересчета из регистра сведений.
Такой подход обеспечивает разделение ответственности: первый блок отвечает за учетную стоимость материала, второй — за его технологическое применение.
Источники данных: вариация vs изделие
Функция реализует иерархический принцип получения данных: если передана вариация, цена берется из ее индивидуальных настроек, в противном случае — из настроек базового изделия. Это позволяет гибко управлять стоимостью даже в рамках одной номенклатурной группы.
| Входной параметр | Источник данных | Ключевая логика |
|---|---|---|
| Вариация изделия (заполнена) | Справочник МЕДЕРП_ВариацииИзделий.Ценообразование |
Поиск цены для конкретного артикула, производителя или спецификации. Учитывается тип упаковки (первичная/вторичная). |
| Вариация изделия (пусто) | Справочник МЕДЕРП_Изделия.Ценообразование |
Поиск цены для всей категории материалов. Фасовка принимается равной 1 (цена за базовую единицу). |
Таблица 1 — Выбор источника данных в зависимости от типа позиции
Учет фасовки при расчете цены
Критически важным аспектом является расчет цены за единицу использования с учетом фасовки. Для вариаций изделий предусмотрена гибкая настройка упаковки.
Алгоритм расчета для вариации:
- Проверяется флаг
ИспользоватьВторичнуюУпаковку. Если он установлен и значениеФасовкаВторичнойУпаковки > 0, то именно оно используется для расчета. - В противном случае проверяется флаг
ИспользоватьПервичнуюУпаковку. Если он установлен и значениеФасовкаПервичнойУпаковки > 0, то используется оно. - Если ни одно из условий не выполнено, фасовка принимается равной 1.
Формула расчета цены за единицу:
Позиция_Цена = ЦенаИзСправочника / Фасовка
Например, если набор реактивов стоит 10 000 руб. и рассчитан на 100 определений (фасовка = 100), то цена одного определения составит 100 руб.
Алгоритм применения правил пересчета
После получения базовой цены вступает в действие механизм правил пересчета материальных затрат, реализованный в регистре сведений Правила пересчета материальных затрат технологических карт.
Последовательность действий:
- Поиск правила: Выполняется запрос к регистру для переданной позиции (изделия или вариации).
- Применение коэффициента:
- Если правило найдено, полученная ранее цена делится на коэффициент пересчета:
Цена = Позиция_Цена / Коэффициент. - Единица измерения заменяется на целевую из правила.
- Если правило найдено, полученная ранее цена делится на коэффициент пересчета:
- Обработка отсутствия правила:
- Если правило не найдено, используется базовая цена (
Позиция_Цена) и базовая единица измерения (Позиция_ЕдИзмерения). - Коэффициент пересчета устанавливается в 0.
- Если правило не найдено, используется базовая цена (
Особенности математики: Обратите внимание, что в функции выполняется именно деление на коэффициент. Это логично, так как коэффициент показывает, сколько единиц использования содержится в одной учётной единице. Если в упаковке 100 штук (коэффициент = 100), цена за штуку будет в 100 раз меньше цены упаковки.
// Фрагмент кода, демонстрирующий логику
Если Выборка.Следующий() Тогда
// Цена за новую единицу = Цена за учётную единицу / Коэффициент
Цена = Позиция_Цена / Выборка.Коэффициент;
ЕдиницаИзмерения = Выборка.ЕдиницаИзмерения;
Иначе
// Правило не найдено, используем базовые значения
Цена = Позиция_Цена;
ЕдиницаИзмерения = Позиция_ЕдИзмерения;
КонецЕсли;
Формирование результата
Для обеспечения прозрачности расчетов и возможности последующего анализа, функция возвращает не просто итоговую цену, а структуру с полным контекстом:
| Поле результата | Назначение |
|---|---|
| Цена | Итоговая цена в целевых единицах (с учетом правил пересчета). |
| ЕдиницаИзмерения | Единица измерения, в которой получена итоговая цена (из правил пересчета или базовая). |
| Позиция_ЕдИзмерения | Базовая единица измерения позиции (из карточки номенклатуры). |
| Позиция_Цена | Цена за базовую единицу (после учета фасовки, но до применения правил пересчета). |
| КоэффициентПересчетаЦены | Примененный коэффициент. Равен 0, если правило не использовалось. |
Таблица 2 — Состав возвращаемой структуры
Такая структура позволяет вызывающим процедурам не только получить итоговую стоимость для списания, но и понять, как именно она была рассчитана, что критически важно для аудита и отладки калькуляций.
Заключение
Описанная функция является ярким примером продуманной архитектуры, где гибкость учета сочетается с математической точностью. Четкое разделение этапов получения базовой цены (с фасовкой) и применения правил пересчета позволяет системе корректно рассчитывать себестоимость как для стандартных расходных материалов, так и для сложных многокомпонентных реактивов, гарантируя методологическое единство учетных и производственных данных. Именно эта функция является тем самым «двигателем», который обеспечивает точность калькуляции каждой медицинской услуги.
Калькуляция услуг
Изучите детальные аспекты калькуляции услуг в наших материалах: перейти к документации
