При ведении учета номенклатуры с высокой точностью (например, драгоценные металлы, химические компоненты, фармацевтическое сырье или весовой товар) стандартной точности в 3 знака после запятой часто бывает недостаточно. При попытке изменить разрядность реквизита Количество в метаданных до Число(15, 4) разработчики нередко сталкиваются с ситуацией: под полными правами документы проводятся без ошибок, а у обычных пользователей проведение блокируется сообщением вида: «Остатка товара недостаточно: остаток 1.2759, требуется 1.276».
Разберем детально, почему возникает такое поведение системы, где именно скрывается округление и какие подходы позволяют решить эту задачу без нарушения целостности учета.
Проанализируем ситуацию: почему под полными правами документ проводится успешно, а у рядового пользователя возникает ошибка с округлением требуемого количества:
ПолныеПрава или специальные настройки дополнительных прав пользователей) в типовых решениях, таких как «Управление производственным предприятием» (УПП), может быть отключен оперативный контроль остатков при проведении. Проведение проходит напрямую, без обращения к проверочным запросам.Число(15, 3). В результате в запросе число 1.2759 округляется до 1.276, а в регистре на остатке лежит исходное значение с 4 знаками.Количество программно задается квалификатор Новый КвалификаторыЧисла(15, 3). При загрузке данных в такую таблицу платформа автоматически обрезает четвертый знак.Коэффициент справочника ЕдиницыИзмерения по умолчанию имеет тип Число(10, 3). При любых пересчетах через коэффициент происходит потеря точности.Если принято решение полностью перевести конфигурацию на 4 знака после запятой в количестве, необходимо выявить все места жесткого округления и исправить структуры регистров и запросов.
Разберем по шагам процесс поиска и устранения проблемы:
Запустим сеанс пользователя с ограниченными правами, под которым воспроизводится ошибка. В конфигураторе перейдем в меню Отладка — Подключение и подключимся к клиентскому сеансу. Установим точку останова в процедуре ОбработкаПроведения проводимого документа или в общем модуле управления запасами (например, в процедуре контроля остатков) и пошагово отследим момент, когда значение количества в переменной или таблице списания трансформируется из 4 знаков в 3.
Выполним глобальный поиск по конфигурации строки КАК Число(15,3) и КАК Число(15, 3). В типовых конфигурациях часто встречаются следующие конструкции, которые необходимо заменить на Число(15, 4):
// Было в типовом коде:
СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15, 3))) КАК ДокументКоличество
// Необходимо заменить на:
СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15, 4))) КАК ДокументКоличество
Проверим общие модули проведения и модули наборов записей регистров на наличие создания колонок таблиц значений через ОписаниеТипов:
// Корректировка квалификаторов числа для таблицы списания
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Число"));
Квалификатор = Новый КвалификаторыЧисла(15, 4);
ОписаниеТипаКоличество = Новый ОписаниеТипов(МассивТипов, , , Квалификатор);
ТаблицаДвижений.Колонки.Добавить("Количество", ОписаниеТипаКоличество);
Обязательно увеличим разрядность ресурса Количество во всех регистрах накопления (ТоварыНаСкладах, ПартииТоваровНаСкладах, ТоварыВРезервеНаСкладах, регистры учета затрат), а также в табличных частях всех документов товародвижения. Если пропустить хотя бы один регистр, в базе появятся незакрывающиеся микроостатки.
Переделка всех запросов, регистров, механизмов партионного учета и РАУЗ под 4 знака в крупных конфигурациях (УПП, Комплексная автоматизация) является крайне трудоемкой задачей, которая может нарушить регламентные алгоритмы расчета себестоимости и форматы обмена данными (ЭДО, CommerceML).
Рассмотрим более надежный и быстрый способ решения задачи с помощью стандартного функционала справочника ЕдиницыИзмерения:
1000). В документах поступления и реализации пользователи смогут выбирать килограммы, а система внутри регистров будет абсолютно точно и без округлений хранить целые или дробные значения в граммах с тремя знаками.КомплектацияНоменклатуры или КорректировкаЗаписейРегистров.Данный подход позволяет полностью исключить ошибки контроля остатков и сохранить типовую конфигурацию на полной поддержке.