Project

Profile

Help

HostedRedmine.com has moved to the Planio platform. All logins and passwords remained the same. All users will be able to login and use Redmine just as before. Read more...

Bug #943838

Updated by Сергей Старых about 1 year ago

https://bugboard.v8.1c.ru/error/000123706 

 *Дано* 
 Платформа: 8.3.17.1851 (64б) 
 Режим совместимости: 8.3.17 
 MSSQL: 2014 (14.0.3401.7) 

 *Сценарий воспроизведения* 
 Создать во внешней БД таблицу, колонка-ключ которой (id) может принимать отрицательные значения. 
 Мышкой в SSMS это можно сделать, указав начальное значение для такой колонки: 
 !1.png! 

 То же самое можно сделать и через скрипт (в первой строке указываем имя целевой БД): 
 <pre><code class="sql"> 
 USE [Test_1C_DWH] 
 GO 

 SET ANSI_NULLS ON 
 GO 

 SET QUOTED_IDENTIFIER ON 
 GO 

 CREATE TABLE [Test_Negative_id]( 
	 [id] [int] IDENTITY(-1000,1) NOT NULL, 
	 [Name] [nvarchar](100) NOT NULL 

  CONSTRAINT [PK_Test_Negative_id] PRIMARY KEY CLUSTERED  
 ( 
	 [id] ASC 
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
 ) ON [PRIMARY] 
 GO 
 </code></pre> 

 Этот код создаст в БД таблицу с именем "Test_Negative_id" с двумя колонками - "айди" и "Наименование". Колонка "айди" будет выступать первичным самовозрастающим ключом и заполняться для каждой новой записи автоматически. 
 Это синтаксис для MSSQL 14, для последующих версий состав параметров функции IDENTITY, кажется, был изменен, но помните, что главное в ее параметре seed указать отрицательное число (чтобы записи, которые мы в эту таблицу будем далее добавлять, получали отрицательные айдишники). 

 Далее добавляем объектную таблицу в метаданные ВИДа (внешнего источника данных в конфигурации базы 1С), не забывая колонке "айди" установить флажок "Только чтение": 
 !2.png! 

 После этого в режиме предприятие добавляем в таблицу новую запись: 
 !3.png! 

 Видим, что добавленная запись получила айдишник со значением -1000: 
 !4.png! 

 На этом подготовка к воспроизведению заканчивается. 

 *Проблема* 
 Невозможно отредактировать любую уже существующую запись объектной таблицы ВИДа, поле ключа которой содержит отрицательное число: ни интерактивно, ни программно. Запись всегда заканчивается ошибкой: 
 !5.png! 

 <pre> 
 Ошибка внешней базы данных: 
 ошибка при выполнении запроса 
 по причине: 
 Ошибка ODBC. SQLSTATE: 42S22 
 Номер ошибки: 207 
 Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name '_id'. 
 </pre> 

 В СУБД от сервера 1С приходит такой запрос: 
 <pre><code class="sql"> 
 INSERT INTO #tt1 WITH(TABLOCK) (RS_FIELD) SELECT T1."_id" FROM Test_Negative_id T1    WHERE T1.id = -1000 
 </code></pre> В котором видно, что в секции SELECT имя колонки неверное - в него добавляется нижнее подчеркивание. 

 *Способ обхода* 
 Не указывать в метаданных таблицы ВИДа в качестве ключа числовое поле, которое может принимать отрицательные значения. Например, если в нашем примере полем ключа указать колонку "Наименование", то ошибки уже не будет. 

 *Дополнительная информация* 
 Похожий баг: https://bugboard.v8.1c.ru/error/000052413 
 Возможно, проблема исправлена в более свежих релизах платформы. Проверю и отпишусь дополнительно (если никто не сделает это раньше).

Back