Как реализовать точность 4 знака после запятой для цен и сумм в 1С:Управление торговлей 11

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

В типовых решениях 1С, таких как "Управление торговлей 11", "ERP" или "Комплексная автоматизация", точность хранения денежных величин по умолчанию ограничена двумя знаками после запятой. Это продиктовано требованиями бухгалтерского учета и правилами работы с национальной валютой. Однако в оптовой торговле, при расчете себестоимости мелких деталей или работе с топливом, часто возникает потребность в точности до 4 знаков (так называемые «милликопейки»). Рассмотрим, как можно решить эту задачу, проанализируем риски и выберем оптимальный путь.

Анализ структуры метаданных: Определяемый тип ДенежнаяСуммаНеотрицательная

Большинство реквизитов, отвечающих за цены и суммы в УТ 11, типизированы через Определяемые типы. Одним из ключевых является ОпределяемыйТип.ДенежнаяСуммаНеотрицательная. Если мы изменим его точность в конфигурации, это автоматически применится ко многим документам и регистрам.

Вариант 1: Прямое изменение типа в конфигурации

Этот способ требует снятия конфигурации с поддержки (или перевода в режим возможности редактирования). Нам необходимо найти ОпределяемыйТип.ДенежнаяСуммаНеотрицательная и изменить его квалификатор числа на 15, 4.

Однако, простого изменения типа недостаточно. Разберем, почему:

  1. Типовые расчеты в коде: Весь код конфигурации пронизан функциями округления. Рассмотрим типичный пример из общих модулей:

// Пример стандартного округления в типовом коде
СуммаСНДС = Окр(Цена * Количество, 2);

Даже если в базе будет храниться 4 знака, при любом пересчете (например, при изменении количества в строке заказа) система принудительно обрежет сумму до 2 знаков. Нам придется перешерстить тысячи строк кода в поисках функции Окр(..., 2).

Использование расширений: Возможности и ограничения

Начиная с платформы 8.3.20, разработчики получили больше свободы в работе с определяемыми типами через расширения. Однако, важно понимать нюанс: мы можем добавить в определяемый тип новый тип (например, ссылку на справочник), но прямое изменение точности числа в расширении для существующего типа часто ведет к конфликтам при обновлении основной конфигурации.

Рассмотрим пошагово, как это реализовать через расширение:

  1. Создадим новое расширение.
  2. Добавим в расширение ОпределяемыйТип.ДенежнаяСуммаНеотрицательная.
  3. Попробуем изменить точность. Внимание: если система не позволяет изменить точность напрямую, придется заимствовать конкретные реквизиты документов (например, Цена в ТЧ Товары документа ЗаказПокупателя) и менять тип на Число (15, 4) непосредственно у них.

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

Альтернативное решение: Методика «Упаковок» и коэффициентов

Если заказчику требуется 4 знака только для удобства расчетов (например, цена за 1 грамм или 1 болт крайне мала), рассмотрим вариант использования коэффициентов единиц измерения. Это самый "безопасный" метод, не требующий вмешательства в программный код.

Разберем алгоритм настройки:

  1. Для товара создается базовая единица измерения (например, "Штука").
  2. Создается дополнительная единица измерения или упаковка — "Тысяча штук" с коэффициентом 1000.
  3. Цена устанавливается не за 1 штуку (0,0012 руб.), а за 1000 штук (1,20 руб.).

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

Вариант с виртуальной валютой

Еще один интересный способ — завести в справочнике Валюты специальную единицу "Копейка" или "Миллирубль". Если вести учет в такой валюте, то фактически мы смещаем запятую на нужное количество знаков. Однако это потребует дисциплины от пользователей и может вызвать сложности при формировании регламентированной отчетности и выгрузке в бухгалтерию, так как там все равно ожидаются рубли с 2 знаками.

Критические риски и "подводные камни"

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

1. Регистры накопления
Если мы изменили точность в документах, но забыли про ресурсы регистров (например, ВыручкаИСебестоимостьПродаж), мы получим катастрофические расхождения. При проведении документа сумма 10.1234 превратится в 10.12 в регистре. При попытке закрытия месяца или возврате товара возникнут "хвосты" в 0.0034, которые будут висеть в остатках вечно.

2. Запросы и функция ВЫРАЗИТЬ
Многие отчеты и механизмы проведения используют запросы, где точность зашита жестко. Посмотрим на пример кода запроса:


// Фрагмент типичного запроса в УТ 11
"ВЫБРАТЬ
|   ВЫРАЗИТЬ(Таблица.Сумма / Таблица.Количество КАК ЧИСЛО(15, 2)) КАК СредняяЦена
|ИЗ ..."

Функция ВЫРАЗИТЬ с параметром ЧИСЛО(15, 2) мгновенно уничтожит все ваши 4 знака в результатах отчетов. Вам придется найти и исправить все подобные запросы в расширении или основной конфигурации.

3. Фискализация и 54-ФЗ
Согласно закону, кассовый чек не может содержать более 2 знаков после запятой в итоговых суммах. При попытке пробить чек из документа с 4 знаками, драйвер ККТ либо выдаст ошибку, либо округлит сумму самостоятельно. Это приведет к тому, что сумма по данным 1С не сойдется с суммой по данным фискального накопителя.

4. Электронный документооборот (ЭДО)
Форматы XML-файлов для счет-фактур и УПД, утвержденные ФНС, имеют жесткие ограничения на формат чисел. Попытка отправить файл с 4 знаками в поле суммы может привести к отказу на стороне оператора ЭДО или принимающей стороны.

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

Если после анализа всех рисков вы все же решили внедрять 4 знака, следуйте этому плану:

  1. Подготовка базы: Напишите обработку, которая проверит текущие остатки и обороты.
  2. Изменение метаданных: Правим определяемые типы ДенежнаяСуммаНеотрицательная и Цена. Не забываем про регистры накопления и регистры сведений (например, ЦеныНоменклатуры).
  3. Глобальный поиск: Ищем в коде все вхождения Окр(..., 2) и ЧИСЛО(15, 2). Анализируем каждое место — нужно ли там менять точность.
  4. Тестирование: Особое внимание уделите документам Корректировка реализации и Возврат товаров, там чаще всего вылезают ошибки округления.

Подводя итог, можно сказать: технически задача решаема, но она несет огромный объем "технического долга". Каждое обновление системы станет для вас ручной работой по контролю типов и алгоритмов расчета. В большинстве случаев использование механизма упаковок (цена за 1000 шт.) является более предпочтительным и дешевым в поддержке решением.

← На главную