Как обойти ограничение кратности единиц объема в 1С:Управление торговлей при использовании кубических миллиметров?

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

При работе в современных конфигурациях на платформе 1С:Предприятие 8.3 (таких как УТ 11, ERP 2 или КА 2) пользователи часто сталкиваются с жестким системным ограничением: невозможно установить коэффициент пересчета между единицами измерения более 10 000 000 к 1. Типичный пример — попытка сопоставить кубические миллиметры (мм3) и кубические метры (м3). Поскольку в одном кубометре содержится 1 000 000 000 (миллиард) кубических миллиметров, система выдает ошибку: "Кратность более 10 000 000 / 1".

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

Выясним причину возникновения ошибки

Прежде чем приступать к исправлению, разберем ситуацию с технической стороны. Ограничение кратности обусловлено архитектурой хранения числовых данных в СУБД (SQL). Большинство реквизитов, отвечающих за весогабаритные характеристики в типовых решениях 1С, имеют тип Число с разрядностью 15 и точностью 3 (или иногда 6).

Проанализируем риски: если кратность составит 1 000 000 000, то при выполнении любой арифметической операции в запросе (например, умножение количества товара на его объем для расчета заполняемости кузова) число знаков после запятой может увеличиться экспоненциально. Это неминуемо приведет к ошибке Numeric Overflow (арифметическое переполнение) на уровне SQL-сервера. Платформа 1С превентивно блокирует ввод таких коэффициентов в модулях менеджеров справочников, защищая базу от аварийного завершения работы при формировании отчетов или проведении документов.

Решение 1: Использование промежуточной единицы (см3 или литры)

Рассмотрим самый простой и безопасный с точки зрения стабильности системы вариант — переход на кубические сантиметры (см3) или литры (дм3).

Для кубических сантиметров кратность к кубометру составляет 1 000 000. Это значение полностью укладывается в системный лимит (10^6 < 10^7). Посмотрим на примере: если наша гайка имеет габариты 5х10х10 мм, ее объем составит 500 мм3, что равно 0,5 см3. Вводить такое значение в карточку номенклатуры удобно, а система при этом корректно пересчитает его в кубометры как 0,0000005 м3 без потери точности в стандартных полях.

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

  1. Отсутствие необходимости в доработке конфигурации.
  2. Корректная работа всех типовых отчетов и алгоритмов компоновки данных.
  3. Соблюдение стандартов точности хранения данных в SQL.

Решение 2: Использование механизма упаковок

Разберем методический подход, который заложен разработчиками 1С. Вместо того чтобы указывать микроскопический объем для одной единицы товара (штуки), мы можем использовать индивидуальные упаковки.

Проанализируем алгоритм действий:

  1. Для мелкоштучного товара создадим упаковку, например, "Ящик (1000 шт)".
  2. Укажем объем именно для этой упаковки. Например, для 1000 гаек объем составит 0,0005 м3.
  3. Это число система воспринимает абсолютно корректно, и точности разрядов хватает для всех складских расчетов.

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

Решение 3: Программный обход через реквизит ОбъемЗнаменатель

Если специфика бизнеса требует хранения данных именно в мм3 и "насильный" перевод всей номенклатуры на см3 невозможен, рассмотрим технический способ, который использовали участники форума. В справочнике Номенклатура (или Упаковки, в зависимости от версии) для хранения объема используются два поля: числитель и знаменатель.

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


// Пример программной корректировки единиц объема
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
    
    // Допустим, мы нашли номенклатуру, где объем указан в мм3
    // Нам нужно перевести ее в м3, установив знаменатель 1 000 000 000
    Если ОбъектНоменклатуры.ОбъемЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("мм3") Тогда
        
        // Устанавливаем целевую единицу измерения - м3
        ОбъектНоменклатуры.ОбъемЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("м3");
        
        // Вместо изменения самого числа объема, мы меняем его знаменатель
        // Если в поле Объем стоит 500, а в ОбъемЗнаменатель 1 000 000 000, 
        // система будет трактовать это как 500 / 1 000 000 000 м3
        ОбъектНоменклатуры.ОбъемЗнаменатель = 1000000000;
        
        ОбъектНоменклатуры.Записать();
        Сообщить("Обработана номенклатура: " + ОбъектНоменклатуры.Наименование);
    КонецЕсли;
КонецЦикла;

Важное предупреждение: Несмотря на то, что формы 1С могут корректно отображать результат деления, этот метод несет в себе скрытые угрозы:

Резюме и рекомендации

Проанализировав все варианты, мы рекомендуем придерживаться следующей стратегии:

  1. Наилучшая практика: Переведите номенклатуру с кубических миллиметров на кубические сантиметры. Это позволит сохранить высокую детализацию для мелких изделий (гаек, шайб) и при этом остаться в рамках ограничений платформы 1С и SQL-сервера по кратности (1 000 000 < 10 000 000).
  2. Для крупных партий: Используйте механизм упаковок, указывая объем для логистических единиц (коробок, паллет), что значительно упростит работу складского персонала и расчет логистики.
  3. Программный метод: Используйте ОбъемЗнаменатель только в крайнем случае и будьте готовы к тому, что вам придется кастомизировать (дорабатывать) все отчеты, где выводится показатель объема, чтобы увеличить их точность отображения.

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

← На главную