Почему в 1С на SQL-базе отрицательные числа отображаются в скобках и как это исправить

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Каждый разработчик 1С рано или поздно сталкивается с удивительным поведением платформы: один и тот же код в файловой базе работает «как надо», а после переноса на клиент-серверный вариант (SQL) начинает вести себя непредсказуемо. Типичный пример такой иллюзии — когда математическая операция (например, умножение на -1) якобы «не срабатывает» или «не видит преобразования числа», а отрицательные числа внезапно выводятся в круглых скобках вместо привычного знака минус.

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

В чем истинная причина проблемы: Клиент против Сервера

Для начала проанализируем ситуацию, с которой столкнулся разработчик. В коде выполняется простое действие:

ОбластьИтогТаблицы.Параметры.СуммаДолга = (-1) * ДолгНакопление;

В файловой базе результат выводится со знаком плюс (число положительное), а в базе SQL то же самое число выводится в круглых скобках, например, (100). Из-за этого кажется, что база SQL проигнорировала умножение.

На самом деле арифметические операции на уровне платформы 1С выполняются абсолютно одинаково вне зависимости от используемой СУБД (будь то файловая база, MS SQL Server, PostgreSQL или IBM DB2). Математика везде работает идентично. Разница кроется в региональных настройках (локали) операционной системы на компьютере пользователя и на сервере приложений 1С:

  1. В файловом варианте код формирования печатной формы полностью выполняется на стороне клиента. При этом 1С использует региональные настройки операционной системы Windows пользователя. Для русской локали отрицательные числа по умолчанию отображаются со знаком минус: -100.
  2. В клиент-серверном варианте (SQL) формирование табличного документа чаще всего происходит на сервере приложений (в контексте «На Сервере»). Сервер 1С ориентируется на региональные настройки операционной системы, в которой он запущен (Windows Server или Linux). На серверах очень часто по умолчанию установлена английская (США) локаль. В англоязычной финансовой традиции отрицательные числа принято записывать в круглых скобках: (100) означает -100.

Если в коде исходное значение ДолгНакопление из-за логики расчетов или знака в регистре оказалось положительным (например, 100), то после умножения на -1 оно стало отрицательным (-100). Клиентская база вывела его как -100, а серверная — применила свои настройки форматирования и превратила в (100). Разработчик увидел скобки и ошибочно решил, что число не изменило знак.

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

Решение 1. Использование функции модуля Абс() вместо умножения

Если наша главная задача — гарантированно получить положительное число (модуль долга), то вместо умножения на -1 или использования сложных проверок условий лучше применить встроенную функцию 1С Абс(). Это сделает код чище и избавит от логических ошибок, если исходное число вдруг окажется положительным.

Рассмотрим пример правильного заполнения параметра:


// Гарантированно получаем положительное значение долга
ОбластьИтогТаблицы.Параметры.СуммаДолга = Абс(ДолгНакопление);

Использование Абс() — это наиболее профессиональный подход с точки зрения написания чистого кода, когда знак числа не должен зависеть от логических условий.

Решение 2. Использование тернарного оператора в коде

Если логика требует более гибкого подхода (например, менять знак только у строго отрицательных чисел), мы можем воспользоваться условным тернарным оператором ?(). Проанализируем этот вариант:


// Если долг отрицательный, меняем его знак на противоположный, иначе оставляем как есть
ОбластьИтогТаблицы.Параметры.СуммаДолга = ?(ДолгНакопление < 0, -ДолгНакопление, ДолгНакопление);

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

Решение 3. Явное управление форматом вывода отрицательных чисел (параметр ЧО)

Если вам все же необходимо выводить отрицательные числа, но вы хотите полностью избавиться от круглых скобок на любых серверах, необходимо жестко настроить формат вывода. В платформе 1С для этого используется конструктор форматной строки и параметр ЧО (Представление отрицательных чисел).

Параметр ЧО может принимать следующие значения:

Применим явное форматирование непосредственно в коде при заполнении параметров табличного документа:


// Форматируем число: выводим 2 знака после запятой и жестко задаем вывод знака минус (ЧО=1)
ЧисловойФормат = "ЧЦ=15; ЧДЦ=2; ЧО=1";
ОбластьИтогТаблицы.Параметры.СуммаДолга = Формат(ДолгНакопление, ЧисловойФормат);

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

  1. Откройте макет вашего отчета или печатной формы.
  2. Выделите нужную ячейку (например, СуммаДолга) и откройте ее свойства (клавиша F4).
  3. Найдите свойство «Формат» и нажмите кнопку с тремя точками.
  4. В открывшемся конструкторе форматной строки перейдите на вкладку «Число».
  5. В поле «Отрицательные» выберите вариант со знаком минус (например, -1,1), избегая варианта «Авто» или варианта со скобками.

Решение 4. Централизованная настройка региональных установок базы данных

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

Выполним следующие шаги для глобальной настройки:

  1. Запустите базу данных 1С:Предприятие в режиме Конфигуратор.
  2. В главном меню перейдите в раздел Администрирование -> Региональные установки информационной базы....
  3. Снимите флажок «Использовать региональные установки текущего сеанса».
  4. В поле «Язык (страна)» выберите «Русский (Россия)».
  5. Убедитесь, что в поле «Представление отрицательных чисел» выбран вариант со знаком минус (-1,1).
  6. Нажмите кнопку «ОК» для сохранения настроек.

После применения этой настройки платформа 1С на стороне сервера перестанет обращаться к системной локали Windows Server / Linux и будет использовать единый стандарт отображения чисел для всех пользователей во всех сессиях. Проблема со скобками исчезнет навсегда. Для дополнительного контроля корректности переноса данных можно автоматически сравнить бухгалтерские и налоговые проводки между базами.

← На главную