1с внешние источники добавить колонку. Внешние источники данных

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

Применимость

В статье рассматривается платформа 1C 8.3.5. Материал актуален и для текущих релизов платформы.

Запись во внешние источники данных в «1С:Предприятие 8»

В платформе 8.2.14 в дерево метаданных был добавлен новый объект – внешние источники данных. Назначение этого механизма – получение данных из внешних баз по отношению к 1С.

С выходами новых релизов платформы внешние источники данных развивались, например, стало возможным помещение во временные таблицы, выполнение соединений с обычными таблицами.

В статье мы рассмотрим, какие инструменты есть у разработчика для осуществления записи во внешние источники данных.

Все действия выполнялись на СУБД Microsoft SQL Server 2008 R2.

В платформе 8.3.4 была реализована возможность использования функций, описанных во внешних источниках данных.

Эта возможность позволяет запускать хранимые процедуры на стороне SQL Server, а при их помощи обращаться к данным внешних источников, в том числе и на запись.

Разберем пример. Создадим при помощи SQL Management Studio новую базу данных с именем kursy_test. Все дальнейшие эксперименты будут выполняться на ней.

В этой базе создадим таблицу nomenklatura, для этого напишем скрипт следующего содержания:

USE [ kursy_test ]
GO
CREATE TABLE [ dbo ] . [ nomenklatura ](
[ id ] [ int ] NOT NULL ,
[ description ] [ nvarchar ](150 ) NOT NULL ,
[ price ] [ numeric ](15 , 2 ) NULL ,
CONSTRAINT [ PK_id ] PRIMARY KEY ([ id ])
GO

В результате выполнения будет создана таблица следующей структуры:

Теперь нам нужно создать две хранимые процедуры, с помощью которых и будет выполняться модификация данных.

Первую процедуру назовем insert_nomenklatura. Она будет предназначена для добавления новой строки в таблицу. Скрипт для ее создания будет выглядеть так:

USE [ kursy_test ]
GO
CREATE PROCEDURE insert_nomenklatura
@id int ,
@description nvarchar (150 ),
@price numeric (15 , 2 )
AS
BEGIN
INSERT INTO [ kursy_test ] .dbo. [ nomenklatura ] ([ id ], [ description ] ,[ price ])
VALUES (@id , @description , @price )
END
GO

Вторая процедура с именем update_nomenklatura будет выполнять обновление уже существующей в таблице записи. Чтобы ее создать, был запущен такой скрипт:

В Обозревателе объектов созданная таблица и две хранимые процедуры выглядят следующим образом:

Все подготовительные действия на стороне Microsoft SQL Server мы выполнили, теперь переходим в конфигуратор “1С:Предприятие 8”.

Создаем новый внешний источник данных с именем Nomenklatura. При создании новой таблицы в этом источнике данных указываем следующие параметры подключения к источнику данных:

Строку соединения укажем следующую:

Driver = {SQL Server} ; Server =(local ); Database = kursy_test ; User Id = sa ; Password =;

При наличии пароля у пользователя sa его необходимо указать в параметре Password строки соединения.

Если все параметры подключения указаны корректно, при нажатии на кнопку ОК, откроется окно, содержащее таблицы, доступные в источнике данных:

Отмечаем галочками интересующие нас поля таблицы. При нажатии кнопки Готово во внешнем источнике данных Nomenklatura будет создана таблица dbo_nomenklatura:

Теперь переключаемся на закладку “Функции” нашего источника данных.

При помощи аналогичного мастера производим добавление двух хранимых процедур:

Получаем следующий внешний вид закладки “Функции”:

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

В форме списка на командной панели расположим кнопку “Добавить” со следующим обработчиком:

&НаКлиенте
Процедура Добавить ()
Оповещение = Новый ОписаниеОповещения (“ОткрытьТаблицуЗавершение” , ЭтотОбъект );
ОткрытьФорму (
“ВнешнийИсточникДанных.Nomenklatura.Таблица.dbo_nomenklatura.ФормаОбъекта”
, , , , , ,
Оповещение , РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс );
КонецПроцедуры

&НаКлиенте
Процедура Сохранить (Команда )
СохранитьНаСервере ();
КонецПроцедуры &НаСервере
Процедура СохранитьНаСервере ()
Если Объект.Ссылка.Пустая () Тогда
ВнешниеИсточникиДанных.Nomenklatura.dbo_insert_nomenklatura
Иначе
ВнешниеИсточникиДанных.Nomenklatura.dbo_update_nomenklatura
(Объект.id , Объект.description , Объект.price );
КонецЕсли ;
КонецПроцедуры

В режиме предприятия форма списка выглядит следующим образом:

Форма объекта представлена ниже:

Для увеличения нажмите на изображение.

Таким образом, при помощи хранимых процедур мы реализовали запись во внешние источники данных.

В платформе 8.3.5 появилась новая возможность – запись во внешние источники данных напрямую, минуя разобранный выше механизм хранимых процедур.

Данные можно редактировать как программно, так и интерактивно. И для нашего примера прибегать к конфигурированию не придется.

В командных панелях и в меню “Еще” можно увидеть стандартные кнопки, такие как “Создать”, “Скопировать”, “Изменить” и т.д.

Для увеличения нажмите на изображение.

А в форме объекта появились кнопки “Записать” и “Записать и закрыть”:

Как видно, теперь работа с внешними источниками похожа на работу со справочниками, документами и т.д.

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

У таблицы данных добавлено новое свойство ТолькоЧтение (тип – булево).

Если это свойство установлено в Истина, запись данных в эту таблицу средствами платформы невозможна.

Поле таблицы данных обладает теперь свойствами:

  • ТолькоЧтение (тип – булево) – возможно ли изменение данных в этом поле;
  • РазрешитьNull (тип – булево) – возможно ли в данном поле сохранять значение NULL.

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

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

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

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

&НаКлиенте
Процедура СоздатьПрограммно (Команда )
СоздатьПрограммноНаСервере ();
КонецПроцедуры &НаСервере

Процедура СоздатьПрограммноНаСервере ()
ЗаписываемыйОбъект =
ВнешниеИсточникиДанных.Nomenklatura.Таблицы.dbo_nomenklatura.СоздатьОбъект ();
ЗаписываемыйОбъект.id = 5 ;
ЗаписываемыйОбъект.description = “Шкаф” ;
ЗаписываемыйОбъект.price = 5000 ;
ЗаписываемыйОбъект.Записать ();
КонецПроцедуры

В модуле объекта таблицы внешнего источника данных теперь можно задать обработчики событий, возникающих при записи, такие как ПередЗаписью() , ПриЗаписи() и т. д.:

В данной статье были рассмотрены два варианта записи данных во внешние источники данных – при помощи хранимых процедур и при помощи новых механизмов платформы 8.3.5.

Таким образом, в платформе теперь реализованы механизмы для полноценной интеграции с внешними приложениями.

В редакции 8.3.6 описываемый выше функционал был расширен при помощи новых специальных методов ПолучитьИзменяемыеПоля() и УстановитьИзменяемыеПоля(). С помощью них предоставлена возможность выполнять операцию записи в те поля таблицы ВИД, которые помечены в конфигураторе как доступные только для чтения. Благодаря этому стало возможным реализовать такой сценарий, при которой запись в отдельные поля таблицы ВИД возможна только в тех случаях, когда это необходимо в соответствии с бизнес-логикой приложения.

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

В редакции 8.3.8, наконец, стало возможным определение того факта, что внешний источник данных находится в состоянии транзакции. Эта функциональность представлена новым методом ВнешнийИсточникДанныхМенеджер.ТранзакцияАктивна()

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

В следующей статье мы рассмотрим логическое продолжение использования технологии внешних источников данных в системе «1С:Предприятие».

Для работы с данными не 1с, например: база SQL, база Access, файл Excel и многие другие, в технологическую платформу, начиная с версии 8.2.14 был внедрен механизм(объект), под названием Внешние источники данных.

Давайте в данной статье рассмотрим, как взаимодействует данный объект с привычным нам Excel файлом. К примеру, существует необходимость с какой то периодичностью считывать данные с *.xls файла в базу 1С. Если раньше нам необходимо при помощи Com объектов производить инициализацию, затем создавать таблицу значений, построчно считывать данные, то теперь данные манипуляции попросту отпадают. При использовании Внешнего источника данных мы можем обращаться при помощи запросов и мгновенно получать данные.

Допустим у нас есть книга Excel следующего содержания. Из которого нам необходимо считать данные.

Первым делом в режиме конфигуратора добавляем новый источник данных и назовем его также Excel.

Теперь нам необходимо добавить данных, то таблицу с теми полями которые будут у нас в 1С. Создадим их аналогично тому как названы колонки в файле. Для этого заходим в созданный объект и во кладке Данные жмем добавить. Здесь настоятельно рекомендую производить создание вручную, так как довольно часто бывают проблемы, когда 1с-ина пытается сама произвести автоматическую настройку.

Наименование нашей таблицы присвоим ТаблицаДанных. После этого переходим во вкладку Данные и создаем поля (аналогичные файлу).

В свойствах каждого поля необходимо указать Имя, Тип и Имя в источнике данных(идентично файлу).
Присваиваем Имя в источнике данных. Здесь мы указываем наименование листа в *. xls с добавлением в конце символа «$». У нас Лист1$.
Обязательно указываем Поля Ключа. Здесь из теории БД необходимо указать, то поле по которому будет обеспечивать полную уникальность строки.
Поле представления- указываем то поле, которое обеспечит краткое представление строки, в нашем случае Номенклатура.

Все! На этом собственно и вся настройка. Далее необходимо просто в любой процедуре указать строку соединения и после подключения можно работать с источником данных.

Строка соединения для файлов XLSX (версия Office 2007 и выше)

Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\ФайлExcel.xlsx;

Строка соединения для файлов XLS и ранее.

Driver={Microsoft Excel Driver (*.xls)}; DriverID=790; DBQ=D:\ФайлExcel.xls;

Создадим новую внешнюю обработку, которая будет подключаться и сообщать о подключении.

Процедура КнопкаВыполнитьНажатие(Кнопка) ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных; ПараметрыСоединения. СтрокаСоединения= «Driver= { Microsoft Excel Driver (*. xls) } ; DriverID= 790 ; DBQ= D: \fruit. xls; «; ВнешниеИсточникиДанных. Excel. УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения) ; ВнешниеИсточникиДанных. Excel. УстановитьСоединение() ; Запрос = Новый Запрос() ; Запрос. Текст = «ВЫБРАТЬ | ТаблицаДанных. Код, | ТаблицаДанных. Номенклатура, | ТаблицаДанных. ЕдИзм, | ТаблицаДанных. Количество | ИЗ | ВнешнийИсточникДанных. Excel. Таблица. ТаблицаДанных КАК ТаблицаДанных»; ТЗ = Запрос. Выполнить( ) . Выгрузить() ; Сообщить(«Подключено») ; КонецПроцедуры

Если мы установим точку останова и посмотрим, что у нас в ТЗ, то мы увидим следующее:

P.S. В самом файле Excel до наименования полей не должно быть никаких пустых строк, иначе будет возникать ошибка odbc. sqlstate 07002 (драйвер odbc excel слишком мало параметров).

Релиз 8.2.14.533 - наконец то более-менее стабильный вариант 14-го релиза платформы. Наконец то представился случай испытать в деле замечательную возможность - "внешние источники данных".

Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес приложений с твердой уверенностью скажет вам - что ему нравится больше всего в 1С. Конечно конструктор запросов - самый удобный и продуманный механизм написания запросов для получения данных из реляционных структур, который я лично когда-либо встречал . А теперь 1С нам предоставили такую замечательную возможность использовать его не только с 1С, но и с любыми другими таблицами. Вот только в эту "бочку мёда" насыпана куча "ложек дёгтя". Обо всём по порядку:

1) Настройка и использование - без "танцев с бубном" не получится

A) Добавляете внешний источник данных - вроде ничего сложного
б) ставите галочку "Выбрать из списка" - обязательно - это нужно чтобы проверить работоспособность уже в начале и избавит от лишних заморочек
в)
(IMG:http://pics.livejournal.com/comol/pic/0000cr1r.png)
- обязательно нажимаем "..." - подключение именно ODBC. Не OLEDB как мы все привыкли, а на уровень ниже

А вот здесь будьте ОЧЕНЬ ВНИМАТЕЛЬНЫ .

Это драйвер ODBC - в случае использования клиент-серверной версии он должен обязательно быть на сервере. Если вы ведёте разработку на одной системе, а рабочая версия на другой (как это обычно бывает) убедитесь что вас не ждут сюрпризы. Странная рекоммендация, но выбирайте самый древний или самый общий драйвер в случае если вас не особо заботит скорость и за пределы возможностей стандарта SQL92 вы выходить не намерены. Это обеспечит вам лучшую совместимость. Например для SQL Server 2008 лучшим драйвером будет SQL Server Native Client 11, но рекоммендую выбирать просто SQL Server, иначе этот самый native client придётся устанавливать либо на сервер, либо на все клиентские машины (в случае использования файловой версии), а выигрыша особого для простых задач он не даст.

Д) Стандартные диалоги выбора Сервера

Ж) Выбираете таблицу и реквизиты... замечательная возможность - её можно сразу же переименовать так как вам нравится (и реквизиты тоже), при этом в свойствах у вас будут отображаться названия полей источника данных

З) А теперь запускаете, открываете конструктор запросов - выбираете тупо все записи из таблицы и ОПА - ошибка. Что делать? Если у вас управляемый интерфейс - заглянуть в меню сервис, а если обычный...
Я лично использовал вот такой код:

Параметры = ВнешниеИсточникиДанных.DAX.ПолучитьОбщиеПараметрыСоединения();
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "sa";
Параметры.Пароль = "pas";
Параметры.СтрокаСоединения = "DRIVER={SQL Server};SERVER=servet;UID=sa;PWD=;DATABASE=database";
Параметры.СУБД = "MSSQLServer";

ВнешниеИсточникиДанных.DAX.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияСеанса(Параметры);

ВнешниеИсточникиДанных.DAX.УстановитьСоединение();

Может каких-то кусков и не нужно, но это работает. Выполнить код нужно ОДИН РАЗ . После чего будет нормально подключаться... мистика конечно - зачем это было нужно не понятно...

2) Источники данных только для чтения
Да, чудес не бывает... но иногда так хочется....

3) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВНУТРЕННИМИ ИСТОЧНИКАМИ ДАННЫХ
Меня лично этот факт убил наповал

Как же так.... то чего так ждали и уже представляли и облизывались как мы сейчас в одном запросе соединим наши данные с 1С-кой свернём - сгруппируем, вставим в отчет, а не тут то было...

Но естественно опытных людей это не останавливает... какая мысль пришла в голову? Правильно - временные таблицы:

4) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВРЕМЕННЫМИ ТАБЛИЦАМИ

А вот это уже не похоже на технологические трудности, а очень смахивает на то что нам хотят "чтобы жизнь раем не казалась" сделать (IMG:) .

5) Можно использовать только в соединениях СКД

Для тех кто не знает - это в СКД на вкладке "Связи наборов данных". Часто вы ими пользуетесь? Удобно? Видимо так нас хотят принудить к использованию их чаще. Вот только там есть колонка "Условие связи" и "Параметр связи". Ни в одной типовой конфигурации не нашел примера их использования, в документации и у Хрусталевой тоже как-то всё не прозрачно. Кто-нибудь сможет мне объяснить как работает "условие связи". Если там написать РеквизитИсточника = РевизитПриемника это не работает. Конечно условие можно записать в поле "Выражение" - в большинстве случаев этого хватает... вот только как-то не очень просто получается.

Итого ранее эта задача решалась где-то так:

Функция ИнициализироватьИсточникДанных()

ДатаНач = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Значение;
ДатаКон = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Значение;
Если ДатаКон > "20100101" Тогда
ДатаКон = "20100101";
КонецЕсли;

КЧ = Новый КвалификаторыЧисла(15,2);
КС = Новый КвалификаторыСтроки(255);

МассивЧисло = Новый Массив();
МассивЧисло.Добавить(Тип("Число"));

МассивСтрока = Новый Массив();
МассивСтрока.Добавить(Тип("Строка"));

МассивДата = Новый Массив();
МассивДата.Добавить(Тип("Дата"));

//В таблицу будем заполнять бухгалтерскую себестоимость
ТипЧисло = Новый ОписаниеТипов(МассивЧисло,КЧ);
ТипСтрока = Новый ОписаниеТипов(МассивСтрока,КС);
ТипДата = Новый ОписаниеТипов(МассивДата);

//таблица для загрузки данных из SQL
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("НоменклатураКод", ТипСтрока);
ТЗ.Колонки.Добавить("Qnty", ТипЧисло);
ТЗ.Колонки.Добавить("Период", ТипДата);

ТЗ.Индексы.Добавить("Период");

//Подключаемся к SQL
СтрокаПодключения = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Reports";
Connection = Новый COMОбъект("ADODB.Connection");
Command = Новый COMОбъект("ADODB.Command");
RecordSet = Новый COMОбъект("ADODB.RecordSet");
Дата = "";
Попытка
Connection.Open(СокрЛП(СтрокаПодключения));
Command.ActiveConnection = Connection;
Command.CommandText = "Select * from PH where period >= "" + Строка(Формат(ДатаНач, "ДФ=ггггММдд")) + "" and period RecordSet = Command.Execute();
RecordSet.MoveFirst();
Исключение
Возврат ТЗ;
КонецПопытки;

Пока RecordSet.EOF = Ложь Цикл
Строка = ТЗ.Добавить();
Строка.НоменклатураКод = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Строка.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Строка.Период = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
КонецЦикла;

Запрос = Новый Запрос();
ВрТаблица = Новый МенеджерВременныхТаблиц();
Запрос.УстановитьПараметр("врТаблицаДанных", ТЗ);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.Текст = "ВЫБРАТЬ
| врТаблицаДанных.НоменклатураКод,
| врТаблицаДанных.Qnty,
| врТаблицаДанных.Период
|ПОМЕСТИТЬ ТаблицаДанных
|ИЗ
| &врТаблицаДанных КАК врТаблицаДанных
|ГДЕ
| врТаблицаДанных.Период >= &ДатаНач
| И врТаблицаДанных.Период Запрос.Выполнить();
ТЗ = Неопределено;

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = ВрТаблица;
Запрос.Текст = "Здесь запрос с участием верменной таблицы";

Результат = Запрос.Выполнить();
Возврат Результат;

КонецФункции

Внешнийнабор = ИнициализироватьИсточникДанных();
НаборДанных = Новый Структура();
НаборДанных.Вставить("ТаблицаSQL", Внешнийнабор);
ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета, НаборДанных);

Собственно строчек кода не много и они достаточно стандартны... при этом можно пользоваться полным функционалом конструктора запросов, а в СКД отдать только функцию КОМПАНОВКИ ДАННЫХ

Но на вид чуть конечно не так красиво... да и выгрузка в таблицу значений каждый раз нужно код писать и проверять не ошибся ли в названии реквизитов... а то что нам дали в 1С выглядит как-то половинчато. Я ещё не определился чем удобнее пользоваться. Вы решайте, и пишите о ваших решениях, и что вас к ним подтолкнуло.

[необходимо зарегистрироваться для просмотра ссылки]

Работать с ними в списках в режиме 1С Предприятие.

Однако в работе частенько складывается ситуация, когда часть данных хранится где-то еще.

  • Интернет магазин (хранит данные обычно во внешней MySQL/SQL базе)
  • Другая база.

Для работы с такими данными, которые хранятся в других базах данных, нужно разрабатывать специальные механизмы.

В версии 1С 8.2.14 появился новый под названием Внешние источники данных 1С, которые сильно облегчают работу программиста, так как:

  • теперь специальные механизмы получения данных создавать не нужно
  • к таким данным можно обращаться обычным
  • такие данные можно просматривать в списках 1С.
    • Внешний источник данных 1С – внешняя база SQL

      Допустим у нас есть база SQL, в которой хранятся нужные нам данные. Попробуем прочитать данные из нее с помощью механизма Внешний источник данных 1С.

      Добавим внешний источник данных 1С. Нужно зайти в конфигуратор, внешние источники данных находятся в окне конфигурации, в самом низу дерева .

      1. Подключение

      Добавим новый внешний источник данных 1С, назовем произвольно.

      База данных состоит из таблиц. Нам нужно добавить их внутри добавленного внешнего источника данных. Нажмите на нем правой кнопкой мыши и выберите Добавить таблицу.

      В первый раз он предложит указать строку подключения. Ее можно ввести вручную, или сформировать, для чего нужно нажать на кнопку «…».

      В качестве драйвера в нашем конкретном случае выберем «SQL Server»

      Заполним основные параметры подключения к SQL. Имя сервера можно вписать или выбрать из списка.

      1С выполнит соединение с SQL и предложит выбрать из списка конкретную базу данных.

      После этого 1С отобразит список таблиц в этой базе данных и их колонок. Нужно галочками выбрать требуемые таблицы.

      Таблицы и колонки будут добавлены. Названия будут такие, как они определены в удаленной базе. В 1С Вы можете их переименовать (в свойствах).

      Вот пример добавленной таблицы:

      Вот пример добавленной колонки:

      Чтобы платформа 1С работала с внешней таблицей также, как она делает со справочниками 1С, в таблице можно указать дополнительные параметры:

      • В свойстве Поле ключа – указать одну из колонок, которая будет обеспечивать уникальную идентификацию строки; если уникальность обеспечивают несколько строк – то данный способ не работает (аналог поля Код)
      • В свойстве Поле представления – указать одну из колонок, которая будет обеспечивать краткое представление строки (аналог поля Наименование)
      • В свойстве Тип данных таблицы – указать Объектные данные.

      2. Просмотр

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

      В ветке Стандартные расположена специальная команда Управление внешними источниками данных, которая позволяет указывать параметры соединения (свои для режима 1С Предприятия) и проводить подключение.

      Сначала нужно указать параметры соединения с базой.

      Когда Вы делали настройку в конфигураторе, он в результате показал Вам строку соединения. Вы можете повторно увидеть ее, нажав Добавить таблицу в конфигураторе еще раз.

      Скопируйте строку соединения и укажите ее в режиме 1С Предприятие.

      После этого необходимо произвести собственно подключение.

      После того, как произведено подключение, возможно работать со списками.

      3. Использование в языке 1С

      Подключение можно производить и из кода программы на языке 1С.

      Параметры подключения указываются так:
      ПараметрыСоединения = ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.ПолучитьОбщиеПараметрыСоединения();

      ПараметрыСоединения.АутентификацияСтандартная = Истина;
      ПараметрыСоединения.ИмяПользователя = «sa»;
      ПараметрыСоединения.Пароль = «пароль»;
      ПараметрыСоединения.СтрокаСоединения = «строка соединения из конфигуратора»;
      ПараметрыСоединения.СУБД = «MSSQLServer»;

      ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
      ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
      ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьПараметрыСоединенияСеанса(Параметры);
      ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьСоединение();

      Запросить данные из базы данных можно с помощью обычного . Пример текста запроса для внешнего источника НашВнешнийИсточник и таблицы ТаблицаВнешнегоИсточника:

      ВЫБРАТЬ
      ТаблицаВнешнегоИсточника.ИмяПоля
      ИЗ
      ВнешнийИсточникДанных.НашВнешнийИсточник.Таблица.ТаблицаВнешнегоИсточника»

      Внешний источник данных 1С – работа с файлом Excel

      Попробуем другой вариант – работу с файлом Excel через внешний источник данных 1С.

      Создадим простой файл Excel.

      Добавим внешний источник, назовем произвольно ФайлExcel. В него добавим таблицу «Лист1$». Как несложно заметить – это имя листа в Excel с добавлением символа «$».

      Как и в случае с SQL, добавим колонки. Их можно добавить вручную. Важно следить за соответствием типов добавляемых колонок, иначе позже можно получить ошибку вида «Несоответствие типов данных».

      Для колонки нужно указывать имя в 1С и имя в источнике данных.

      Для Excel существует особенность (ошибка вида «Слишком мало параметров. Требуется 3»):

      • Если в первой строке таблицы Excel расположены названия колонок, то нужно указывать просто имя этой колонки, например «Код».
      • Иначе нужно указывать полное имя с именем таблицы «Лист1$.Код», но в параметрах добавить «HDR=NO;».

      Параметры соединения для файла Excel выглядят вот так:

      • Файлы XLSX (версия Office 2007 и выше)
        Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\ФайлExcel.xlsx;
      • Файлы XLS (ранее)
        Driver={Microsoft Excel Driver (*.xls)}; DriverID=790; DBQ=D:\ФайлExcel.xls;
        Имя и путь к файлу нужно указать собственные.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Транзакции

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

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

Блокировки

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

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

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

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