Как перевести количество из базовой единицы измерения в единицу отчетов в 1С

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

В процессе разработки отчетов или кастомных механизмов в 1С часто возникает задача привести количество товара из базовых единиц хранения к единицам для отчетов. Несмотря на кажущуюся простоту, этот процесс имеет свои нюансы в зависимости от того, в какой конфигурации выполняется работа: в классической 1С:УПП (Управление производственным предприятием) или в современных решениях вроде 1С:ERP или 1С:УТ 11.

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

1. Разбор архитектуры хранения единиц измерения

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

  1. Базовая единица (ОКЕИ): Это единица измерения, указанная непосредственно в карточке номенклатуры. Она считается «эталонной» с коэффициентом 1. Все расчеты в регистрах накопления чаще всего ведутся именно в ней.
  2. Справочник ЕдиницыИзмерения: Это подчиненный справочник, где хранятся все дополнительные единицы (упаковки, ящики, паллеты, а также единицы для отчетов и хранения остатков).
  3. Коэффициент: Главный реквизит справочника ЕдиницыИзмерения. Он показывает, сколько базовых единиц содержится в данной единице.

Например, если базовая единица — «шт», а единица отчетов — «коробка», и в коробке 10 штук, то в элементе справочника ЕдиницыИзмерения для коробки будет стоять Коэффициент = 10.

2. Реализация пересчета в 1С:УПП 1.3

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

Проанализируем математическую модель:

Разберем пример программного кода для УПП:


// Предположим, у нас есть ссылка на Номенклатуру и исходное Количество в базовых единицах
БазовоеКоличество = 100; // например, 100 штук
ЕдиницаОтчетов = СсылкаНаНоменклатуру.ЕдиницаДляОтчетов;

Если ЗначениеЗаполнено(ЕдиницаОтчетов) Тогда
    Коэффициент = ЕдиницаОтчетов.Коэффициент;
    
    // Обязательно проверяем на 0, чтобы избежать критической ошибки
    Если Коэффициент <> 0 Тогда
        КоличествоВОтчетах = БазовоеКоличество / Коэффициент;
        Сообщить("Количество в единицах отчетов: " + КоличествоВОтчетах);
    Иначе
        Сообщить("Внимание: У единицы отчетов не задан коэффициент!");
    КонецЕсли;
Иначе
    Сообщить("Для номенклатуры не задана единица для отчетов");
КонецЕсли;

Важно помнить, что в УПП реквизиты ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов являются ссылками на справочник ЕдиницыИзмерения, а не просто элементами классификатора ОКЕИ. Именно в этих ссылках и «спрятан» нужный коэффициент.

3. Работа в современных конфигурациях (ERP, УТ 11, КА 2)

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

Рассмотрим использование функции в модуле НоменклатураКлиентСервер. Этот метод удобен тем, что он автоматически обрабатывает коэффициенты обеих единиц (исходной и целевой).


// Пример пересчета для современных систем
КоличествоВБазовых = 50;
ИсходнаяЕдиница = Номенклатура.БазоваяЕдиницаИзмерения; // Коэффициент 1
ЦелеваяЕдиница = Номенклатура.ЕдиницаИзмеренияДляОтчетов; // Ссылка на упаковку/единицу

// Вызываем стандартный метод пересчета
КоличествоРезультат = НоменклатураКлиентСервер.ПересчитатьКоличество(
    КоличествоВБазовых,
    ИсходнаяЕдиница,
    ЦелеваяЕдиница
);

Преимущества этого метода:

4. Сложные случаи: Вес, Объем и Плотность

Иногда возникает необходимость перевести «кг» в «м3». Как было замечено в обсуждении на форуме, это возможно только при наличии данных о плотности или если в справочнике ЕдиницыИзмерения для конкретной номенклатуры жестко прописаны параметры веса и объема. Для автоматического расчета весогабаритных показателей в документах можно использовать расширение для расчета веса, объема и контроля кратности упаковок.

Выясним, как это работает в типовых решениях:

Проанализируем пример расчета веса:


// Расчет веса партии товара
Если ЗначениеЗаполнено(Номенклатура.ЕдиницаХраненияОстатков) Тогда
    ВесЕдиницы = Номенклатура.ЕдиницаХраненияОстатков.Вес;
    ОбщийВес = КоличествоВДокументе * ВесЕдиницы;
КонецЕсли;

5. Резюме

Подведем итоги нашего анализа. Выбор метода «перевода» зависит от вашей конфигурации:

  1. В УПП и старых самописных системах: обращаемся напрямую к реквизиту Коэффициент справочника, подчиненного номенклатуре, и выполняем деление (для перехода к отчетам) или умножение (для перехода к базе). Всегда проверяйте коэффициент на 0!
  2. В ERP / УТ 11: используйте функции общих модулей (например, НоменклатураКлиентСервер), это обеспечит совместимость с будущими обновлениями и минимизирует ошибки в расчетах.

Таким образом, хотя «заветной кнопки» или одной функции для всех версий 1С не существует, понимание принципа работы коэффициентов позволяет легко решить задачу пересчета в любой конфигурации.

← На главную