Часто в процессе автоматизации бизнеса возникают задачи, требующие повышенной точности расчетов. Например, при торговле электроэнергией тариф может содержать пять и более знаков после запятой, тогда как типовая конфигурация 1С по умолчанию ограничивается двумя знаками. Попытка изменить разрядность через расширение при низком режиме совместимости (8.3.17 и ниже) приводит к ошибке: «Изменение типов недопустимо в режиме совместимости». Давайте разберем, почему возникает эта проблема и как ее грамотно решить.
Ошибка обусловлена тем, что платформа 1С воспринимает изменение длины или точности числового поля как изменение структуры данных в таблице базы данных. В режимах совместимости 8.3.17 и ниже расширениям запрещено вносить такие фундаментальные изменения в объекты основной конфигурации. Это ограничение введено для обеспечения целостности данных и предотвращения конфликтов при обновлении типовых решений.
Даже если бы удалось обойти данное ограничение, изменение типового реквизита Цена или Количество повлекло бы за собой:
НДС, скидок и распределения сумм, которые жестко «зашиты» под стандартную точность.ЭДО: форматы обмена с государственными органами строго регламентированы и не поддерживают нестандартную точность цен.Самый правильный с точки зрения архитектуры способ — не менять саму структуру хранения, а адаптировать методику учета. Рассмотрим пример с энергетикой. Вместо того чтобы пытаться хранить цену за 1 кВт*ч с пятью знаками, можно использовать более крупную единицу измерения.
ТабличнойЧасти документа.Если задача заключается исключительно в том, чтобы «красиво» вывести цену в печатной форме, нет необходимости трогать базу данных. Разберем шаги реализации:
ВнешнююПечатнуюФорму для нужного документа (например, РеализацияТоваровУслуг).Формат() для вывода цены с нужным количеством знаков.ПечатнойФормы:
// Пример вычисления цены в печатной форме с повышенной точностью
ТарифМегаватт = Выборка.Цена;
ЦенаКиловатт = ТарифМегаватт / 1000;
ОбластьСтрока.Параметры.Цена = Формат(ЦенаКиловатт, "ЧЦ=15; ЧДЦ=5");
Если данные тарифов поступают извне и требуют высокой точности для аналитики, создайте отдельный РегистрСведений. В нем вы можете задать нужную точность для ресурса Тариф (например, Число(15, 6)).
РегистраСведений.Выводимом поле формы, не пытаясь перезаписать типовой реквизит Цена в табличной части.Мы выяснили, что изменение разрядности типовых реквизитов — это путь к накоплению ошибок и сложностям с обновлением. Вместо борьбы с платформой, используйте архитектурные методы: коэффициенты пересчета для крупных единиц измерения, вычисления «на лету» в печатных формах или хранение точных данных во внешних регистрах. Эти методы позволяют гибко настроить учет под нужды предприятия, сохраняя типовую конфигурацию в стабильном состоянии.