В типовых решениях 1С, таких как "Управление торговлей 11", "ERP" или "Комплексная автоматизация", точность хранения денежных величин по умолчанию ограничена двумя знаками после запятой. Это продиктовано требованиями бухгалтерского учета и правилами работы с национальной валютой. Однако в оптовой торговле, при расчете себестоимости мелких деталей или работе с топливом, часто возникает потребность в точности до 4 знаков (так называемые «милликопейки»). Рассмотрим, как можно решить эту задачу, проанализируем риски и выберем оптимальный путь.
Большинство реквизитов, отвечающих за цены и суммы в УТ 11, типизированы через Определяемые типы. Одним из ключевых является ОпределяемыйТип.ДенежнаяСуммаНеотрицательная. Если мы изменим его точность в конфигурации, это автоматически применится ко многим документам и регистрам.
Вариант 1: Прямое изменение типа в конфигурации
Этот способ требует снятия конфигурации с поддержки (или перевода в режим возможности редактирования). Нам необходимо найти ОпределяемыйТип.ДенежнаяСуммаНеотрицательная и изменить его квалификатор числа на 15, 4.
Однако, простого изменения типа недостаточно. Разберем, почему:
// Пример стандартного округления в типовом коде
СуммаСНДС = Окр(Цена * Количество, 2);
Даже если в базе будет храниться 4 знака, при любом пересчете (например, при изменении количества в строке заказа) система принудительно обрежет сумму до 2 знаков. Нам придется перешерстить тысячи строк кода в поисках функции Окр(..., 2).
Начиная с платформы 8.3.20, разработчики получили больше свободы в работе с определяемыми типами через расширения. Однако, важно понимать нюанс: мы можем добавить в определяемый тип новый тип (например, ссылку на справочник), но прямое изменение точности числа в расширении для существующего типа часто ведет к конфликтам при обновлении основной конфигурации.
Рассмотрим пошагово, как это реализовать через расширение:
ОпределяемыйТип.ДенежнаяСуммаНеотрицательная.Цена в ТЧ Товары документа ЗаказПокупателя) и менять тип на Число (15, 4) непосредственно у них.Проанализируем последствия: при таком подходе объем заимствованных объектов в расширении будет колоссальным. Это фактически превращает расширение в "вторую конфигурацию", которую так же сложно поддерживать при обновлениях, как и основную.
Если заказчику требуется 4 знака только для удобства расчетов (например, цена за 1 грамм или 1 болт крайне мала), рассмотрим вариант использования коэффициентов единиц измерения. Это самый "безопасный" метод, не требующий вмешательства в программный код.
Разберем алгоритм настройки:
В этом случае точность 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 знака, следуйте этому плану:
ДенежнаяСуммаНеотрицательная и Цена. Не забываем про регистры накопления и регистры сведений (например, ЦеныНоменклатуры).Окр(..., 2) и ЧИСЛО(15, 2). Анализируем каждое место — нужно ли там менять точность.Корректировка реализации и Возврат товаров, там чаще всего вылезают ошибки округления.Подводя итог, можно сказать: технически задача решаема, но она несет огромный объем "технического долга". Каждое обновление системы станет для вас ручной работой по контролю типов и алгоритмов расчета. В большинстве случаев использование механизма упаковок (цена за 1000 шт.) является более предпочтительным и дешевым в поддержке решением.