При разработке сложных отчетов или печатных форм в системе 1С:Предприятие 8 программисты нередко сталкиваются с ситуацией, когда стандартных возможностей визуального редактора макетов становится недостаточно. Одной из таких проблем является ограничение разрядности дробной части числа. В Конфигураторе при настройке свойств ячейки, содержащей значение типа Число, поле «Точность» зачастую не позволяет установить значение больше 9. Это может стать критической преградой, если ваша задача связана с высокоточными вычислениями, например, при расчете удельного веса частичной оплаты дорогостоящих товаров или при работе с физическими величинами.
В данной статье мы подробно разберем, почему возникает это ограничение и какими способами его можно эффективно обойти, сохранив необходимую точность данных для вывода в табличный документ.
Прежде всего, важно понимать, что ограничение в 9 знаков после запятой — это ограничение исключительно визуального интерфейса Конфигуратора (диалогового окна свойств ячейки). Сама платформа 1С на уровне движка базы данных и вычислительного ядра поддерживает работу с числами гораздо большей разрядности. Числовой тип в 1С может иметь общую длину до 38 знаков.
Когда мы пытаемся настроить макет «руками», мы упираемся в программный лимит формы настроек. Однако, как только мы переходим к программному управлению объектами табличного документа, эти границы исчезают. Проблема проявляется именно в момент присвоения значения, если ячейка макета жестко типизирована в Конфигураторе с низкой точностью.
Самый надежный и правильный способ обойти ограничение — это программное переопределение свойств ячейки непосредственно перед выводом данных. Вместо того чтобы полагаться на настройки, заданные в макете, мы можем создать описание типа с нужной нам точностью с помощью объекта КвалификаторыЧисла.
Рассмотрим пошагово, как это реализовать в коде:
КвалификаторыЧисла, где указываем общую длину числа и желаемую точность (количество знаков после запятой).ОписаниеТипов, созданное на основе этих квалификаторов.Проанализируем пример кода, который позволяет установить точность до 15 знаков:
// Выделяем область ячейки (например, первая строка, первая колонка)
Ячейка = ТабличныйДокумент.Область(1, 1);
// Указываем точность: 30 знаков всего, из них 15 после запятой
Квалификатор = Новый КвалификаторыЧисла(30, 15);
Ячейка.ТипЗначения = Новый ОписаниеТипов("Число", Квалификатор);
// Теперь мы можем присвоить число с высокой точностью
Ячейка.Значение = 111222333444555.111222333444555;
Этот метод гарантирует, что данные не будут округлены платформой при попытке «впихнуть» их в стандартный формат ячейки макета.
Если вам не требуется программное управление типом, но нужно визуально отобразить большое количество знаков, можно воспользоваться параметром Формат. Конструктор форматной строки в Конфигураторе также может иметь ограничения в выпадающих списках, но поле ввода позволяет прописать строку формата вручную.
Разберем, какие параметры за это отвечают:
ЧЦ (Число Целых) — общая длина числа, включая дробную часть и десятичную точку.ЧДЦ (Число Десятичных Цифр) — количество знаков после запятой.Вы можете зайти в свойства ячейки в макете и в поле «Формат» вручную вписать строку, например: ЧЦ=25; ЧДЦ=12. Несмотря на то что конструктор может «ругаться» или сбрасывать ползунки, текстовое значение формата будет сохранено и применено при выводе табличного документа пользователю.
В некоторых специфических случаях, когда расчеты производятся вне табличного документа, а макет используется только для визуализации (без необходимости последующего суммирования данных средствами самого отчета), можно использовать строковый тип. Это полностью снимает любые ограничения по количеству символов.
Однако помните о последствиях:
Если вы выбрали этот путь, используйте функцию Формат(), чтобы преобразовать число в строку с нужной точностью перед передачей в параметр макета:
// Преобразуем число в строку с 12 знаками после запятой
ЗначениеДляВывода = Формат(НужноеЧисло, "ЧЦ=30; ЧДЦ=12; ЧГ=0");
ОбластьМакета.Параметры.ВашеЗначение = ЗначениеДляВывода;
Выясним причины, по которым высокая точность в макетах может вести себя непредсказуемо, и на что стоит обратить внимание.
1. Особенности деления в 1С.
При выполнении операции деления (например, 0.11 / 10 000 000.01) платформа 1С определяет точность результата на основании точности исходных чисел. Если результат деления имеет слишком много знаков, он может быть неявно округлен еще до того, как попадет в ячейку табличного документа. Чтобы избежать этого, рекомендуется явно использовать функцию Округлить() с указанием нужной разрядности или предварительно приводить переменные к нужному типу через ОписаниеТипов.
2. Экспорт в Microsoft Excel.
Это один из самых «болезненных» моментов. Даже если вам удалось вывести в табличный документ 1С число с 15 знаками после запятой, при сохранении файла в формате .xls или .xlsx вы можете столкнуться с потерей точности. Это связано с тем, что Excel использует стандарт IEEE 754 для чисел с плавающей запятой, который ограничен примерно 15-17 значащими цифрами в сумме (до и после запятой вместе). Если ваше число — это 10 000 000.0000000001, Excel, скорее всего, отбросит последние знаки.
3. Свойство «Содержит значение».
В свойствах ячейки макета есть флаг «Содержит значение». Если этот флаг установлен и выбран тип Число, ячейка ведет себя как строго типизированное поле. Если же флаг снят, данные в ячейке интерпретируются просто как текст или результат подстановки параметра. Для обхода ограничений часто бывает полезно снять этот флаг и управлять форматом вывода исключительно через форматную строку или предварительное преобразование данных в коде.
Мы проанализировали ситуацию с ограничением разрядности чисел в макетах 1С и выяснили, что оно носит интерфейсный характер. Для решения проблемы мы рекомендуем комбинировать программную установку ОписаниеТипов с использованием КвалификаторыЧисла и ручную корректировку форматных строк. Это позволит вам выводить данные практически любой необходимой точности, обходя стандартные лимиты Конфигуратора.