Внешние источники данных. Примеры (добавление, изменение, удаление). Реализовано в версии 8.3.5.1068 и позднее

19.04.17

Интеграция - Внешние источники данных

В версии платформы 8.3.5.1068 (и позднее) появилась возможность добавления, изменения и удаления данных во внешних источниках программными средствами 1С. Примеры данной возможности представлены в данной статье.

Внешние источники данных (добавление, изменение, удаление) на примерах

В версии платформы 8.3.5.1068 (и позднее) появилась возможность добавления, изменения и удаления данных во внешних источниках программными средствами 1С. Примеры данной возможности представлены в данной статье.

Для того, чтобы запись во внешние источники стала возможной, компания 1С добавила новые свойства таблицам данных и полям внешних источников:

  • Для всей таблицы - свойство ТолькоЧтениеТолькоЧтение = Истина означает, что изменение данных в этой таблице невозможно;
  • Для отдельных полей таблицы - свойства ТолькоЧтениеРазрешитьNull и ЗначениеЗаполнения:
    • ТолькоЧтение = Истина означает, что изменение данных в этом поле невозможно;
    • РазрешитьNull = Истина означает, что в данное поле может быть записано значение NULL;
    • ЗначениеЗаполнения содержит стандартное значение этого поля (если такое существует).

Эти свойства вы (при описании таблиц вручную) или платформа (при создании таблиц конструктором) можете использовать следующим образом.

  • ТолькоЧтение = Истина устанавливать, например, для представлений (view), таблиц, получаемых на основе выражения (результат функции) и подобных. Данные в таких таблицах изменять нельзя;
  • ТолькоЧтение = Истина указывать для полей, устанавливаемых автоматически (AUTOINCREMENT), вычисляемых полей и подобных. Данные в таких полях изменять нельзя;
  • РазрешитьNull = Истина устанавливать для всех полей, кроме ключевых, и тех, которые во внешнем источнике описаны как NOT NULL;
  • ЗначениеЗаполнения поля устанавливать в том случае, когда во внешнем источнике указано стандартное значение этого поля (значение DEFAULT).

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

  • СоздатьНаборЗаписей() - для необъектных таблиц;
  • Новый метод СоздатьОбъект() - для объектных таблиц.

Соответственно у объектов ВнешнийИсточникДанныхТаблицаНаборЗаписей и ВнешнийИсточникДанныхТаблицаОбъектпоявились новые методы Записать() и Удалить().

Добавление данных

При добавлении данных во внешний источник вы создаёте объект (или набор записей), устанавливаете значения полей и записываете. При этом есть некоторые особенности, о которых полезно знать.

Например, при попытке установить значение поля, у которого ТолькоЧтение = Истина, будет выдана ошибка. А при непосредственной записи в базу данных в выражении INSERT такие поля будут пропущены. В остальные поля записываются те значения, которые вы им присвоили. Поэтому значения Null и значения по умолчанию нужно присваивать полям в явном виде.

Далее представлен небольшой пример. В нём данные добавляются в объектную таблицу  shop_feature, у которой существует два поля:

  • id (РазрешитьNull = Истина);
  • name (РазрешитьNull = Истина);   
 мХарактеристика = ВнешниеИсточникиДанных.ИМ.Таблицы.shop_feature.СоздатьОбъект();
 мХарактеристика.id = Код;
 мХарактеристика.name = Наименование;
 мХарактеристика.Записать();

Выполнение оператора Записать() приведёт к тому, что сначала будет вызван обработчик события ПередЗаписью, затем выполнена физическая запись в таблицу внешнего источника (INSERT), затем будет вызван обработчик события ПриЗаписи.

С ключевым полем таблицы внешнего источника вы можете поступать следующим образом. Если ключевое поле доступно для изменения, то тогда вы «вручную» задаёте его значение перед записью. Если изменение ключевого поля запрещено, то платформа самостоятельно получит ключ в INSERT или непосредственно после. Вы можете вмешаться в этот процесс с помощью метода УстановитьСсылкуНового() до физической записи (в обработчике события ПередЗаписью) или непосредственно после физической записи (в обработчике события ПриЗаписи).

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

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

мХарактеристика = ВнешниеИсточникиДанных.ИМ.Таблицы.shop_feature.НайтиПоПолю("id",код);
мОбъект = мХарактеристика.ПолучитьОбъект();
мОбъект.name = Наименование;
мОбъект.Записать();

Если же необходимо записать только некоторые поля, вы можете указать их перечень прямо из встроенного языка с помощью методов УстановитьЗаписываемыеПоля() и ПолучитьЗаписываемыеПоля().

Удаление данных

При удалении данных выполняется непосредственное удаление строки из таблицы базы данных. При этом поиск ссылок на удаляемый объект не выполняется. Если такая функциональность нужна, вы можете запрограммировать её самостоятельно в обработчике события ПередУдалением().

мХарактеристика = ВнешниеИсточникиДанных.ИМ.Таблицы.shop_feature.НайтиПоПолю("id",Код);
мОбъект = мХарактеристика.ПолучитьОбъект();
мОбъект.Удалить();

Транзакции

Чтение данных внешних источников, как и ранее, выполняется вне транзакции, а при записи платформа открывает неявную транзакцию. При этом и чтение, и запись вы можете выполнять и в явных транзакциях с помощью методов объектаВнешнийИсточникДанныхМенеджер:

  • НачатьТранзакцию();
  • ЗафиксироватьТранзакцию();
  • ОтменитьТранзакцию().

Блокировки

Для управления блокировками рекомендуется использовать свойство внешнего источникаРежимУправленияБлокировкойДанных:

  • Автоматический;
  • Управляемый;
  • Автоматический и управляемый.

а также свойство таблицы внешнего источника УровеньИзоляцииТранзакций:

Кроме этого, можно самостоятельно задать уровень блокировок в методе НачатьТранзакцию().

Дополнил типовую статью примерами) Будет больше времени - добавлю больше примеров.

внешние источники данных программное добавление во внешний источник данных программное изменение внешнего источника данных программное удаление данных из внешнего источника пример удаления из внешнего источника данных пример изменения внешних источников данных

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

28500 руб.

15.11.2022    20631    20    49    

38

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 руб.

31.07.2020    13733    13    48    

25

Внешние источники данных Зарплата Бюджетный учет Программист Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

48000 руб.

24.04.2017    51021    100    165    

89

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    25026    23    1    

25

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10770    12    8    

14

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник 1С "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

10200 руб.

24.06.2021    20691    57    53    

35
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. McCoy77 6 30.06.17 10:39 Сейчас в теме
Спасибо за статью!

Но есть проблема.
Исходные данные: необъектный внешний источник ExtTable, с таблицей ORDERS с ключевым полем (ID).
Задача: создавать записи в ExtTable.
Решение:
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Товары.Ссылка.Дата КАК CREATE_DATE,
	|	ВЫРАЗИТЬ(Товары.Номенклатура.Наименование КАК СТРОКА(100)) КАК DESCRIPTION
	|ИЗ
	|	Документ.РеализацияТоваровУслуг.Товары КАК Товары
	|ГДЕ
	|	Товары.Ссылка = &Ссылка";

	Запрос.УстановитьПараметр("Ссылка", Реализация);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
	
		Запись = ВнешниеИсточникиДанных.ExtTable.Таблицы.ORDERS.СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(Запись, Выборка);
		Запись.Записать();
		
	КонецЦикла;
Показать


Получаем ошибку:

{Форма.Форма.Форма(58)}: Ошибка при вызове метода контекста (Записать)
Запись.Записать();
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: 23000
Номер ошибки: 544
Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot ins ert explicit val ue for identity column in table 'ORDERS' when IDENTITY_INSERT is set to OFF.


При создании записи в ID ничего не пишу, однако запись не работает. Подскажите, пожалуйста, что неправильно делаю?
2. Denis_CFO 49 30.06.17 11:20 Сейчас в теме
(1) Ему как раз ключевого значения в ключевой колонке и не хватает, видимо.
3. McCoy77 6 30.06.17 13:54 Сейчас в теме
(2) Ключевое значение открыто только на чтение, в скуле стоит Identity = True (соответственно при Insert() значение должно назначаться автоматически). По умолчанию в запись 1С передает 0. Но скулю это явно не нравится, он ругается (см. выше).
4. Kostiki1 05.02.20 14:48 Сейчас в теме
(3) На реквизите с ключевым полем id в 1С поставьте галочку "Только чтение". Тогда 1С не будет заполнять это поле и SQL будет его заполнять сам автоинкрементом.
redtram; timurkhann; KirinaAS; user1239344; shevelyov; +5 Ответить
5. sogesti 14.09.21 11:31 Сейчас в теме
А можно ли установит какой-то таймаут для записи объекта ВИД? Например, если на стороне базы что-то происходит и зависла очередь или что-то такое, чтобы наша операция прекратилась?
6. krokchel 24.11.21 13:09 Сейчас в теме
а как полностью очистить таблицу?
7. GSA3D 21.04.22 13:21 Сейчас в теме
Записи = ВнешниеИсточникиДанных.Сайт22.Таблицы.prices.СоздатьНаборЗаписей();
	Для каждого стр из ТаблицаЦен Цикл
		Запись=Записи.Добавить();
		Запись.from_date=стр.Период;
		...
		Запись.price=стр.Цена;
	Конеццикла;
	Записи.Записать();

Такой код перед изменением удаляет вообще все записи из таблицы.
Как сделать чтобы так не происходило?
10. AlexBar 51 25.08.22 00:14 Сейчас в теме
(7)Вам удалось решить этот вопрос?
13. pbahushevichG 17.04.23 02:39 Сейчас в теме
(10) может не актуально - но вообще если Вы хотите что-то добавить в набор записей, те его надо сначала прочитать, а потом уже добавлять - либо добавлять через менеджер записи.
Записи = ВнешниеИсточникиДанных.Сайт22.Таблицы.prices.СоздатьНаборЗаписей();
Записи.Прочитать()
    Для каждого стр из ТаблицаЦен Цикл
    Запись.from_date=стр.Период;
        ...

8. user1040735 31.05.22 09:34 Сейчас в теме
(7) Вы читаете таблицу целиком, и потом перезаписываете ее новыми записями. Для набора записей "Записи" необходимо установить отбор по ключевым для вас полям (например, период, тип цены), прочитать его, добавить нужные записи и записать. Тогда набор записей перезапишет только те строки таблицы, которые удовлетворяют отбору.
9. AlexBar 51 25.08.22 00:11 Сейчас в теме
(8)Где можно посмотреть примеры реализации таких отборов?
12. pavlo 03.04.23 11:49 Сейчас в теме
(9) Как бы отборы не указывать, Прочитать() читает все что есть
11. pavlo 03.04.23 11:12 Сейчас в теме
(9) Подсказал кто то? а то отбор то только чтение и как его заполнить что то не очень то расписано в справке
user991808; +1 Ответить
14. user991808 27.09.23 10:26 Сейчас в теме
(11) При настройке внешнего источника данных необходимо в конфигураторе в таблице внешнего источника указать поле ключей (для необъектных данных) для отбора.
После эти поля будут доступны в элементах отбора. Profit
Прикрепленные файлы:
15. pavlo 29.09.23 14:11 Сейчас в теме
(14) К сожалению не работает это, проверено много раз

Выбрал то о чем вы и толку нет

Набор = ВнешниеИсточникиДанных.TEST.Таблицы.dbo_test.СоздатьНаборЗаписей()
Набор.Отбор пустые и не установить в итоге только читать всё

Запись = ВнешниеИсточникиДанных.TEST.Таблицы.dbo_test.СоздатьМенеджерЗаписи()
Запись.id = Данные.guid_pack;
Запись.guid_pack = Данные.id;
Запись.Прочитать();


тут ставишь отбор, но в итоге читает все и плевал на отборы, а на скрине выбраны поля которые составляю уникальность, id впринципе уникально так как скулем порядковый номер формируется (IDENTITY).
Прикрепленные файлы:
16. user991808 02.10.23 14:31 Сейчас в теме
(15) Коллега. Все работает. У нас очень много источников данных и SQL не самый сложный в настройке.
Если в таблице есть порядковый номер (IDENTITY) - то это уже объектные данные.
Без этого свойства данные в таблице аналогичны регистру сведений, где поле ключа и будут вашими измерениями.
LavzaL; OlegTor; +2 Ответить
17. ПодводныйТ 45 04.03.24 17:27 Сейчас в теме
(16) а если есть Таблица - необъектные данные без поля ключа, то как тогда установить отбор по набору записей? Если я добавляю поле ключа, например поле "period", то тогда не открывает эту таблицу с ошибкой, что поле period неуникально (и это на самом деле так - есть несколько записей в таблице с одинаковым периодом).
19. sgirg 26 24.09.24 07:56 Сейчас в теме
(17) Удалось найти решение? Сейчас уперся в похожую ситуацию. Таблица необъектная и без ключевых полей. Добавить нужные записи без потери существующих получается, а вот удаление отдельных записей никак.
20. ПодводныйТ 45 25.09.24 10:36 Сейчас в теме
(19) Нет. Как то странно работают эти ВИД. Возможно надо писать на партнерский форум или там искать информацию. А вполне возможно нет особого спроса на них и многие работают с другими базами данных "по старинке" ))
21. sgirg 26 25.09.24 14:17 Сейчас в теме
(20) Вот вариант, который мне удалось реализовать: Все поля SQL таблицы добавляю в ВИД и на все эти поля проставляю признак, что это поле ключа. в этом случае могу проводить любые манипуляции с таблицей: чтение, изменение, удаление с любыми необходимыми мне отборами. Но есть нюанс! Как только добавляешь ключевые поля, теряется возможность записывать полностью идентичные строки (хотя, может быть, это логично... один из этапов нормализации данных). По крайней мере пока, мне не приходилось писать полностью идентичные данные абсолютно по всем полям таблицы.
ПодводныйТ; +1 Ответить
18. sml 41 21.06.24 16:27 Сейчас в теме
кто-нибудь перенастраивал программно Общие параметры соединения.
Проблема в том, что после чтения ПолучитьОбщиеПараметрыСоединения()
доступно на просмотр и изменение только параметр СтрокаСоединения, если не было подключения к ВИ в этом сеансе.

А тут надо при определенном условии поменять строку соединения, но не передавать пароль в коде, а оставить его без изменения.
22. roma_semenov79 207 29.10.24 17:39 Сейчас в теме
При выполнении вот этого кода

мХарактеристика = ВнешниеИсточникиДанных.ИМ.Таблицы.shop_feature.НайтиПоПолю("id",код);
мОбъект = мХарактеристика.ПолучитьОбъект();
мОбъект.name = Наименование;
мОбъект.Записать();


Вываливается ошибка

Ошибка ODBC. SQLSTATE: 42000
Номер ошибки: 102
Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около конструкции "T1".

Пытаюсь записать простейшую строку из 10 символов.
Оставьте свое сообщение