При работе в современных конфигурациях на платформе 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С превентивно блокирует ввод таких коэффициентов в модулях менеджеров справочников, защищая базу от аварийного завершения работы при формировании отчетов или проведении документов.
Рассмотрим самый простой и безопасный с точки зрения стабильности системы вариант — переход на кубические сантиметры (см3) или литры (дм3).
Для кубических сантиметров кратность к кубометру составляет 1 000 000. Это значение полностью укладывается в системный лимит (10^6 < 10^7). Посмотрим на примере: если наша гайка имеет габариты 5х10х10 мм, ее объем составит 500 мм3, что равно 0,5 см3. Вводить такое значение в карточку номенклатуры удобно, а система при этом корректно пересчитает его в кубометры как 0,0000005 м3 без потери точности в стандартных полях.
Преимущества этого метода:
Разберем методический подход, который заложен разработчиками 1С. Вместо того чтобы указывать микроскопический объем для одной единицы товара (штуки), мы можем использовать индивидуальные упаковки.
Проанализируем алгоритм действий:
При отгрузке или приемке поштучно система будет использовать этот коэффициент для вычисления совокупного объема партии, избегая работы с числами с огромным количеством нулей после запятой на уровне базовой единицы.
Если специфика бизнеса требует хранения данных именно в мм3 и "насильный" перевод всей номенклатуры на см3 невозможен, рассмотрим технический способ, который использовали участники форума. В справочнике Номенклатура (или Упаковки, в зависимости от версии) для хранения объема используются два поля: числитель и знаменатель.
Мы можем программно установить коэффициент, который невозможно задать через интерфейс. Посмотрим на пример кода обработки, которая переводит номенклатуру на кубометры, сохраняя точность кубических миллиметров:
// Пример программной корректировки единиц объема
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
// Допустим, мы нашли номенклатуру, где объем указан в мм3
// Нам нужно перевести ее в м3, установив знаменатель 1 000 000 000
Если ОбъектНоменклатуры.ОбъемЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("мм3") Тогда
// Устанавливаем целевую единицу измерения - м3
ОбъектНоменклатуры.ОбъемЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("м3");
// Вместо изменения самого числа объема, мы меняем его знаменатель
// Если в поле Объем стоит 500, а в ОбъемЗнаменатель 1 000 000 000,
// система будет трактовать это как 500 / 1 000 000 000 м3
ОбъектНоменклатуры.ОбъемЗнаменатель = 1000000000;
ОбъектНоменклатуры.Записать();
Сообщить("Обработана номенклатура: " + ОбъектНоменклатуры.Наименование);
КонецЕсли;
КонецЦикла;
Важное предупреждение: Несмотря на то, что формы 1С могут корректно отображать результат деления, этот метод несет в себе скрытые угрозы:
Проанализировав все варианты, мы рекомендуем придерживаться следующей стратегии:
ОбъемЗнаменатель только в крайнем случае и будьте готовы к тому, что вам придется кастомизировать (дорабатывать) все отчеты, где выводится показатель объема, чтобы увеличить их точность отображения.Помните, что архитектурные ограничения системы часто имеют под собой веские основания, и их прямой "взлом" может привести к трудноуловимым ошибкам в расчетах себестоимости или логистики в будущем.