Имя: Пароль:
1C
1С v8
Внешние источники данных IDENTITY_INSERT имеет значение OFF
,
0 TeMochkiN
 
21.01.20
14:56
Здравствуйте!
Платформа 8.3.15.1830 (x64)

Хочу с помощью менеджера записи изменить значение одного поля, но выдается следующая ошибка:

{ОбщийМодуль.ОбработчикиСобытий.Модуль(666)}: Ошибка при вызове метода контекста (Записать)
            ЗаписьТаблицыВнешнейБД.Записать();
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: 23000
Номер ошибки: 544
Описание: [Microsoft][SQL Server Native Client 11.0][SQL Server]Невозможно вставить явное значение для столбца идентификаторов в таблице "build_main", когда параметр IDENTITY_INSERT имеет значение OFF.


Собственно, вот кусок кода, где возникает ошибка:

            ЗаписьТаблицыВнешнейБД = ВнешниеИсточникиДанных.УчетВесовогоМатериала.Таблицы.ОсновнаяТаблицаУчета.СоздатьМенеджерЗаписи();
            ЗаписьТаблицыВнешнейБД.НомерСтроки = СтрокаТЗ.НомерСтроки;
            ЗаписьТаблицыВнешнейБД.Прочитать();
            
            ЗаписьТаблицыВнешнейБД.ЗагруженоВ1С = 1;
            ЗаписьТаблицыВнешнейБД.Записать();


Основные свойства таблицы:
Тип данных таблицы внешнего источника данных - НеобъектныеДанные
Поле ключа - НомерСтроки
Только чтение - Ложь

У всех столбцов, кроме "ЗагруженоВ1С", свойство Только чтение установлено в значение Истина

Из-за чего может возникать ошибка?

Я так понимаю, что сама ошибка говорит о том, что я якобы пытаюсь вставить новую строку с установленным значением ключевого поля. Почитал описание процедуры Записать(), там действительно написано, что изменение записи происходит путем удаления текущей записи и вставки новой измененной. Так а почему оно не работает тогда? Поле ключа ведь обозначено как только для чтения, зачем 1С его заполняет, по логике, должна добавиться новая запись, с новым ID, но этого не происходит. Но этого и не хотелось бы, хочется, чтобы обычный UPDATE по ключу сработал. Никто не знает как с этим разобраться?
1 МихаилМ
 
21.01.20
15:19
это поле нумеруется субд автоматически при добавлении записи и запись в него запрещена.
2 scanduta
 
21.01.20
15:20
(0) Ну потому что IDENTITY_INSERT имеет значение OFF, а ты пытаешься изменить номер строки
3 TeMochkiN
 
21.01.20
15:21
(1) (2) я знаю, поэтому и выставил на все поля, в том числе ключевое, свойство только чтение в значение Истина, у меня для изменения разрешено только поле ЗагруженоВ1С
4 ДенисЧ
 
21.01.20
15:23
(3) Ну и что? Ты пытаешься руками заполнить поле IDENTITY. А это делать сильно не советуется.
5 TeMochkiN
 
21.01.20
15:24
(4) так я ж его заполнил, чтобы считать нужную запись
6 ДенисЧ
 
21.01.20
15:24
(5) Ну и что? IDENTITY, тупо по определению, заполняет сам сервер. И серверу наплевать, что ты там и где заполнил.
7 TeMochkiN
 
21.01.20
15:24
(4) а после считывания изменяю только то поле, которое можно редактировать
8 TeMochkiN
 
21.01.20
15:26
(6) хорошо, поставлю вопрос по-другому, как изменить конкретную запись в таблице внешнего источника? Менеджер записи для этого не подходит?
9 ДенисЧ
 
21.01.20
15:27
(8) SET IDENTITY_INSERT ON
10 TeMochkiN
 
21.01.20
15:34
в общем, просто update никак не сделать через внешние источники данных, верно?
ведь SET IDENTITY_INSERT ON можно использовать только подключившись через ADO?
11 scanduta
 
21.01.20
15:37
Так не пробовал?
(10) https://wonderland.v8.1c.ru/blog/redaktirovanie-dannykh-vo-vneshnikh-istochnikakh/

Изменение данных

При изменении данных обновляются значения всех полей таблицы, у которых ТолькоЧтение = Ложь.

Если же необходимо записать только некоторые поля, вы можете указать их перечень прямо из встроенного языка с помощью методов УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля().
12 TeMochkiN
 
21.01.20
15:50
(11) вот я как раз для всех полей таблицы, кроме "ЗагруженоВ1С" и  установил ТолькоЧтение = Истина, поэтому при изменении должно обновляться только поле "ЗагруженоВ1С"
УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля() работает для таблиц с объектными данными

но я не пробовал через набор записей выполнить изменение. хотя, почитав описание, ожидаю тот же самый результат

ВнешнийИсточникДанныхТаблицаНаборЗаписей.<Имя внешнего источника>.<Имя таблицы внешнего источника данных> (ExternalDataSourceTableRecordSet.<External source name>.<External data source table name>)
Записать (Write)
Доступен, начиная с версии 8.3.5.
Синтаксис:
Записать(<Замещать>)
Параметры:
<Замещать> (необязательный)
Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям.
Значение по умолчанию: Истина.
Описание:
Выполняет запись набора записей в базу данных внешнего источника данных. В зависимости от переданного параметра может быть выполнено добавление записей или замещение. Если указано замещение, то перед выполнением записи будет выполнено удаление всех существующих записей в соответствии с текущими установками отбора.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.5.
13 TeMochkiN
 
21.01.20
15:50
при замещении опять не update делается, а delete и insert
14 TeMochkiN
 
21.01.20
15:51
походу, update никак не сделать через внешние источники данных