В процессе работы прикладных решений «1С:Предприятия» может возникнуть потребность получить и изменить данные, хранящиеся во внешних базах данных, созданных с помощью различных сторонних СУБД (Microsoft SQL Server, PostgreSQL, MySQL и т. п.). Эти базы данных могут быть как реляционными, так и аналитическими. Для доступа к внешним данным в платформе «1С:Предприятие» существует объект конфигурации ВнешниеИсточникиДанных. В состав внешнего источника данных могут входить таблицы и функции реляционного источника данных и кубы аналитического источника данных. Для того чтобы использовать информацию из внешних источников данных в прикладном решении «1С:Предприятия», нужно: ■ Изучить структуру внешнего источника данных и понять, какая информация (таблицы и поля или функции) необходима для работы алгоритмов или отчетов в «1С:Предприятии». ■ Создать объект ВнешнийИсточникДанных, содержащий необходимые подчиненные таблицы и поля. Это можно либо сделать вручную, либо заполнить структуру данных этого объекта из внешнего источника данных. ■ Реализовать использование созданных объектов в прикладном решении. ■ Выполнить настройку параметров подключения к внешнему источнику данных в той сети, где будет использоваться прикладное решение. Эти параметры могут отличаться от тех, которые использовались при загрузке структуры внешнего источника данных. Для подключения к внешнему источнику данных с помощью DSN можно воспользоваться специальными утилитами администрирования ODBC, которые могут сформировать описание источника данных, и затем указать в параметрах соединения специальную конструкцию вида DSN=<ИмяDSN>. Описания источника данных могут быть пользовательскими и системными. Пользовательские описания источников данных доступны на данном компьютере и только тому пользователю, который создавал этого описание. Системное описание создается системным администратором и доступно всем пользователем данного компьютера. Чтобы в ОС Windows запустить эту утилиту, нужно выполнить команду Панель управления > Администрирование > Источники данных (ODBC). При этом открывается утилита администрирования, соответствующая версии операционной системы При описании полной строки соединения параметры строки соединения должны записываться парами КлючевоеСлово=Значение и разделяться символом «;». DRIVER=MySQL ODBC 8.0 Unicode Driver;User ID=root; Password=password;Data Source=localhost;Database=spa При получении структуры внешнего источника данных платформа автоматически пытается определить, какие данные расположены в таблице: объектные или необъектные. Таблица будет считаться объектной, если для нее указано только одно ключевое поле, и необъектной в противном случае. Если платформа ошиблась с указанием ключевых полей, можно вручную изменить состав полей, которые образуют ключ таблицы. Если таблица определена как объектная, у нее можно указать поле, которое формирует представление данных такого типа. Поле представления необходимо указать вручную. Затем платформа преобразует типы полей таблиц внешнего источника данных к типам «1С:Предприятия»: число, строка, дата, булево, уникальный идентификатор, двоичные данные и типы, связанные с объектными табли- цами источников данных. Если платформа неправильно выбрала тип колонки таблицы (например, ссылочное поле), его можно изменить вручную. Как уже говорилось, в качестве внешних источников данных для наших примеров мы будем использовать схемы, созданные с помощью СУБД MySQL. Эта СУБД предварительно установлена на локальный компьютер, на котором будут демонстрироваться примеры. Вместе с ней также установлена оболочка MySQL Workbench, с помощью которой мы создадим внешние схемы, таблицы и функции. Итак, сначала создадим схему goods. В этой схеме создадим таблицу goods с ключевым полем id типа int(10) и полем description типа varchar(45). У поля ключа включены свойства Primary Key и Not Null. Это значит, что поле id – это поле первичного ключа, и в этом поле не может содержаться значение Null. В поле description, наоборот, по умолчанию записывается Null. Добавим в эту таблицу несколько записей. Затем создадим схему spa. В этой схеме создадим таблицу clients с ключевым полем id типа int(10) и полем name типа varchar(30). У поля ключа включены свойства Primary Key, Not Null, Unsigned, Auto Increment. Это значит, что поле id – это поле первичного ключа, самовозрастающее, беззнаковое и в этом поле не может содержаться значение Null. В поле name, наоборот, по умолчанию записывается Null. Добавим в эту таблицу несколько записей. Пример программного кода &НаСервере Процедура ЗагрузитьТоварыИзВнешнегоИсточника() // Создать менеджер справочника Товары. Товары = Справочники.Товары; // Получить список товаров с помощью запроса к таблице goods внешнего источника данных Товары. Запрос = Новый Запрос; Запрос.Текст = ″ВЫБРАТЬ | Товары.id КАК Товар, | Товары.description КАК Наименование |ИЗ | ВнешнийИсточникДанных.Товары.Таблица.goods КАК Товары | |УПОРЯДОЧИТЬ ПО | Товар″; РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); // Добавить товары из таблицы goods в справочник Товары, если их там еще нет. Пока Выборка.Следующий() Цикл ТоварСсылка = Товары.НайтиПоНаименованию(Выборка.Наименование, Истина); Если ТоварСсылка = Товары.ПустаяСсылка() ИЛИ ТоварСсылка = Неопределено Тогда Товар = Товары.СоздатьЭлемент(); Иначе Товар = ТоварСсылка.ПолучитьОбъект(); КонецЕсли; Товар.Наименование = Выборка.Наименование; Товар.Записать(); КонецЦикла; КонецПроцедуры &НаСервере Процедура ВыгрузитьТоварыВоВнешнийИсточник() // Создать менеджер таблицы goods внешнего источника данных Товары. Товары = ВнешниеИсточникиДанных.Товары.Таблицы.goods; // Получить список товаров с помощью запроса к справочнику Товары. Запрос = Новый Запрос; Запрос.Текст = ″ВЫБРАТЬ | Товары.Код КАК Код, | Товары.Наименование КАК Наименование |ИЗ | Справочник.Товары КАК Товары | |УПОРЯДОЧИТЬ ПО | Код″; РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); // Добавить товары из справочника Товары во внешнюю таблицу goods, если их там еще нет. Пока Выборка.Следующий() Цикл ТоварСсылка = Товары.НайтиПоПолю(″description″, Выборка.Наименование); Если ТоварСсылка = Товары.ПустаяСсылка() ИЛИ ТоварСсылка = Неопределено Тогда Товар = Товары.СоздатьОбъект(); Иначе Товар = ТоварСсылка.ПолучитьОбъект(); КонецЕсли; Товар.id = Число(Выборка.Код); Товар.description = Выборка.Наименование; Товар.Записать(); КонецЦикла; КонецПроцедуры &НаСервере Процедура ДобавитьПроцедуруВоВнешнийИсточник(СтрокаПроцедуры) // Получить значение ключа с помощью функции ПолучитьМаксимальныйКлючТаблицы() // внешнего источника данных Спа. ЗначениеКлюча = ВнешниеИсточникиДанных.Спа.ПолучитьМаксимальныйКлючТаблицы() + 1; // Создать менеджер таблицы spa_treatments внешнего источника данных Спа. Процедуры = ВнешниеИсточникиДанных.Спа.Таблицы.spa_treatments; // Найти запись в таблице spa_treatments по наименованию добавляемой процедуры. Ссылка = Процедуры.НайтиПоПолю(″description″, СтрокаПроцедуры); // Добавить новую процедуру в таблицу spa_treatments, если ее там еще нет. Если Ссылка = Процедуры.ПустаяСсылка() ИЛИ Ссылка = Неопределено Тогда НоваяПроцедура = Процедуры.СоздатьОбъект(); // Получить и установить изменяемые поля таблицы. ИзменяемыеПоля = НоваяПроцедура.ПолучитьИзменяемыеПоля(); Если ИзменяемыеПоля.Найти(″id″) = Неопределено Тогда // Включить ключевое поле в состав изменяемых полей для новой записи. ИзменяемыеПоля.Добавить(″id″); НоваяПроцедура.УстановитьИзменяемыеПоля(ИзменяемыеПоля); КонецЕсли; // Записать значение ключа в ключевое поле. НоваяПроцедура.id = ЗначениеКлюча; НоваяПроцедура.description = СтрокаПроцедуры; НоваяПроцедура.Записать(); КонецЕсли; КонецПроцедуры