Как убрать запятую в тысячах при выгрузке чисел на сервере в 1С?

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

При переносе некоторых задач из клиентского контекста в фоновые задания на сервере разработчики часто сталкиваются с неожиданным поведением платформы 1С:Предприятие. Типичный пример такой проблемы — изменение формата представления чисел при выгрузке в текстовые файлы (TXT, CSV). Число, которое на клиенте выгружалось в привычном виде 1400,32, при запуске той же процедуры в фоновом задании на сервере внезапно превращается в строку вида 1,400.32. Попытки изменить региональные настройки операционной системы или использовать простое преобразование типов часто не приносят результата. Выясним причину этой проблемы и разберем по шагам правильные способы ее решения.

Почему на сервере меняется формат вывода чисел?

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

Когда программный код выполняется на стороне клиента, платформа 1С ориентируется на региональные настройки текущего пользователя операционной системы Windows. Для русскоязычной локали стандартом является отсутствие явного символа группировки тысяч (или использование пробела) и запятая в качестве десятичного разделителя. Именно поэтому на клиенте число выглядит привычным образом: 1400,32.

Однако при запуске фонового задания выполнение кода происходит непосредственно в контексте сервера 1С:Предприятия. Здесь окружение кардинально меняется:

  1. Учетная запись службы: Сервер 1С функционирует под специализированной системной учетной записью (например, USR1CV8 на Windows или usr1cv8 на Linux).
  2. Региональные стандарты по умолчанию: У системных профилей операционной системы по умолчанию часто установлена американская (en-US) локаль. В этой локали разделителем тысяч является запятая, а десятичным разделителем — точка.
  3. Проблема изменения настроек ОС: Если системный администратор меняет региональные параметры в Панели управления под своей учетной записью (Администратор), эти изменения затрагивают только его личный профиль. Системный профиль службы 1С остается со старыми англоязычными настройками.

Как исправить региональные настройки сервера (Административный способ)

Если вам необходимо, чтобы сервер по умолчанию использовал русскоязычные стандарты для всех системных служб, выполните следующие действия:

  1. Откройте «Панель управления» на сервере и перейдите в раздел «Региональные стандарты».
  2. Настройте формат вывода чисел и дат для текущего пользователя так, как это необходимо (выберите русский язык).
  3. Перейдите на вкладку «Дополнительно» (Administrative).
  4. Нажмите кнопку «Копировать параметры» (Copy settings). Для этого действия потребуются права администратора.
  5. В открывшемся окне установите галочку «Экран приветствия и системные учетные записи» (Welcome screen and system accounts). Это скопирует ваши текущие настройки в профиль системных служб, включая службу сервера 1С.
  6. Обязательно перезапустите службу «1С:Предприятие» через консоль служб Windows, чтобы изменения вступили в силу.

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

Программное решение с помощью функции Формат()

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

Для этого мы воспользуемся встроенной функцией Формат(). Нам нужно передать в нее число и строку формата, которая жестко определит правила отображения знаков.

Разберем по шагам ключевые параметры строки формата, которые решают нашу задачу:

  1. ЧГ=0 (Число Группировка) — этот параметр отвечает за разделение групп тысяч. Передавая значение 0, мы полностью отключаем группировку триад. Таким образом, любые разделители тысяч (будь то пробелы, запятые или точки) будут гарантированно удалены из результирующей строки.
  2. ЧРД=, (Число Разделитель Дробной) — этот параметр принудительно указывает платформе использовать именно запятую для отделения дробной части от целой, полностью игнорируя региональные стандарты операционной системы сервера.
  3. ЧДЦ=2 (Число Дробных Цифр) — этот параметр фиксирует количество знаков после запятой. Он крайне важен для выгрузки финансовых показателей (например, копеек), чтобы числа всегда содержали ровно два десятичных знака, даже если дробная часть равна нулю (например, чтобы получилось 1400,00 вместо 1400).

Посмотрим на пример практической реализации кода:


// Исходное число, полученное из базы данных
МоеЧисло = 1400.32; 

// Способ 1: Простое форматирование без группировки тысяч с принудительной запятой
СтрокаДляВыгрузки = Формат(МоеЧисло, "ЧГ=0; ЧРД=,"); 
// Результат на сервере и клиенте гарантированно будет: "1400,32"

// Способ 2: Жесткое форматирование с фиксацией 2 знаков дробной части
// Этот вариант идеален для выгрузки реестров, банковских файлов и регламентированных отчетов
СтрокаДляВыгрузкиСКопейками = Формат(МоеЧисло, "ЧЦ=15; ЧДЦ=2; ЧГ=0; ЧРД=,");
// Результат гарантированно будет содержать 2 знака после запятой: "1400,32"

Анализ типичных ошибок при работе со строками

Проанализируем распространенную ошибку начинающих разработчиков, которые пытаются решить проблему «в лоб» через текстовые преобразования и функции замены символов. Часто в коде можно встретить следующую конструкцию:


// Попытка преобразовать число через стандартную функцию Строка()
// и удалить пробелы или запятые вручную
СтрокаЧисла = Строка(МоеЧисло);
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", "");

Выясним причину, почему такой подход неэффективен и опасен:

  1. При использовании функции Строка() платформа 1С применяет региональные настройки текущего сеанса. На сервере в фоновом задании вы можете получить не пробел, а запятую в качестве разделителя тысяч, и замена обычного пробела просто ничего не изменит в строке 1,400.32.
  2. Даже если на сервере разделителем является пробел, локализация 1С использует для разделения групп тысяч не обычный пробел (код символа 32), а неразрывный пробел (ASCII-код 160). Обычная замена символа " " не найдет такой символ в строке.

Если вам все же по какой-то причине необходимо удалить пробелы из уже сформированной строки (хотя правильнее использовать Формат() еще на этапе преобразования числа), следует использовать предопределенную системную константу платформы 1С:


// Правильное удаление неразрывных пробелов из строкового представления числа
СтрокаБезПробелов = СтрЗаменить(ИсходнаяСтрока, Символы.НПП, "");

Однако в рассматриваемой ситуации, когда на сервере разделителем тысяч становится физическая запятая, строковые манипуляции только перегружают процессор. Использование функции Формат() с параметром ЧГ=0 полностью снимает необходимость в поиске и замене символов, делая код чистым, понятным и производительным.

← На главную