Каждый разработчик 1С рано или поздно сталкивается с удивительным поведением платформы: один и тот же код в файловой базе работает «как надо», а после переноса на клиент-серверный вариант (SQL) начинает вести себя непредсказуемо. Типичный пример такой иллюзии — когда математическая операция (например, умножение на -1) якобы «не срабатывает» или «не видит преобразования числа», а отрицательные числа внезапно выводятся в круглых скобках вместо привычного знака минус.
В этой статье мы подробно разберем, почему возникает эта проблема, как архитектура клиент-серверного взаимодействия влияет на визуализацию данных и как правильно настроить форматирование чисел в 1С, чтобы отчеты выглядели одинаково на любых компьютерах и серверах.
Для начала проанализируем ситуацию, с которой столкнулся разработчик. В коде выполняется простое действие:
ОбластьИтогТаблицы.Параметры.СуммаДолга = (-1) * ДолгНакопление;
В файловой базе результат выводится со знаком плюс (число положительное), а в базе SQL то же самое число выводится в круглых скобках, например, (100). Из-за этого кажется, что база SQL проигнорировала умножение.
На самом деле арифметические операции на уровне платформы 1С выполняются абсолютно одинаково вне зависимости от используемой СУБД (будь то файловая база, MS SQL Server, PostgreSQL или IBM DB2). Математика везде работает идентично. Разница кроется в региональных настройках (локали) операционной системы на компьютере пользователя и на сервере приложений 1С:
-100.(100) означает -100.Если в коде исходное значение ДолгНакопление из-за логики расчетов или знака в регистре оказалось положительным (например, 100), то после умножения на -1 оно стало отрицательным (-100). Клиентская база вывела его как -100, а серверная — применила свои настройки форматирования и превратила в (100). Разработчик увидел скобки и ошибочно решил, что число не изменило знак.
Чтобы раз и навсегда решить эту проблему, нам нужно исключить зависимость от настроек операционной системы сервера и жестко зафиксировать правила форматирования чисел.
Если наша главная задача — гарантированно получить положительное число (модуль долга), то вместо умножения на -1 или использования сложных проверок условий лучше применить встроенную функцию 1С Абс(). Это сделает код чище и избавит от логических ошибок, если исходное число вдруг окажется положительным.
Рассмотрим пример правильного заполнения параметра:
// Гарантированно получаем положительное значение долга
ОбластьИтогТаблицы.Параметры.СуммаДолга = Абс(ДолгНакопление);
Использование Абс() — это наиболее профессиональный подход с точки зрения написания чистого кода, когда знак числа не должен зависеть от логических условий.
Если логика требует более гибкого подхода (например, менять знак только у строго отрицательных чисел), мы можем воспользоваться условным тернарным оператором ?(). Проанализируем этот вариант:
// Если долг отрицательный, меняем его знак на противоположный, иначе оставляем как есть
ОбластьИтогТаблицы.Параметры.СуммаДолга = ?(ДолгНакопление < 0, -ДолгНакопление, ДолгНакопление);
Этот способ решает проблему на уровне бизнес-логики программы, предотвращая появление нежелательных отрицательных значений еще до этапа вывода в макет.
Если вам все же необходимо выводить отрицательные числа, но вы хотите полностью избавиться от круглых скобок на любых серверах, необходимо жестко настроить формат вывода. В платформе 1С для этого используется конструктор форматной строки и параметр ЧО (Представление отрицательных чисел).
Параметр ЧО может принимать следующие значения:
(1,5).-1,5.- 1,5.Применим явное форматирование непосредственно в коде при заполнении параметров табличного документа:
// Форматируем число: выводим 2 знака после запятой и жестко задаем вывод знака минус (ЧО=1)
ЧисловойФормат = "ЧЦ=15; ЧДЦ=2; ЧО=1";
ОбластьИтогТаблицы.Параметры.СуммаДолга = Формат(ДолгНакопление, ЧисловойФормат);
Также вы можете настроить это свойство визуально, без написания кода:
СуммаДолга) и откройте ее свойства (клавиша F4).-1,1), избегая варианта «Авто» или варианта со скобками.Если вы хотите, чтобы вся информационная база вела себя одинаково независимо от настроек операционной системы конкретного сервера приложений, вы можете переопределить региональные настройки в Конфигураторе. При наличии большого количества баз эту процедуру можно автоматизировать с помощью программных роботов.
Выполним следующие шаги для глобальной настройки:
-1,1).После применения этой настройки платформа 1С на стороне сервера перестанет обращаться к системной локали Windows Server / Linux и будет использовать единый стандарт отображения чисел для всех пользователей во всех сессиях. Проблема со скобками исчезнет навсегда. Для дополнительного контроля корректности переноса данных можно автоматически сравнить бухгалтерские и налоговые проводки между базами.