Кодировка WIN1251 в PostgreSQL Centos
На винде стоит платформа 1С, на линуксе 1С сервер и PostgreSQL, при загрузке с клиент банка dbf файла информация отображается в иероглифах. Шрифты для 1с на линуксе стоят, локаль ru_Ru.cp1251 тоже есть, пробовал пересобирать кластер постгри под разные кодировки, но ничего не помогло. Возможно кто то сталкивался?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Тогда читайте файл на клиенте, все корректно прочитается, а потом обрабатывайте на сервере...
000.dbf положить в корень диска C:
На винде стоит платформа 1С
Тогда читайте файл на клиенте, все корректно прочитается, а потом обрабатывайте на сервере...
&НаСервере
Процедура ПриОткрытииНаСервере()
// Вставить содержимое обработчика.
ТаблицаОД = РеквизитФормыВЗначение("ТаблицаОбДанных");
Для Каждого Строка из ТаблицаОД Цикл
Сообщить(Строка.Поле1 + " " + Строка.Поле2)
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ФайлDBF = Новый XBase;
//ФайлDBF.Кодировка = КодировкаXBase. ; //???
ФайлDBF.ОткрытьФайл("c:\\000.DBF",,Истина);
ФайлDBF.Первая();
ТаблицаОбДанных.Очистить();
Пока Не ФайлDBF.ВКонце() Цикл
Если Не ФайлDBF.ЗаписьУдалена() Тогда
// Сообщить( ФайлDBF.POS + " " + ФайлDBF.NNASP);
СтрокаТаблицы = ТаблицаОбДанных.Добавить();
СтрокаТаблицы.Поле1 = ФайлDBF.POS;
СтрокаТаблицы.Поле2 = ФайлDBF.NNASP;
КонецЕсли;
ФайлDBF.Следующая(); // переходим к следующей записи
КонецЦикла;
ФайлDBF.ЗакрытьФайл();
ПриОткрытииНаСервере();
КонецПроцедуры
Показать000.dbf положить в корень диска C:
Прикрепленные файлы:
000.DBF
ВнешняяОбработка2.epf
Да там не в в базе дело. У меня была такая проблема. Процедура загрузки выполнялась на сервере. При изменении деректив на клиент кодировка пошла нормально. При анализе кода было выявлено что разбор файла происходит внешней компанентой что была в общих макетах. Я сообщил разработчикам об этом и знаете что они сделали? В следующем релизе уже стояло условие проверяющие тип системы и при обнаружении линукса кодировка цп1251 удалялась из списка.
(8)
Платформа 8.3.9.2170, у Вас какая была платформа?
Да там не в в базе дело. У меня была такая проблема. Процедура загрузки выполнялась на сервере. При изменении деректив на клиент кодировка пошла нормально. При анализе кода было выявлено что разбор файла происходит внешней компанентой что была в общих макетах. Я сообщил разработчикам об этом и знаете что они сделали? В следующем релизе уже стояло условие проверяющие тип системы и при обнаружении линукса кодировка цп1251 удалялась из списка.
Платформа 8.3.9.2170, у Вас какая была платформа?
Ну где-то рядом. Я думаю в базу уже ложится с кракозябрами строка. И получается она в момент чтения. То есть кодировка не постгрес а сервера должна быть 1251. У него по-моему ключ есть для указания локали. И есши указать локаль как ru_RU или просто ru боюсь система поймет это как ru.utf8. А вообще чтоб не парится я с банка просто утф8 выгружаю. Раньше была проблема, а сейчас все банки у нас умеют в юникод.
(14)
Функция ИмпортDBF(Параметры)
ФайлDBF = Новый XBase;
ФайлDBF.Кодировка = КодировкаXBase.ANSI ; //???
ИмяФайла = Параметры.ИмяФайла;
Попытка
ФайлDBF.ОткрытьФайл(ИмяФайла,,Истина); //Только для чтения
Исключение
Предупреждение("Ошибка открытия файла " + ИмяФайла);
Возврат Неопределено;
КонецПопытки;
Если НЕ ФайлDBF.Открыта() Тогда
Предупреждение("Ошибка открытия файла " + ИмяФайла);
Возврат Неопределено;
КонецЕсли;
тзВыписка = Новый ТаблицаЗначений;
тзВыписка.Колонки.Добавить("НомерПП");
тзВыписка.Колонки.Добавить("Приход");
тзВыписка.Колонки.Добавить("Расход");
тзВыписка.Колонки.Добавить("ОКПО");
тзВыписка.Колонки.Добавить("Контрагент");
тзВыписка.Колонки.Добавить("МФО");
тзВыписка.Колонки.Добавить("РСчет");
тзВыписка.Колонки.Добавить("Содержание");
ФайлDBF.Первая();
Пока НЕ ФайлDBF.ВКонце() Цикл
// проверка на дату платежа
Если ФайлDBF.DATA_S <> Параметры.ДатаДок И СокрЛП(ФайлDBF.DATA_S) <> Формат(Параметры.ДатаДок,"ДФ=yyyyMMdd") Тогда
ФайлDBF.Следующая();
Продолжить;
КонецЕсли;
// проверка на совпадение расчетного счета
Если СокрЛП(Формат(ФайлDBF.KL_CHK, "ЧГ=0")) = Параметры.РСчет Тогда
Если СокрЛП(Формат(ФайлDBF.DK, "ЧГ=0")) ="1" Тогда
НовСтрока = тзВыписка.Добавить();
НовСтрока.РСчет = СокрЛП(Формат(ФайлDBF.KL_CHK_K,"ЧГ=0"));
НовСтрока.МФО = СокрЛП(Формат(ФайлDBF.MFO_K,"ЧГ=0"));
НовСтрока.ОКПО = СокрЛП(Формат(ФайлDBF.KL_OKP_K,"ЧГ=0"));
НовСтрока.Контрагент = СокрЛП(ФайлDBF.KL_NM_K);
НовСтрока.Приход = 0;
НовСтрока.Расход = ФайлDBF.S;
ИначеЕсли СокрЛП(Формат(ФайлDBF.DK, "ЧГ=0")) ="2" Тогда
НовСтрока = тзВыписка.Добавить();
НовСтрока.РСчет = СокрЛП(Формат(ФайлDBF.KL_CHK_K,"ЧГ=0"));
НовСтрока.МФО = СокрЛП(Формат(ФайлDBF.MFO_K,"ЧГ=0"));
НовСтрока.ОКПО = СокрЛП(Формат(ФайлDBF.KL_OKP_K,"ЧГ=0"));
НовСтрока.Контрагент = СокрЛП(ФайлDBF.KL_NM_K);
НовСтрока.Приход = ФайлDBF.S;
НовСтрока.Расход = 0;
КонецЕсли;
Иначе
ФайлDBF.Следующая();
Продолжить;
КонецЕсли;
НовСтрока.НомерПП = ФайлDBF.ND;
НовСтрока.Содержание = СтрЗаменить(ФайлDBF.N_P,Символы.ПС," ");
ФайлDBF.Следующая();
КонецЦикла;
Если НЕ тзВыписка.Количество() И ФайлDBF.КоличествоЗаписей() Тогда
Предупреждение("В текущем файле нет платежей с данной датой выписки и расчетным счетом!");
КонецЕсли;
ФайлDBF.ЗакрытьФайл();
Возврат тзВыписка;
КонецФункции
Показать
Понятно. Средствами платформы.
locale -a | grep ru - вывод вот этого в консоли покажите.
Еще вот здесь точку поставьте
НовСтрока.Контрагент = СокрЛП(ФайлDBF.KL_NM_K);
скопируйте содержимое при отладке, чтобы понимать кракозябры получаются еще до манипуляций с данными или после.
locale -a | grep ru - вывод вот этого в консоли покажите.
Еще вот здесь точку поставьте
НовСтрока.Контрагент = СокрЛП(ФайлDBF.KL_NM_K);
скопируйте содержимое при отладке, чтобы понимать кракозябры получаются еще до манипуляций с данными или после.
(17) А если после НовСтрока.Контрагент = СокрЛП(ФайлDBF.KL_NM_K); сделать сообщить(ФайлDBF.KL_NM_K) выходят уже с кроказыбрами?
И вот вопрос. А какую из установленных консолей платформа выбирает для вывода?
localectl status сделайте
ну и что-то типа того
localectl set-locale LANG=ru_RU.cp1251
И вот вопрос. А какую из установленных консолей платформа выбирает для вывода?
localectl status сделайте
ну и что-то типа того
localectl set-locale LANG=ru_RU.cp1251
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот