Почему при изменении точности количества до 4 знаков документ округляет число до 3 знаков и как это исправить

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

При ведении учета номенклатуры с высокой точностью (например, драгоценные металлы, химические компоненты, фармацевтическое сырье или весовой товар) стандартной точности в 3 знака после запятой часто бывает недостаточно. При попытке изменить разрядность реквизита Количество в метаданных до Число(15, 4) разработчики нередко сталкиваются с ситуацией: под полными правами документы проводятся без ошибок, а у обычных пользователей проведение блокируется сообщением вида: «Остатка товара недостаточно: остаток 1.2759, требуется 1.276».

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

Причины возникновения ошибки

Проанализируем ситуацию: почему под полными правами документ проводится успешно, а у рядового пользователя возникает ошибка с округлением требуемого количества:

  1. Разделение логики проведения и отключение контроля остатков: для пользователей с полными правами (роль ПолныеПрава или специальные настройки дополнительных прав пользователей) в типовых решениях, таких как «Управление производственным предприятием» (УПП), может быть отключен оперативный контроль остатков при проведении. Проведение проходит напрямую, без обращения к проверочным запросам.
  2. Явное приведение типов в текстах запросов: в типовых алгоритмах проведения документов и проверки остатков количество пересчитывается в базовую единицу хранения остатков с помощью конструкций языка запросов, где жестко зашит тип Число(15, 3). В результате в запросе число 1.2759 округляется до 1.276, а в регистре на остатке лежит исходное значение с 4 знаками.
  3. Программное описание типов в таблицах значений: перед выполнением проверки модули формируют промежуточные таблицы списания, где для колонки Количество программно задается квалификатор Новый КвалификаторыЧисла(15, 3). При загрузке данных в такую таблицу платформа автоматически обрезает четвертый знак.
  4. Разрядность реквизитов единиц измерения: реквизит Коэффициент справочника ЕдиницыИзмерения по умолчанию имеет тип Число(10, 3). При любых пересчетах через коэффициент происходит потеря точности.

Способ 1. Локализация места округления и доработка метаданных

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

Разберем по шагам процесс поиска и устранения проблемы:

  1. Подключение отладчика к сеансу пользователя:

    Запустим сеанс пользователя с ограниченными правами, под которым воспроизводится ошибка. В конфигураторе перейдем в меню Отладка — Подключение и подключимся к клиентскому сеансу. Установим точку останова в процедуре ОбработкаПроведения проводимого документа или в общем модуле управления запасами (например, в процедуре контроля остатков) и пошагово отследим момент, когда значение количества в переменной или таблице списания трансформируется из 4 знаков в 3.

  2. Поиск жестких конструкций приведения типов в запросах:

    Выполним глобальный поиск по конфигурации строки КАК Число(15,3) и КАК Число(15, 3). В типовых конфигурациях часто встречаются следующие конструкции, которые необходимо заменить на Число(15, 4):

    
    // Было в типовом коде:
    СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15, 3))) КАК ДокументКоличество
    
    // Необходимо заменить на:
    СУММА(ВЫРАЗИТЬ(Док.Количество * Док.Коэффициент / Док.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Число(15, 4))) КАК ДокументКоличество
    
  3. Корректировка программно создаваемых типов:

    Проверим общие модули проведения и модули наборов записей регистров на наличие создания колонок таблиц значений через ОписаниеТипов:

    
    // Корректировка квалификаторов числа для таблицы списания
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("Число"));
    Квалификатор = Новый КвалификаторыЧисла(15, 4);
    ОписаниеТипаКоличество = Новый ОписаниеТипов(МассивТипов, , , Квалификатор);
    ТаблицаДвижений.Колонки.Добавить("Количество", ОписаниеТипаКоличество);
    
  4. Сквозное изменение разрядности во всех объектах:

    Обязательно увеличим разрядность ресурса Количество во всех регистрах накопления (ТоварыНаСкладах, ПартииТоваровНаСкладах, ТоварыВРезервеНаСкладах, регистры учета затрат), а также в табличных частях всех документов товародвижения. Если пропустить хотя бы один регистр, в базе появятся незакрывающиеся микроостатки.

Способ 2. Архитектурное решение без изменения метаданных (рекомендуемое)

Переделка всех запросов, регистров, механизмов партионного учета и РАУЗ под 4 знака в крупных конфигурациях (УПП, Комплексная автоматизация) является крайне трудоемкой задачей, которая может нарушить регламентные алгоритмы расчета себестоимости и форматы обмена данными (ЭДО, CommerceML).

Рассмотрим более надежный и быстрый способ решения задачи с помощью стандартного функционала справочника ЕдиницыИзмерения:

  1. Перевод базовой единицы в более мелкую: вместо единицы хранения остатков «кг» (килограмм) для проблемных позиций установим базовую единицу «г» (грамм) или «мг» (миллиграмм).
  2. Настройка коэффициентов: для удобства пользователей добавим дополнительную единицу измерения (например, килограмм с коэффициентом 1000). В документах поступления и реализации пользователи смогут выбирать килограммы, а система внутри регистров будет абсолютно точно и без округлений хранить целые или дробные значения в граммах с тремя знаками.
  3. Ввод новых позиций: если по номенклатуре уже были движения с базовой единицей «кг», создадим новую карточку номенклатуры с базовой единицей «г», после чего перенесем остатки с помощью документа КомплектацияНоменклатуры или КорректировкаЗаписейРегистров.

Данный подход позволяет полностью исключить ошибки контроля остатков и сохранить типовую конфигурацию на полной поддержке.

← На главную