Использование кодировки Unicode (UTF) в значениях реквизитов

13 2

Возникла необходимость хранить в справочниках системы DIRECTUM строковые атрибуты, в которых присутствуют символы, отсутствующие в кодировке Windows-1251, которая используется по умолчанию.
Рассмотрим на примере тестового справочника хранение значений реквизитов в кодировке Unicode.
Создадим несохраняемый табличный реквизит под названием NVarchar, который будет храниться в Таблице24 (для примера).

В таблицу MBAnValR24 на SQL сервере добавим поле NVarch (название отличается от имени поля, которое мы использовали при создании реквизита) с типом nvarchar(255). В этом поле будут храниться значения нашего реквизита.

ALTER TABLE MBAnValR24 ADD NVarch nvarchar(255) NULL;

Создадим справочник TestNVarchar и добавим в список его реквизитов вновь созданный реквизит.



В событие Набор данных - Открытие необходимо добавить следующий код для корректного отображения значений реквизита:

DDS=Object.DetailDataSet(24)
DDS.AddSelect('NVarch';fdtWideString;255) // добавляем в выборку нужное нам поле
// сопоставляем значение поля из БД и несохраняемый реквизит для показа
DDS.RequisiteFactory.CreateWideStringRequisite('NVarchar'; 'NVarchar'; 'NVarch'; alLeft) 
В событие Запись - Сохранение добавляем следующий код для корректного обновления данных:
DDS=Object.DetailDataSet(24)
// в цикле идем по каждой записи и обновляем поле в БД
foreach Rec in DDS
s = FORMAT("UPDATE MBAnValR24 SET NVarch=N'%s' WHERE Vid=%s AND Analit=%s and XRecID=%s" ; ArrayOf(Rec.Fields('NVarch').Value;Rec.SYSREQ_REFERENCE_TYPE_ID;Rec.SYSREQ_MAIN_RECORD_ID;Rec.SYSREQ_ID)) 
//при обновлении поля типа nvarchar перед новым значением необходимо ставить букву N
//ShowMessage(s)
SQL(s)
endforeach

Справочник готов.

Результат:


 

Валерий Самарин

Наверное можно было вместо нового поля в таблице использовать обычное строковое, в него записывать unicode-текст, преобразованный в base64, при считывании в несохраняемый реквизит обратно преобразовывать в unicode. Преимущество такого метода - механизм не сломается при конвертации. Минус - наверное работать будет чуть медленнее из-за преобразования.

Максим Буланов

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

Накладные расходы на декодирование из base64 не существенны.

P.S. Есть одна особенность. Использование сохраняемого реквизита с UTF-8 невозможно. Данные введенные в UTF-8 портятся при изменении фокуса поля.

 

Максим Буланов: обновлено 05.11.2019 в 13:31

Авторизуйтесь, чтобы написать комментарий