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
open8.3.17-20-+ Ошибка записи в объектную таблицу ВИДа с отрицательными идентификаторами
0%
Description
https://bugboard.v8.1c.ru/error/000123706
Дано
Платформа: 8.3.17.1851 (64б)
Режим совместимости: 8.3.17
MSSQL: 2014 (14.0.3401.7)
Сценарий воспроизведения
Создать во внешней БД таблицу, колонка-ключ которой (id) может принимать отрицательные значения.
Мышкой в SSMS это можно сделать, указав начальное значение для такой колонки:
То же самое можно сделать и через скрипт (в первой строке указываем имя целевой БД):
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
Этот код создаст в БД таблицу с именем "Test_Negative_id" с двумя колонками - "айди" и "Наименование". Колонка "айди" будет выступать первичным самовозрастающим ключом и заполняться для каждой новой записи автоматически.
Это синтаксис для MSSQL 14, для последующих версий состав параметров функции IDENTITY, кажется, был изменен, но помните, что главное в ее параметре seed указать отрицательное число (чтобы записи, которые мы в эту таблицу будем далее добавлять, получали отрицательные айдишники).
Далее добавляем объектную таблицу в метаданные ВИДа (внешнего источника данных в конфигурации базы 1С), не забывая колонке "айди" установить флажок "Только чтение":
После этого в режиме предприятие добавляем в таблицу новую запись:
Видим, что добавленная запись получила айдишник со значением -1000:
На этом подготовка к воспроизведению заканчивается.
Проблема
Невозможно отредактировать любую уже существующую запись объектной таблицы ВИДа, поле ключа которой содержит отрицательное число: ни интерактивно, ни программно. Запись всегда заканчивается ошибкой:
Ошибка внешней базы данных: ошибка при выполнении запроса по причине: Ошибка ODBC. SQLSTATE: 42S22 Номер ошибки: 207 Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name '_id'.
В СУБД от сервера 1С приходит такой запрос:
INSERT INTO #tt1 WITH(TABLOCK) (RS_FIELD) SELECT T1."_id" FROM Test_Negative_id T1 WHERE T1.id = -1000
В котором видно, что в секции SELECT имя колонки неверное - в него добавляется нижнее подчеркивание.
Способ обхода
Не указывать в метаданных таблицы ВИДа в качестве ключа числовое поле, которое может принимать отрицательные значения. Например, если в нашем примере полем ключа указать колонку "Наименование", то ошибки уже не будет.
Дополнительная информация
Похожий баг: https://bugboard.v8.1c.ru/error/000052413
Возможно, проблема исправлена в более свежих релизах платформы. Проверю и отпишусь дополнительно (если никто не сделает это раньше).
Files
Updated by Max im over 2 years ago
Проверил в 8.3.20.1789 (совместимость также поднял до максимально возможной, т.е. 8.3.20) - ошибка сохраняется.
Updated by Сергей Старых over 2 years ago
- Subject changed from Ошибка записи в объектную таблицу ВИДа с отрицательными идентификаторами to 8.3.17-20-+ Ошибка записи в объектную таблицу ВИДа с отрицательными идентификаторами