Имя: Пароль:
1C
1С v8
1С и Azure, проблемы с кодировкой
,
0 novichok79
 
17.09.18
13:22
доброго времени суток, уважаемые специалисты. база - самописная, версия платформы - 1С:Предприятие 8.3 (8.3.9.2170)
имеется внешний источник, подключенный к базе в Azure.
строка соединения

DRIVER={ODBC Driver 17 for SQL Server};SERVER=tcp:enotzharitkotlety.database.windows.net,1433;UID=vasyapupkin@enotzharitkotlety;PWD=123;DATABASE=myaso;LANGUAGE=русский

все подключается, данные читаются, пишутся. когда пишу значения таблиц из 1С, в строковых полях в Azure - ??????????????????????
это предположительно кодировка.
как узнать кодировку 1С, Azure и как эту кодировку установить в строке соединения?
заранее благодарю за помощь.
1 novichok79
 
17.09.18
13:28
на стороне Azure сортировка "SQL_Latin1_General_CP1_CI_AS", наверное надо поменять на чего-нибудь русское.
ваши предложения, господа.
2 Cool_Profi
 
17.09.18
13:30
В запросах в полях попробуй поставить оператор COLLATE с нужной кодировкой
3 scanduta
 
17.09.18
13:33
а че 1с работает нормально с azure?
4 novichok79
 
17.09.18
13:35
(2) уже грохнул базу в Azure, все равно она тестовая и добавил базу с сортировкой "Cyrillic_General_CI_AS", погоняю ее.
5 novichok79
 
17.09.18
13:42
(4) с кодировкой Cyrillic_General_CI_AS все збс
6 novichok79
 
18.09.18
12:24
да, не дали мне сортировку на рабочей базе поменять на Cyrillic_General_CI_AS.
сделал свой системный DSN, пробовал в настройках Language менять и устанавливать перевод строк в Юникод, в логе ODBC пишет следующее

В Tue Sep 18 12:16:17 следующий запрос был выполнен за 64 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('6','Котлета мясная')
В Tue Sep 18 12:16:17 следующий запрос был выполнен за 64 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('1','Котлета куриная')
В Tue Sep 18 12:16:18 следующий запрос был выполнен за 64 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('2','Рулька вкусная')
В Tue Sep 18 12:16:18 следующий запрос был выполнен за 64 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('4','Чевапчичи')
В Tue Sep 18 12:16:18 следующий запрос был выполнен за 64 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('3','Сосисоны')
В Tue Sep 18 12:16:19 следующий запрос был выполнен за 63 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('11','Нарезочка')
В Tue Sep 18 12:16:19 следующий запрос был выполнен за 63 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('7','Салями')
В Tue Sep 18 12:16:20 следующий запрос был выполнен за 64 мс
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('8','Докторская колбаса')

так вот, если взять на стороне Azure выполнить это дело, то крякозябры также появляются в таблицах, если спецификатор N перед строкой добавить, то все норм.
суть в том что 1С при любых настройках ODBC драйвера, который Microfost рекомендует в панели управления Azure, эта злосчастная N'ка не добавляется, в итоге из 1С уходят крякозябры. посоны, ай нид хелп.
7 novichok79
 
18.09.18
12:27
то есть если вот такое написать в консоли запросов Azure

INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('6',N'Котлета мясная');
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('1',N'Котлета куриная');
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('2',N'Рулька вкусная');
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('4',N'Чевапчичи');
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('3',N'Сосисоны');
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('11',N'Нарезочка');
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('7',N'Салями');
INSERT INTO "dbo"."Segment"  (Id,Segment) VALUES('8',N'Докторская колбаса')

то все збс.
8 novichok79
 
18.09.18
12:53
пробовал ODBC Driver 11 for SQL Server, ODBC Driver 13 for SQL Server, ODBC Driver 17 for SQL Server
везде одна и таже петрушка.
9 novichok79
 
18.09.18
13:05
ну и соотвественно, SQL Server Native Client 11.0 - тож самое.
10 novichok79
 
18.09.18
13:05
придется через ADODB писать, боль...
11 Вафель
 
18.09.18
13:17
у тебя кодировка в базе не русская. ты туда русские буквы ну никак не запишешь.
если бы хоть юникод был
12 novichok79
 
18.09.18
13:26
(11) код создания таблицы:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Segment] (
    [Id]      INT           NOT NULL,
    [Segment] NVARCHAR (50) NULL
);

NVARCHAR - это Unicode насколько мне известно.
13 Локи-13
 
18.09.18
13:27
(10) А сейчас через внешний источник чтоли сделал?
14 novichok79
 
18.09.18
13:27
(13) да
15 novichok79
 
18.09.18
13:28
если бы делал через ADODB, логи запросов к базе не потребовались бы...
16 Cool_Profi
 
18.09.18
13:38
используй силу COLLATE, падаван юный...
17 novichok79
 
18.09.18
14:27
(16) все бы хорошо, а как collate передать в параметры внешнего источника? я давно мог бы через ADODB это сделать, просто не хочется переписывать процедуру.
18 Cool_Profi
 
18.09.18
14:56
(17) SELECT Fld1 COLLATE ...

Вроде так.
19 novichok79
 
18.09.18
15:00
(18) отлично, повторю еще раз, как COLLATE передается во внешний источник?
20 novichok79
 
18.09.18
15:01
в общем, ошибка была в другом, тип базы был не указан в подключении.
21 novichok79
 
18.09.18
16:12
сейчас получается так:

В Tue Sep 18 16:04:20 следующий запрос был выполнен за 66 мс
SELECT TOP 0 CAST(NULL AS NUMERIC(10,0)) "_Id",
CAST(NULL AS NVARCHAR(50)) "_Segment"
INTO #tt1
В Tue Sep 18 16:04:20 следующий запрос был выполнен за 63 мс
SELECT SERVERPROPERTY('ProductVersion')
В Tue Sep 18 16:04:20 следующий запрос был выполнен за 66 мс
INSERT INTO #tt1 ("_Id","_Segment") VALUES
(6,N'Вася'),
(1,N'Петя'),
(2,N'Жора'),
(4,N'Диего'),
(3,N'Хуан'),
(11,N'Джанкарло'),
(7,N'Джузеппе'),
(8,N'Маша'),
(10,N'Наташа'),
(9,N'Марина'),
(5,N'Алевтина');
В Tue Sep 18 16:04:20 следующий запрос был выполнен за 66 мс
SELECT
T1."_Id",
T1."_Segment"
FROM #tt1 T1
INNER JOIN "dbo"."Segment" T2
ON T1."_Id" = T2.Id
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс