В процессе разработки отчетов или кастомных механизмов в 1С часто возникает задача привести количество товара из базовых единиц хранения к единицам для отчетов. Несмотря на кажущуюся простоту, этот процесс имеет свои нюансы в зависимости от того, в какой конфигурации выполняется работа: в классической 1С:УПП (Управление производственным предприятием) или в современных решениях вроде 1С:ERP или 1С:УТ 11.
В этой статье мы подробно разберем механику хранения коэффициентов и выясним, как правильно реализовать алгоритм пересчета программно.
Прежде чем писать код, проанализируем, как 1С хранит информацию о единицах. В большинстве типовых конфигураций (и в УПП, и в ERP) используется следующая иерархия:
ЕдиницыИзмерения. Он показывает, сколько базовых единиц содержится в данной единице.Например, если базовая единица — «шт», а единица отчетов — «коробка», и в коробке 10 штук, то в элементе справочника ЕдиницыИзмерения для коробки будет стоять Коэффициент = 10.
Как справедливо отмечено в обсуждении, в конфигурации УПП разработчики часто сталкиваются с отсутствием универсальной глобальной функции, которую можно вызвать одной строкой. Рассмотрим, как реализовать этот переход вручную.
Проанализируем математическую модель:
Разберем пример программного кода для УПП:
// Предположим, у нас есть ссылка на Номенклатуру и исходное Количество в базовых единицах
БазовоеКоличество = 100; // например, 100 штук
ЕдиницаОтчетов = СсылкаНаНоменклатуру.ЕдиницаДляОтчетов;
Если ЗначениеЗаполнено(ЕдиницаОтчетов) Тогда
Коэффициент = ЕдиницаОтчетов.Коэффициент;
// Обязательно проверяем на 0, чтобы избежать критической ошибки
Если Коэффициент <> 0 Тогда
КоличествоВОтчетах = БазовоеКоличество / Коэффициент;
Сообщить("Количество в единицах отчетов: " + КоличествоВОтчетах);
Иначе
Сообщить("Внимание: У единицы отчетов не задан коэффициент!");
КонецЕсли;
Иначе
Сообщить("Для номенклатуры не задана единица для отчетов");
КонецЕсли;
Важно помнить, что в УПП реквизиты ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов являются ссылками на справочник ЕдиницыИзмерения, а не просто элементами классификатора ОКЕИ. Именно в этих ссылках и «спрятан» нужный коэффициент.
В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), подход более унифицирован. Здесь разработчики реализовали специальные общие модули, которые позволяют не писать формулы деления/умножения вручную. Для быстрой подготовки структуры единиц и коэффициентов пересчета можно использовать обработку для массового создания упаковок номенклатуры.
Рассмотрим использование функции в модуле НоменклатураКлиентСервер. Этот метод удобен тем, что он автоматически обрабатывает коэффициенты обеих единиц (исходной и целевой).
// Пример пересчета для современных систем
КоличествоВБазовых = 50;
ИсходнаяЕдиница = Номенклатура.БазоваяЕдиницаИзмерения; // Коэффициент 1
ЦелеваяЕдиница = Номенклатура.ЕдиницаИзмеренияДляОтчетов; // Ссылка на упаковку/единицу
// Вызываем стандартный метод пересчета
КоличествоРезультат = НоменклатураКлиентСервер.ПересчитатьКоличество(
КоличествоВБазовых,
ИсходнаяЕдиница,
ЦелеваяЕдиница
);
Преимущества этого метода:
Иногда возникает необходимость перевести «кг» в «м3». Как было замечено в обсуждении на форуме, это возможно только при наличии данных о плотности или если в справочнике ЕдиницыИзмерения для конкретной номенклатуры жестко прописаны параметры веса и объема. Для автоматического расчета весогабаритных показателей в документах можно использовать расширение для расчета веса, объема и контроля кратности упаковок.
Выясним, как это работает в типовых решениях:
Вес и Объем.Количество на Вес, указанный в единице хранения остатков.Проанализируем пример расчета веса:
// Расчет веса партии товара
Если ЗначениеЗаполнено(Номенклатура.ЕдиницаХраненияОстатков) Тогда
ВесЕдиницы = Номенклатура.ЕдиницаХраненияОстатков.Вес;
ОбщийВес = КоличествоВДокументе * ВесЕдиницы;
КонецЕсли;
Подведем итоги нашего анализа. Выбор метода «перевода» зависит от вашей конфигурации:
Коэффициент справочника, подчиненного номенклатуре, и выполняем деление (для перехода к отчетам) или умножение (для перехода к базе). Всегда проверяйте коэффициент на 0!НоменклатураКлиентСервер), это обеспечит совместимость с будущими обновлениями и минимизирует ошибки в расчетах.Таким образом, хотя «заветной кнопки» или одной функции для всех версий 1С не существует, понимание принципа работы коэффициентов позволяет легко решить задачу пересчета в любой конфигурации.