Кодировка WIN1251 в PostgreSQL Centos

1. MstrSa 28.08.18 17:18 Сейчас в теме
На винде стоит платформа 1С, на линуксе 1С сервер и PostgreSQL, при загрузке с клиент банка dbf файла информация отображается в иероглифах. Шрифты для 1с на линуксе стоят, локаль ru_Ru.cp1251 тоже есть, пробовал пересобирать кластер постгри под разные кодировки, но ничего не помогло. Возможно кто то сталкивался?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
25. citcs 30.08.18 14:35 Сейчас в теме
(1)
На винде стоит платформа 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
2. MstrSa 28.08.18 18:08 Сейчас в теме
Коллеги, есть какие-то варианты?
3. Fox-trot 163 28.08.18 18:34 Сейчас в теме
перед занесением в базу конвертировать строки
4. MstrSa 28.08.18 18:56 Сейчас в теме
(3) Можно подробнее как реализовать? Или дайте какую то статью.
5. held88 59 28.08.18 20:16 Сейчас в теме
Во первых бы не мешало написать версию платформы и конфигурации. Сталкивались.
6. held88 59 28.08.18 20:22 Сейчас в теме
А во вторых не мешало бы показать кусок кода где происходит загрузка файла. И постгрес тут думаю не причем.
7. ansh15 28.08.18 23:41 Сейчас в теме
Какая кодировка у строк в самом dbf файле?
Если загрузку выполнять в файловую ИБ(минуя сервер приложений и СУБД), то же самое получается?
10. MstrSa 29.08.18 09:40 Сейчас в теме
8. held88 59 29.08.18 04:57 Сейчас в теме
Да там не в в базе дело. У меня была такая проблема. Процедура загрузки выполнялась на сервере. При изменении деректив на клиент кодировка пошла нормально. При анализе кода было выявлено что разбор файла происходит внешней компанентой что была в общих макетах. Я сообщил разработчикам об этом и знаете что они сделали? В следующем релизе уже стояло условие проверяющие тип системы и при обнаружении линукса кодировка цп1251 удалялась из списка.
9. MstrSa 29.08.18 09:35 Сейчас в теме
(8)
Да там не в в базе дело. У меня была такая проблема. Процедура загрузки выполнялась на сервере. При изменении деректив на клиент кодировка пошла нормально. При анализе кода было выявлено что разбор файла происходит внешней компанентой что была в общих макетах. Я сообщил разработчикам об этом и знаете что они сделали? В следующем релизе уже стояло условие проверяющие тип системы и при обнаружении линукса кодировка цп1251 удалялась из списка.


Платформа 8.3.9.2170, у Вас какая была платформа?
11. held88 59 29.08.18 10:55 Сейчас в теме
Ну где-то рядом. Я думаю в базу уже ложится с кракозябрами строка. И получается она в момент чтения. То есть кодировка не постгрес а сервера должна быть 1251. У него по-моему ключ есть для указания локали. И есши указать локаль как ru_RU или просто ru боюсь система поймет это как ru.utf8. А вообще чтоб не парится я с банка просто утф8 выгружаю. Раньше была проблема, а сейчас все банки у нас умеют в юникод.
12. MstrSa 29.08.18 10:57 Сейчас в теме
(11)
Раньше была проблема, а сейчас все банки у нас умеют в юникод.


Вот тут пож по подробнее.
13. MstrSa 29.08.18 11:04 Сейчас в теме
(11)
Созвонился с банком, говорят что dbf только в 1251
14. held88 59 29.08.18 11:13 Сейчас в теме
(13) Код который грузит dbf выложите.
15. MstrSa 29.08.18 11:23 Сейчас в теме
(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.ЗакрытьФайл();
 
 Возврат тзВыписка; 
КонецФункции
Показать
16. held88 59 29.08.18 11:38 Сейчас в теме
Понятно. Средствами платформы.

locale -a | grep ru - вывод вот этого в консоли покажите.

Еще вот здесь точку поставьте
НовСтрока.Контрагент = СокрЛП(ФайлDBF.KL_NM_K);

скопируйте содержимое при отладке, чтобы понимать кракозябры получаются еще до манипуляций с данными или после.
17. MstrSa 29.08.18 11:44 Сейчас в теме
(16)
locale -a | grep ru


ru_RU
ru_RU.cp1251
ru_RU.iso88595
ru_RU.koi8r
ru_RU.utf8
russian
ru_UA
ru_UA.cp1251
ru_UA.koi8u
ru_UA.utf8
18. held88 59 29.08.18 12:00 Сейчас в теме
(17) А если после НовСтрока.Контрагент = СокрЛП(ФайлDBF.KL_NM_K); сделать сообщить(ФайлDBF.KL_NM_K) выходят уже с кроказыбрами?

И вот вопрос. А какую из установленных консолей платформа выбирает для вывода?

localectl status сделайте

ну и что-то типа того

localectl set-locale LANG=ru_RU.cp1251
19. MstrSa 29.08.18 12:28 Сейчас в теме
(18)
localectl set-locale


Думаю что ничего не поможет, потому что dbf только в двух кодировках ansi и oem.
20. held88 59 29.08.18 12:31 Сейчас в теме
21. MstrSa 29.08.18 12:46 Сейчас в теме
(20)
Попробовал. Тоже самое
22. held88 59 29.08.18 12:55 Сейчас в теме
localectl status что выводит?
23. MstrSa 29.08.18 13:20 Сейчас в теме
(22)

System Locale: LANG=en_US.UTF-8
VC Keymap: us
X11 Layout: us
24. held88 59 29.08.18 13:24 Сейчас в теме
Попробуйте localectl set-locale LANG=ru_RU.cp1251
потом если что переставите назад.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот