Форматирование даты, числа, Булево: требования по локализации

#std763

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

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

1.1. Форматирование дат

для вывода дат следует учитывать, что в различных странах приняты различные порядок следования и разделители для составных частей даты.

Например, одна и та же дата: 20.12.2012 – для России, 12/20/2012 – для США.

Поэтому вместо явного задания формата даты рекомендуется использовать локальный формат даты (ДЛФ).

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

Неправильно:

Формат(ДатаУтверждения, "ДФ=дд.ММ.гггг");
Формат(ДатаУтверждения, "ДФ=ММММ гггг") + " г.";

Правильно:

Формат(ДатаУтверждения, "ДЛФ=ДД");
Формат(ДатаУтверждения, НСтр("ru='ДФ=''ММММ гггг ""г.""'''"));

1.2. Форматирование числа

Следует применять функцию НСтр к форматной строке в случае, когда
• для числа задается нечисловое представление нулевого значения (ЧН) ;
• указан шаблон форматирования числа (ЧФ);
• переопределяется разделитель дробной части (ЧРД).

Неправильно:

Предупреждение(Формат(100, "ЧН=Отсутствует"));
Предупреждение(Формат(100, "ЧФ=""$Ч' / Час'"""));

Правильно:

Предупреждение(Формат(100, НСтр("ru = 'ЧН=Отсутствует'")));
Предупреждение(Формат(100, НСтр("ru = 'ЧФ=""$Ч'' / Час''""'"))); // "$100 / Час"

1.3. Форматирование Булево

Для вывода Булево значения пользователю всегда применяйте функцию НСтр к форматной строке.

Неправильно:

Предупреждение(Формат(Истина, "БЛ=Нет; БИ=Да"));

Правильно:

Предупреждение(Формат(Истина, НСтр("ru='БЛ=Нет; БИ=Да'")));

1.4. Не следует переопределять поведение отображения локализации данных по умолчанию – формат отображения операционной системы. При использовании функции Формат следует избегать использовать параметр «L=».

2. При задании формата в полях ввода в формах и полях отчетов на базе СКД также рекомендуется локальный формат даты. Использовать другие форматы допустимо, если по сути решаемой задачи локальный формат не подходит – тогда форматная строка будет переводиться при переводе конфигурации.

3. При переопределении стандартных представлений полей в отчетах на базе СКД следует придерживаться тех же правил, что и в коде модулей. Например, неправильно:

"N " + ВОтветНаНомер + " от " + Формат(ВОтветНаДата, "ДФ=dd.MM.yyyy")

правильное выражение, по которому вычисляется представление поля:

СтрШаблон(
  НСтр("ru = 'N%1 от %2'"),
  ВОтветНаНомер,
  Формат(ВОтветНаДата, "ДЛФ=D"))

4. В случае, когда требуется передача значения в машиночитаемом виде, вне зависимости от информационной системы и настроек локализации, применяемых в ней, вместо локализации значения следует выполнить сериализацию. Локализацию дат нужно использовать всегда, когда это возможно. В тех случаях, когда это технически нецелесообразно, допускается отказываться от локализации. Например, при генерации файла формата XML, поддерживаемого банк-клиентом системы, специфичной для России.

В общем случае для сериализации рекомендуется использовать метод XMLСтрока.

Для десериализации XMLЗначение. Или метод ПривестиЗначение объекта ОписаниеТипов.

4.1. Сериализация дат

При разработке собственных форматов передачи данных между различными системами рекомендуется сериализовать дату в формате ISO: "ГГГГ-ММ-ДДTЧЧ:ММ:ССZ", например "2009-02-15T00:00:00Z" (соответствует типу dateTime схемы XML см. http://www.w3.org/TR/xmlschema-2/#dateTime).

Неправильно:

Строка = Формат(Дата, "ДФ=гггг-ММ-ддTЧЧ:мм:сс"); // Сериализация

Правильно:

// Сериализация
Строка = XMLСтрока(Дата); // Сериализация
// Или
Строка = ЗаписатьДатуJSON(Дата, ФорматДатыJSON.ISO); // Сериализация
ОписаниеТипа = Новый ОписаниеТипов("Дата");
Дата = ОписаниеТипа.ПривестиЗначение(Строка);
// Десериализация
Дата = XMLЗначение(Тип("Дата"), Строка); 
// Или
Дата = ПрочитатьДатуJSON(Строка, ФорматДатыJSON.ISO);

4.2. Сериализация числа

Неправильно:

// Сериализация
Строка = Строка(Число);
// Или
Строка = Формат(Число);

Правильно:

Строка = XMLСтрока(Число); // Сериализация
Число = XMLЗначение(Тип("Число"), Строка); // Десериализация

4.3. Сериализация Булево

Неправильно:

// Сериализация
Строка = Строка(Булево);
// Или
Строка = Формат(Булево);
// Или
Строка = Формат(Булево, "БЛ=off; БИ=on");

Правильно:

// Сериализация
Строка = XMLСтрока(Булево);
// Или
Булево = XMLЗначение(Тип("Булево "), Строка);
// Или
Строка = ?(Булево, "on", "off");