+14
1С 8.x : Excel файл как Внешний источник данных
Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто.
1. В конфигурации добавляет новый объект метаданных типа «Внешние источники данных» и назовем его просто «Excel».
2. На закладке «Данные» созданного объекта «Excel» добавляем новую таблицу. При этом появится окно мастера добавления таблицы внешнего источника.
Выбираем первый пункт «Вручную», т.к. лично у меня второй пункт «Выбрать из списка таблиц внешнего источника данных» работает нестабильно.
Если Вы все же хотите попробовать добавить таблицу через второй пункт, то в качестве строки соединения в появившемся окне указываем:
Driver={Microsoft Excel Driver (*.xls)};DBQ=C:Documents and SettingsAdminМои документыfinance3.xls; DriverID=790
В этой строке укажите путь к своему файлу. Имя пользователя и пароль я не указывал.
Отмечу, что путь к файлу и строка соединения в дальнейшем не запоминается и нужны эти параметры единожды, чтобы создать автоматически описание полей таблицы источника.
Если соединение прошло нормально, то должен отобразиться список таблиц источника. Флажком можно выбрать нужную таблицу и ее поля.
3. Даем имя новой таблице «Данные». Переходим на вкладку таблицы «Данные». В поле «Имя в источнике данных» указываем имя листа в файле Excel и добавляем в конце знак «$». В моем случае это «Данные$». В табличной части «Поля» добавляем поля и редактируем их тип.
У каждого поля в свойствах должно быть задано как минимум «Имя» и «Имя в источнике данных».
4. Создаем процедуру в которой пишем подключение к источнику и запрос:
Код 1C v 8.х
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения=
"Driver={Microsoft Excel Driver (*.xls)};DBQ=C:Documents and SettingsAdminМои документыfinance2.xls; DriverID=790";
ВнешниеИсточникиДанных.Excel.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.Excel.УстановитьСоединение();
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| Данные.date КАК Дата,
| Данные.time КАК Время,
| Данные.account КАК Счет,
| Данные.amount КАК Сумма,
| Данные.currency КАК Валюта,
| Данные.category КАК Категория,
| Данные.parent КАК КатегорияРодитель
|ИЗ
| ВнешнийИсточникДанных.Excel.Таблица.Данные КАК Данные";
ТЗ = Запрос.Выполнить().Выгрузить();
Вот и все!
Источник: passion-programmer
Параметры соединения для файла 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;
Цель данной статьи – показать принципы обмена данными между базой 1С и внешним источником данных на конкретном примере.
Причем тип внешнего источника данных здесь не так уж и важен. Источником могут выступать базы данных, работающие под управлением MS SQL Server или других СУБД, таблиц Exсel, а также других источников, к которым можно подключиться с помощью строки соединения ODBC.
Задачи синхронизации и обмена данными с внешней БД возникают практически на любом предприятии, это может быть:
- Загрузка данных о заказах и online-оплатах с сайта
- Загрузка данных из внешней системы (произведенная продукция, НСИ, бюджеты)
- Обмен данными с внешней системой – передача данных о заказах.
- Формирование отчетности, основанной на данных внешнего источника или на данных различных источников (например, базы 1С и базы SQL Server).
В этой статье мы рассмотрим возможность хранения данных внешней СУБД в объекте «1С:Предприятие 8». Например, к справочнику можно добавить реквизит, который будет ссылаться на таблицу внешнего источника. Таким образом данные внешнего источника становятся частью информационной базы 1С.
Кроме того, мы рассмотрим синхронизацию (двухсторонний обмен), основанную на совместном хранении данных из разных источников в базе 1С. То есть в базе 1С будут храниться настройки сопоставления данных базы 1С и таблицы внешнего источника для последующей загрузки по нашим правилам.
Штатные механизмы платформы «1С:Предприятие 8»
В версии платформы 8.2.14 появился объект метаданных Внешние источники данных.
У этого объекта существует множество применений:
- Различные интеграционные решения, основанные на хранении в реквизитах объектов 1С ссылки на таблицу из внешнего источника данных
- Получение информации из таблиц внешних источников данных
- Получение аналитических данных из внешних источников данных по технологии OLAP (доступно с версии платформы 8.3.5)
- Выполнение функций и хранимых процедур внешнего источника данных (доступно с версии платформы 8.3.4)
- Запись во внешние источники данных (доступно с версии платформы 8.3.5)
- Использование в отчетах на СКД, причем для каждого набора данных может быть указан свой источник. Например, один набор может получать данные из базы 1С, а другой из базы MS SQL Server, затем эти наборы соединяются и выводятся в один отчет
- Использование в качестве источника данных для динамических списков.
Ранее задачи по получению информации из внешних источников данных решались с помощью подключения через COM-соединение. Для простого переноса данных (например, из таблицы Excel) он и сейчас используется, так как в этом случае не нужно вносить изменения в конфигурацию и можно использовать этот механизм во внешних обработках или отчетах.
Но для других, более сложных, задач по интеграции рекомендуется использовать внешние источники данных. Разработчики платформы реализовали удобный функционал для быстрой интеграции 1С с другими СУБД.
Хотя в некоторых случаях, например, при удаленном подключении к внешней информационной базе (это может быть интернет-магазин, СУБД на MySQL), лучше использовать web-сервисы или http-сервисы. При их использовании нет прямого доступа к базе, а только предоставляются нужные сервисы, что значительно лучше в плане безопасности.
Другое преимущество веб-сервисов – работа в модели клиент-сервер, когда клиент посылает запрос, а сервер мгновенно его обрабатывает и передает результат обратно.
Решаемая задача
Рассматриваемая задача является учебной и внешний источник данных в ней используется как инструмент для синхронизации и загрузки данных в базу 1С.
Задача будет решаться в конфигурации – Демо «Управляемое приложение» 8.3, а в качестве внешнего источника данных будет использоваться учебная база MS SQL Server – «AdventureWorks».
Если кто-то захочет воспроизвести данный пример на своем компьютере, то конфигурацию и учебную базу можно легко найти в интернете. Пробную версию MS SQL Server (Evaluation) можно установить бесплатно (на 180 дней) или использовать бесплатную версию Express.
Суть решаемой задачи в том, чтобы перенести данные по товарам из учебной базы SQL Server в базу 1С, причем каждый товар должен быть помещен в определенную группу в зависимости от настроек в базе 1С.
Рассмотрим структуру таблицы MS SQL Server, а также связи между ними. В базе «AdventureWorks» используются таблицы Production.Product, Production.ProductSubcategory и Production.ProductCategory – это товары и их классификация по категориям и субкатегориям.
Связи между таблицами приведены ниже на схеме:
Рисунок 1
Содержимое связанных таблиц можно посмотреть с помощью запроса:
Use AdventureWorks2014; – изменить на свою базу, в зависимости от версии SELECT P.Name AS Product, P.ProductSubcategoryID AS SubcategoryID, PSubCateg.Name AS SubCategory, PCateg.ProductCategoryID AS CategoryID, PCateg.Name AS Category FROM AdventureWorks2014.Production.Product AS P JOIN Production.ProductSubcategory AS PSubCateg ON P.ProductSubcategoryID = PSubCateg.ProductSubcategoryID JOIN Production.ProductCategory AS PCateg ON PSubCateg.ProductCategoryID = PCateg.ProductCategoryID WHERE P.ProductSubcategoryID IS NOT NULL;
Результат выполнения представлен на скриншоте:
Рисунок 2
Нам нужно для каждой строки таблицы создать в базе 1С элемент справочника «Товары» с наименованием из колонки «Product». Значение поля «SubCategory» мы будем хранить в новом реквизите со ссылкой на таблицу внешнего источника данных, а по значению колонки «Category» помещать созданные элементы в определенную группу.
Таблица «ProductCategory» хранит категории товаров, от которых и зависит, в какую группу мы будем записывать товар. Но зависимость здесь не прямая: группа из «ProductCategory» сопоставляется с существующей группой из справочника «Товары» в регистре сведений.
Например, таблица «ProductCategory» содержит следующие значения:
Рисунок 3
В 1С заполнен регистр сведений:
Рисунок 4
Тогда строки из таблицы «Product» с категорией «Bikes» попадают при загрузке в уже существующую в справочнике «Товары» группу «Велосипеды», «Clothing» – в группу «Одежда» и т.д.
Подключение к базе MS SQL Server
Сейчас, когда определена общая концепция решения задачи, можно переходить к ее реализации. В первую очередь нужно подключиться к внешнему источнику данных и настроить его таблицы.
Настроить подключение к внешнему источнику данных в 1С достаточно просто, хотя, конечно, и здесь есть свои особенности.
После добавления внешнего источника данных в конфигураторе (в дереве объектов раздел «Внешние источники данных»), нужно также добавить таблицы, с которыми предстоит работать. Сделать это очень удобно с помощью конструктора, который появляется при добавлении таблицы. С помощью конструктора можно настроить строку подключения, указать логин и пароль для подключения к СУБД.
Рисунок 5
Для MS SQL Server (при стандартной аутентификации) строка подключения выглядит так:
«DRIVER={SQL Server}; SERVER=ServerName;UID=UserName;PWD=Psw;DATABASE=BaseName;
LANGUAGE=русский»
В данном случае ServerName, UserName, Psw, BaseName – это имя сервера, логин, пароль и имя базы данных, к которой подключаемся. Если аутентификация выполняется средствами ОС, то строка подключения будет выглядеть иначе:
«DRIVER={SQL Server};SERVER=ServerName;Trusted_Connection=yes;DATABASE=BaseName;LANGUAGE=русский»
Логин и пароль здесь не используются, но включен параметр Trusted_Connection. Для получения строки подключения к другим источникам данных (Excel, Access, другие СУБД) можно воспользоваться сайтом https://www.connectionstrings.com (на английском языке).
Если подключение проходит успешно, то на следующем шаге отображается конструктор таблиц с перечнем таблиц и полей подключенного источника данных.
Рисунок 6
Здесь следует отметить таблицы, которые нам нужны, а также обязательно проверить правильность определения системой ключевых полей (в данном случае оно должно совпадать с полем первичного ключа таблицы MS SQL Server).
Если не указать поле ключа, то данная таблица считается необъектными данными, т.е. таблицей, в которой нельзя однозначно идентифицировать строку по какому-либо полю. В нашем случае каждая строка таблицы идентифицируется первичным ключом в SQL Server, поэтому это будут объектные данные, что и нужно обязательно указать.
Кроме того, можно указать поле представления, если нужно, чтобы система выводила это поле в качестве представления ключевого поля. В нашем примере поле Name будет отображаться в форме выбора таблицы внешнего источника данных и в регистре сведений, поэтому нужно обязательно указать его в качестве представления.
В общем, можно сказать, что ключевое поле и представление таблицы внешнего источника данных аналогичны ссылке и представлению объектов 1С, например справочника.
Рисунок 7
По условию задачи для хранения настроек сопоставления используется регистр сведений с измерением «Группа товаров» (тип – справочник «Товары») и ресурсом «Категория» (тип – ссылка на таблицу категорий внешнего источника данных). Значение свойства «Выбор групп и элементов» для измерения «Группа товаров» установлено в «Группы», т.к. выбор элементов нам не нужен.
Рисунок 8
Для хранения подкатегории из таблицы «ProductSubcategory» базы SQL Server в справочнике «Товары», мы добавим реквизит «ПодкатегорияВИД», который будет ссылаться на данные внешнего источника данных (тип – ВнешнийИсточникДанныхТаблицаСсылка.Демо.Production_ProductSubcategory).
Рисунок 9
После того как добавлены необходимые объекты в конфигурацию и выполнены настройки подключения к базе MS SQLServer, казалось бы, можно двигаться дальше, однако это еще не все.
Настроить подключение к внешнему источнику данных в режиме конфигуратора недостаточно для работы. Также нужно указать настройки подключения в пользовательском режиме и подключиться к внешнему источнику данных в режиме «1С:Предприятие». Вызывается диалог подключения через команду «Все функции».
Рисунок 10
Настройки подключения из конфигуратора сюда не переносятся, нужно указывать все по-новому.
Рисунок 11
Этот способ никак нельзя назвать удобным, т.к. при каждом запуске «1С:Предприятие 8» приходится выполнять подключение.
Как вариант, можно хранить настройки подключения в регистре сведений и подключаться к внешнему источнику данных программно при запуске конфигурации.
В данном случае в конфигурацию был добавлен общий модуль «Интеграция» и регистр сведений для хранения настроек подключения. Регистр сведений состоит из четырех ресурсов: «Сервер», «Логин», «Пароль», «ИмяВнешнейБД» и «АутентификацияОС». В модуль «Интеграция» включены функция и процедура для подключения:
Функция ПолучитьПараметрыПодключенияКВнешнейИБ() Экспорт; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НастройкиПодключения.Сервер, | НастройкиПодключения.Логин, | НастройкиПодключения.Пароль, | НастройкиПодключения.ИмяВнешнейБД, | НастройкиПодключения.АутентификацияОС |ИЗ | РегистрСведений.НастройкиПодключенияКВнешнемуИсточникуДанных КАК НастройкиПодключения"; Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Сообщить("Не указаны настройки для подключения к внешнему источнику данных"); Возврат Неопределено; КонецЕсли; Выборка = Результат.Выбрать(); Выборка.Следующий(); ПараметрыПодключения = Новый Структура; Если Выборка.АутентификацияОС Тогда ПараметрыПодключения.Вставить("СтрокаСоединения", "DRIVER={SQL Server};SERVER="+Выборка.Сервер+";Trusted_Connection=yes;DATABASE="+Выборка.ИмяВнешнейБД+";LANGUAGE=русский"); ПараметрыПодключения.Вставить("Логин", ""); ПараметрыПодключения.Вставить("Пароль", ""); Иначе ПараметрыПодключения.Вставить("СтрокаСоединения", "DRIVER={SQL Server};SERVER="+Выборка.Сервер+";"+"UID="+Выборка.Логин+";PWD="+Выборка.Пароль+";DATABASE="+Выборка.ИмяВнешнейБД+";LANGUAGE=русский"); ПараметрыПодключения.Вставить("Логин", Выборка.Логин); ПараметрыПодключения.Вставить("Пароль", Выборка.Пароль); КонецЕсли; ПараметрыПодключения.Вставить("АутентификацияОС", Выборка.АутентификацияОС); Возврат ПараметрыПодключения; КонецФункции Процедура ПодключитьсяКВнешнемуИсточникуДанныхMSSqlServer(СтрокаСоединения, Логин, Пароль, АутентификацияОС) Экспорт ПараметрыСоединения = ВнешниеИсточникиДанных.Демо.ПолучитьОбщиеПараметрыСоединения(); ПараметрыСоединения.АутентификацияСтандартная = Не АутентификацияОС; ПараметрыСоединения.АутентификацияОС = АутентификацияОС; ПараметрыСоединения.ИмяПользователя = Логин; ПараметрыСоединения.Пароль = Пароль; ПараметрыСоединения.СтрокаСоединения = СтрокаСоединения; ПараметрыСоединения.СУБД = "MSSQLServer"; Попытка ВнешниеИсточникиДанных.Демо.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения); ВнешниеИсточникиДанных.Демо.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(),ПараметрыСоединения); ВнешниеИсточникиДанных.Демо.УстановитьПараметрыСоединенияСеанса(ПараметрыСоединения); ВнешниеИсточникиДанных.Демо.УстановитьСоединение(); Сообщить("Подключение к внешнему источнику данных выполнено успешно"); Исключение Сообщить("Не удалось подключиться к внешнему источнику данных"); КонецПопытки КонецПроцедуры
В модуль управляемого приложения, для события «ПриНачалеРаботыСистемы» был добавлен код:
ПараметрыПодключения = Интеграция.ПолучитьПараметрыПодключенияКВнешнейИБ(); Если ПараметрыПодключения <> Неопределено Тогда Интеграция.ПодключитьсяКВнешнемуИсточникуДанныхMSSqlServer(ПараметрыПодключения.СтрокаСоединения, ПараметрыПодключения.Логин, ПараметрыПодключения.Пароль, ПараметрыПодключения.АутентификацияОС); КонецЕсли;
Теперь при запуске приложения подключение выполняется автоматически. То есть сейчас можно настроить соответствия в регистрах сведений и приступить непосредственно к написанию программного кода по загрузке данных.
Загрузка данных из внешнего источника данных
Одно из основных ограничений внешних источников данных, на мой взгляд, это то, что нельзя в рамках одного запроса использовать разные источники данных. То есть нельзя использовать в одном запросе обращение к таблицам внешних источников данных и таблицам информационной базы 1С.
В запросах можно использовать временные таблицы, но с ограничениями, а в контексте данной задачи одно из ограничений очень существенное. Суть его в том, что временная таблица создается в базе данных внешнего источника, а значит, использовать ее совместно с таблицами базы 1С нельзя.
Здесь я сделаю небольшое отступление, чтобы осветить этот момент более подробно.
Временную таблицу нельзя создать в базе 1С, т.е. конструкция запроса ПОМЕСТИТЬ ВТ работать не будет. Создать временную таблицу можно только в СУБД внешнего источника, следующей командой:
ПОМЕСТИТЬ ВнешнийИсточникДанных.<ИмяВнешнегоИсточникаВКонфигураторе>.ВременнаяТаблица.<ИмяВТ>, например: ВнешнийИсточникДанных.Демо.ВременнаяТаблица.Продукция.
Стоит отметить, что создавать временные таблицы можно только в СУБД, где поддерживается эта возможность, например в MS SQL Server.
Возвращаясь к задаче, вспоминаем, что, для того чтобы сопоставить данные из базы 1С и MS SQL Server, нам нужно обойти ограничение при использовании соединения таблиц разных источников, вопрос – как это сделать?
Было принято решение использовать выгрузку таблицы внешнего источника данных в таблицу значений с последующей загрузкой и помещением ее во временную таблицу (базы 1С). В данном случае временная таблица создается в базе 1С и ничто не мешает ее использовать в соединениях с другими таблицами. Создаем нужную нам таблицу значений, используя следующий код:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100 | Production_Product.Name КАК Товар, | Production_ProductSubcategory.Ссылка КАК ПодкатегорияИД, | Production_ProductSubcategory.ProductCategoryID КАК КатегорияИД |ИЗ | ВнешнийИсточникДанных.Демо.Таблица.Production_Product КАК Production_Product | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВнешнийИсточникДанных.Демо.Таблица.Production_ProductSubcategory КАК Production_ProductSubcategory | ПО Production_Product.ProductSubcategoryID = Production_ProductSubcategory.Ссылка |ГДЕ | Production_Product.ProductSubcategoryID ЕСТЬ НЕ NULL "; ТЗ_Товары = Запрос.Выполнить().Выгрузить();
Здесь выполняется запрос, соединяющий таблицы внешнего источника данных, причем запрос возвращает не только наименование товара, но и его подкатегорию и категорию. Затем результат запроса выгружается в таблицу значений. Для демонстрации выгружаются только первые 100 строк.
Далее справочник «Товары» соединяется с полученной таблицей значений с помощью следующего запроса:
Запрос.Текст = "ВЫБРАТЬ | ТЗ.Товар, | ТЗ.КатегорияИД, | ТЗ.ПодкатегорияИД |ПОМЕСТИТЬ ВТ_ТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_Товары.Товар, | ВТ_Товары.ПодкатегорияИД, | ЕСТЬNULL(НастройкаСоответствий.ГруппаТоваров, ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)) КАК ГруппаТоваров, | ЕСТЬNULL(Товары.Ссылка, ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)) КАК НайденныйТовар |ИЗ | ВТ_ТЗ КАК ВТ_Товары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаСоответствийСВнешнимИсточникомДанных КАК НастройкаСоответствий | ПО ВТ_Товары.КатегорияИД = НастройкаСоответствий.Категория | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары | ПО (ВТ_Товары.Товар = Товары.Наименование | И НЕ Товары.ЭтоГруппа)"; Запрос.УстановитьПараметр("ТЗ", ТЗ_Товары); Выборка = Запрос.Выполнить().Выбрать();
Данный запрос возвращает наименование и подкатегорию товара из внешнего источника данных, а также группу справочника «Товары», в которую нам нужно добавить создаваемый элемент. Группа товара была определена исходя из настройки соответствий в регистре сведений «НастройкаСоответствийСВнешнимИсточникомДанных».
Также запрос осуществляет поиск по наименованию товара, чтобы определить, существует элемент справочника «Товары» с таким наименованием или нет. Если элемент найден (не равен пустой ссылке), то мы не будем создавать дубль в справочнике «Товары», а модифицируем найденный элемент справочника.
Пока Выборка.Следующий() Цикл Если ЗначениеЗаполнено(Выборка.НайденныйТовар) Тогда ЭлТовары = Выборка.НайденныйТовар.ПолучитьОбъект(); Иначе ЭлТовары = Справочники.Товары.СоздатьЭлемент(); ЭлТовары.Наименование = Выборка.Товар; КонецЕсли; ЭлТовары.Вид = Перечисления.ВидыТоваров.Товар; ЭлТовары.Родитель = Выборка.ГруппаТоваров; ЭлТовары.ПодкатегорияВИД = Выборка.ПодкатегорияИД; ЭлТовары.Записать(); КонецЦикла;
После завершения загрузки мы получаем следующий результат:
Рисунок 12
Товары из таблицы SQL Server «Production.Product» были успешно перенесены в справочник «Товары» и помещены в указанную нами в регистре сведений группу. При этом реквизит «Подкатегория» был заполнен ссылкой на строку таблицы подкатегорий внешнего источника данных «Production_ProductSubcategory».
Подведение итогов
В данной учебной задаче мы рассмотрели перенос данных из базы MS SQL Server, а также реализацию синхронизации (сопоставления) информации внешнего источника с данными базы 1С.
Этот способ можно применять и в других случаях, когда нужно выполнять обмен и синхронизацию с внешними источниками данных. Например, при загрузке элементов справочника номенклатуры или любого другого, где сложно настроить соответствие по какому-либо полю.
При этом изначально соответствия определяются автоматически, например по наименованию. Но на последнем этапе загрузки пользователь может вмешаться и переопределить эти соответствия самостоятельно в окне обработки. Например, указав, что номенклатура с похожим наименованием – это одна и та же номенклатура, а значит, нужно обновить информацию по ней, а не создавать дубли.
Альтернативные инструменты
Подводя итоги, я бы хотел еще сравнить данный способ с альтернативным, например с использованием «Конвертации 2.0». Там также можно работать с данными информационных баз других типов (не 1С), подключаясь к ней с помощью COM-соединения и используя произвольный алгоритм в правиле выгрузки данных. У этого способа есть свои плюсы и минусы.
К плюсам можно отнести то, что данные также будут загружаться по нажатию одной кнопки, при этом не нужно вносить изменения в конфигурацию, что может быть критично, если конфигурация находится на полной поддержке. С другой стороны, в конфигурации не изменяются существующие объекты, а только добавляются новые, поэтому конфликтов при типовом обновлении не будет.
Минус здесь в настройке синхронизации, т.к. во многих случаях нельзя однозначно сопоставить значения из базы 1С и внешнего источника данных, например по коду. Значит, в данном случае придется делать сопоставление по наименованию, что, конечно, не всегда корректно и может приводить к дублям.
Ограничения внешних источников данных
К сожалению, ничто не бывает идеальным, поэтому и у внешних источников данных есть свои ограничения в использовании. Привожу их в виде списка:
- Поддерживаются только управляемые формы (для объектов внешних источников данных можно создавать только управляемые формы).
- Ограничение при использовании временных таблиц в запросах (временные таблицы создаются в базе данных внешнего источника, и если СУБД не поддерживает эту возможность, будет вызвано исключение).
- В одном запросе нельзя использовать данные из разных источников, например из базы 1С и базы сторонней СУБД.
- Так как временные таблицы внешних источников данных создаются не на стороне 1С, то совместно с данными базы 1С в одном запросе их использовать нельзя.
- Запись во внешние источники данных доступна только с версии 8.3.5
- Получение аналитических данных по технологии OLAP также доступно только с версии 8.3.5
- Механизм внешних источников данных требует доработки конфигурации, а значит, не получится его использовать, если конфигурация находится на полной поддержке.
Об авторе
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.
Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.
Содержание
- Перенос данных из Эксель в 1С
- Подготовка данных
- Подключение внешнего загрузчика
- Загрузка данных
- Вопросы и ответы
Уже давно самой популярной программой среди бухгалтеров, планировщиков, экономистов и управленцев стало приложение 1C. Оно имеет не только разнообразное количество конфигураций для различных видов деятельности, но и локализации под стандарты учета в нескольких странах мира. Все больше предприятий переходят на ведение учета именно в этой программе. Но процедура переноса данных вручную из других программ учета в 1C — довольно долгое и скучное занятие, отнимающее массу времени. Если на предприятии велся учет с помощью Excel, то процесс переноса можно существенно автоматизировать и ускорить.
Производить перенос данных из Excel в 1С требуется не только на начальном периоде работы с данной программой. Иногда наступает необходимость подобного, когда по ходу деятельности нужно занести какие-то списки, хранящиеся в книге табличного процессора. Например, если требуется перенести прайс-листы или заказы из онлайн-магазина. В случае, когда списки небольшие, то их можно вбить и вручную, но что делать, если они содержат сотни наименований? Для того, чтобы ускорить процедуру, можно прибегнуть к некоторым дополнительным возможностям.
Для автоматической загрузки подойдут практически все типы документов:
- Список номенклатуры;
- Список контрагентов;
- Список прайсов;
- Перечень заказов;
- Информация о покупках или продажах и т.д.
Сразу нужно отметить, что в 1С нет встроенных инструментов, которые позволяли бы переносить данные из Эксель. Для этих целей нужно подключить внешний загрузчик, который представляет собой файл в формате epf.
Подготовка данных
Нам нужно будет подготовить данные в самой таблице Excel.
- Любой список, загружаемый в 1С, должен быть однородно структурирован. Нельзя выполнять загрузку при наличии в одном столбце или ячейке данных нескольких типов, например, имя человека и его телефонный номер. В этом случае, такие двойные записи обязательно следует разделять в разные столбцы.
- Не допускается наличия объединенных ячеек даже в заголовках. Это может привести к некорректным результатам при переносе данных. Поэтому, если объединенные ячейки имеются, их нужно разделить.
- Если исходную таблицу сделать максимально простой и понятной, без применения относительно сложных технологий (макросы, формулы, комментарии, сноски, лишние элементы форматирования и т.д.), то это поможет максимально предотвратить проблемы на дальнейших шагах переноса.
- Обязательно следует привести наименование всех величин к единому формату. Не допускается наличие обозначения, например, килограмм, отображаемого разными записями: «кг», «килограмм», «кг.». Программа будет их понимать как разные величины, поэтому нужно выбрать один вариант записи, а остальные исправить под этот шаблон.
- Обязательно наличие уникальных идентификаторов. В их роли может выступать содержимое любого столбца, которое не повторяется в других строках: индивидуальный налоговый номер, артикул и т.д. Если в существующей таблице нет столбца с подобным значением, то можно добавить дополнительную колонку и произвести там простую нумерацию. Это нужно для того, чтобы программа смогла идентифицировать данные в каждой строке отдельно, а не «сливала» их вместе.
- Большинство обработчиков файлов Эксель не работает с форматом xlsx, а только с форматом xls. Поэтому, если наш документ имеет расширение xlsx, то нужно его конвертировать. Для этого переходим во вкладку «Файл» и жмем на кнопку «Сохранить как».
Открывается окно сохранения. В поле «Тип файла» по умолчанию будет указан формат xlsx. Меняем его на «Книга Excel 97-2003» и жмем на кнопку «Сохранить».
После этого документ будет сохранен в нужном формате.
Кроме этих универсальных действий по подготовке данных в книге Эксель, нужно будет ещё привести документ в соответствие с требованиями конкретного загрузчика, который мы будем использовать, но об этом мы поговорим чуть ниже.
Подключение внешнего загрузчика
Подключить внешний загрузчик с расширением epf к приложению 1С можно, как до подготовки файла Эксель, так и после. Главное, чтобы к началу процесса выполнения загрузки оба этих подготовительных момента были решены.
Существует несколько внешних загрузчиков таблиц Эксель для 1С, которые созданы различными разработчиками. Рассматривать мы будем пример с использованием инструмента для обработки информации «Загрузка данных из табличного документа» для версии 1С 8.3.
- После того, как файл в формате epf скачан и сохранен на жестком диске компьютера, запускаем программу 1С. Если файл epf упакован в архив, то его предварительно нужно извлечь оттуда. На верхней горизонтальной панели приложения жмем на кнопку, запускающую меню. В версии 1С 8.3 она представлена в виде вписанного в оранжевую окружность треугольника, перевернутого углом вниз. В появившемся списке последовательно переходим по пунктам «Файл» и «Открыть».
- Запускается окно открытия файла. Переходим в директорию его расположения, выделяем тот объект и жмем на кнопку «Открыть».
- После этого загрузчик запустится в 1С.
Скачать обработку «Загрузка данных из табличного документа»
Загрузка данных
Одной из основных баз данных, с которыми работает 1C, является список номенклатуры товаров и услуг. Поэтому для описания процедуры загрузки из Excel остановимся на примере переноса именно этого типа данных.
- Возвращаемся к окну обработки. Так как мы будем загружать номенклатуру товаров, то в параметре «Загрузка в» переключатель должен стоять в позиции «Справочник». Впрочем, он так установлен по умолчанию. Переключать его следует только тогда, когда вы собрались переносить другой тип данных: табличную часть или регистр сведений. Далее в поле «Вид справочника» кликаем по кнопке, на которой изображено многоточие. Открывается выпадающий список. В нем нам следует выбрать пункт «Номенклатура».
- После этого обработчик автоматически расставляет те поля, которые программа использует в этом виде справочника. Нужно сразу отметить, что совсем не обязательно заполнять все поля.
- Теперь опять открываем переносимый документ Excel. Если наименование его колонок отличается от наименования полей справочника 1С, которые содержат соответствующие, то нужно переименовать эти столбцы в Экселе так, чтобы названия полностью совпадали. Если в таблице имеются столбцы, для которых в справочнике нет аналогов, то их следует удалить. В нашем случае такими столбцами являются «Количество» и «Цена». Также следует добавить, что порядок расстановки столбцов в документе должен строго совпадать с тем, который представлен в обработке. Если для некоторых столбцов, которые отображены в загрузчике, у вас нет данных, то эти колонки можно оставлять пустыми, но нумерация тех столбцов, где имеются данные, должна совпадать. Для удобства и быстроты редактирования можно применять специальную возможность Эксель для быстрого перемещения колонок местами.
После того, как данные действия произведены, жмем на значок «Сохранить», который представлен в виде пиктограммы, изображающей дискету в верхнем левом углу окна. Затем закрываем файл, нажав на стандартную кнопку закрытия.
- Возвращаемся в окно обработки 1С. Жмем на кнопку «Открыть», которая изображена в виде папки желтого цвета.
- Запускается окно открытия файла. Переходим в директорию, где расположен документ Эксель, который нам нужен. Переключатель отображения файлов по умолчанию установлен для расширения mxl. Для того чтобы показать нужный нам файл, его требуется переставить в позицию «Лист Excel». После этого выделяем переносимый документ и жмем на кнопку «Открыть».
- После этого содержимое открывается в обработчике. Чтобы проверить корректность заполнения данными, жмем на кнопку «Контроль заполнения».
- Как видим, инструмент контроля заполнения сообщает нам, что ошибки не найдены.
- Теперь перемещаемся во вкладку «Настройка». В «Поле поиска» ставим галочку в той строке, которая у всех наименований, заносимых в справочник номенклатуры, будет уникальная. Чаще всего для этого используют поля «Артикул» или «Наименование». Это нужно делать для того, чтобы при добавлении новых позиций в список, данные не задваивались.
- После того, как все данные внесены и настройки выполнены, можно переходить к непосредственной загрузке информации в справочник. Для этого кликаем по надписи «Загрузить данные».
- Выполняется процесс загрузки. После её завершения можно перейти в справочник номенклатуры и убедиться, что все нужные данные туда добавлены.
Урок: Как поменять столбцы местами в Excel
Мы проследили процедуру добавления данных в справочник номенклатуры в программе 1C 8.3. Для других справочников и документов загрузка будет проводиться по тому же принципу, но с некоторыми нюансами, с которыми пользователь сможет разобраться самостоятельно. Также нужно заметить, что у различных сторонних загрузчиков процедура может отличаться, но общий подход остается у всех одинаковый: сначала обработчик загружает из файла информацию в окно, где производится её редактирование, а уже потом она добавляется непосредственно в базу данных 1С.
Еще статьи по данной теме:
Помогла ли Вам статья?
Все данные 1С хранятся в единой базе данных, что позволяет легко обращаться к ним с помощью запросов 1С, работать с ними в списках в режиме 1С Предприятие.
Однако в работе частенько складывается ситуация, когда часть данных хранится где-то еще.
Примеры:
- Интернет магазин (хранит данные обычно во внешней MySQL/SQL базе)
- Загрузка данных из файлов Excel
- Другая база.
Для работы с такими данными, которые хранятся в других базах данных, нужно разрабатывать специальные механизмы.
В версии 1С 8.2.14 появился новый объект 1С под названием Внешние источники данных 1С, которые сильно облегчают работу программиста, так как:
- теперь специальные механизмы получения данных создавать не нужно
- к таким данным можно обращаться обычным запросом 1С
- такие данные можно просматривать в списках 1С.
- В свойстве Поле ключа – указать одну из колонок, которая будет обеспечивать уникальную идентификацию строки; если уникальность обеспечивают несколько строк – то данный способ не работает (аналог поля Код)
- В свойстве Поле представления – указать одну из колонок, которая будет обеспечивать краткое представление строки (аналог поля Наименование)
- В свойстве Тип данных таблицы – указать Объектные данные.
- Если в первой строке таблицы Excel расположены названия колонок, то нужно указывать просто имя этой колонки, например «Код».
- Иначе нужно указывать полное имя с именем таблицы «Лист1$.Код», но в параметрах добавить «HDR=NO;».
- Файлы 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;
Имя и путь к файлу нужно указать собственные.
Внешний источник данных 1С – внешняя база SQL
Допустим у нас есть база SQL, в которой хранятся нужные нам данные. Попробуем прочитать данные из нее с помощью механизма Внешний источник данных 1С.
Добавим внешний источник данных 1С. Нужно зайти в конфигуратор, внешние источники данных находятся в окне конфигурации, в самом низу дерева объектов 1С.
1. Подключение
Добавим новый внешний источник данных 1С, назовем произвольно.
База данных состоит из таблиц. Нам нужно добавить их внутри добавленного внешнего источника данных. Нажмите на нем правой кнопкой мыши и выберите Добавить таблицу.
В первый раз он предложит указать строку подключения. Ее можно ввести вручную, или сформировать, для чего нужно нажать на кнопку «…».
В качестве драйвера в нашем конкретном случае выберем «SQL Server»
Заполним основные параметры подключения к SQL. Имя сервера можно вписать или выбрать из списка.
1С выполнит соединение с SQL и предложит выбрать из списка конкретную базу данных.
После этого 1С отобразит список таблиц в этой базе данных и их колонок. Нужно галочками выбрать требуемые таблицы.
Таблицы и колонки будут добавлены. Названия будут такие, как они определены в удаленной базе. В 1С Вы можете их переименовать (в свойствах).
Вот пример добавленной таблицы:
Вот пример добавленной колонки:
Чтобы платформа 1С работала с внешней таблицей также, как она делает со справочниками 1С, в таблице можно указать дополнительные параметры:
2. Просмотр
Соединение с удаленной базой не производится автоматически. Чтобы подключиться, нужно выбрать типовое меню Все функции.
В ветке Стандартные расположена специальная команда Управление внешними источниками данных, которая позволяет указывать параметры соединения (свои для режима 1С Предприятия) и проводить подключение.
Сначала нужно указать параметры соединения с базой.
Когда Вы делали настройку в конфигураторе, он в результате показал Вам строку соединения. Вы можете повторно увидеть ее, нажав Добавить таблицу в конфигураторе еще раз.
Скопируйте строку соединения и укажите ее в режиме 1С Предприятие.
После этого необходимо произвести собственно подключение.
После того, как произведено подключение, возможно работать со списками.
3. Использование в языке 1С
Подключение можно производить и из кода программы на языке 1С.
Параметры подключения указываются так:
ПараметрыСоединения = ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.ПолучитьОбщиеПараметрыСоединения();
ПараметрыСоединения.АутентификацияСтандартная = Истина;
ПараметрыСоединения.ИмяПользователя = «sa»;
ПараметрыСоединения.Пароль = «пароль»;
ПараметрыСоединения.СтрокаСоединения = «строка соединения из конфигуратора»;
ПараметрыСоединения.СУБД = «MSSQLServer»;
ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьПараметрыСоединенияСеанса(Параметры);
ВнешниеИсточникиДанных.ИмяИсточникаКонфигураторе.УстановитьСоединение();
Запросить данные из базы данных можно с помощью обычного запроса 1С. Пример текста запроса для внешнего источника НашВнешнийИсточник
и таблицы ТаблицаВнешнегоИсточника
:
ВЫБРАТЬ
ТаблицаВнешнегоИсточника.ИмяПоля
ИЗ
ВнешнийИсточникДанных.НашВнешнийИсточник.Таблица.ТаблицаВнешнегоИсточника»
Внешний источник данных 1С – работа с файлом Excel
Попробуем другой вариант – работу с файлом Excel через внешний источник данных 1С.
Создадим простой файл Excel.
Добавим внешний источник, назовем произвольно ФайлExcel. В него добавим таблицу «Лист1$». Как несложно заметить – это имя листа в Excel с добавлением символа «$».
Как и в случае с SQL, добавим колонки. Их можно добавить вручную. Важно следить за соответствием типов добавляемых колонок, иначе позже можно получить ошибку вида «Несоответствие типов данных».
Для колонки нужно указывать имя в 1С и имя в источнике данных.
Для Excel существует особенность (ошибка вида «Слишком мало параметров. Требуется 3»):
Параметры соединения для файла Excel выглядят вот так:
Загрузка…
В статье рассмотрены варианты загрузки файлов Excel и табличных документов в объекты 1С, на примере таблиц значений. Если вам нужно загрузить файл Excel с одним или несколькими листами (не важно, xls или xlsx, или даже ods), или прочитать средствами 1С табличный документ mxl – читайте эту статью. Приводятся примеры кода, которые вы можете адаптировать под ваши задачи. Материал вышел большой, для удобства пользуйтесь навигацией по содержанию.
Содержание
Зачем писать свою загрузку? Ведь есть же типовые?
Во многих типовых конфигурациях на базе БСП имеется подсистема “Загрузка данных из файла”, кроме того, на ИТС можно найти обработку загрузки данных из табличного документа. Они позволяют загружать из внешних файлов данные во многие объекты: табличные части документов, справочники, регистры сведений. Кроме того, у этих обработок достаточно мощный функционал по сопоставлению данных из файла с объектами в базе 1С, разнообразные настройки, возможность создания элементов, в случае если они не найдены…
Так в чем же необходимость “изобретать велосипед”? На то несколько причин.
- Излишняя сложность. Ради универсальности приходится жертвовать простотой, и для рядового пользователя универсальные обработки могут оказаться сложнее, чем узкоспециализированная обработка, написанная под конкретный формат файла.
- Как ни странно, не стопроцентная универсальность. Действительно, как быть, если нам нужно загрузить не справочники, а планы видов характеристик? Или план расчета? Или на основании одного файла заполнить сразу несколько документов?
- Необходимость в специфичных алгоритмах. Например, при создании контрагента создавать также строго определенные договоры, или при загрузке в документ выполнять заполнение дополнительных, рассчетных колонок
- Сложные форматы исходных файлов. Например, исходный файл содержит несколько листов, и каждый из этих листов следует отдельно обработать. Второй пример – данные на листе сложно структурированы, и на одном листе могут содержаться несколько табличных частей, разделенных пустыми строками или колонками. Такие форматы встречаются, в частности, в отчетах зарубежных брокеров. На одном листе содержится информация и о сделках с финансовыми инструментами, и о движении денежных средств, и информация о ценных бумагах, и т.д.
В каком случае хороши универсальные загрузки из табличного документа?
Различные обработки загрузки из табличного документа отлично подходят, когда формат загружаемого файла не слишком сложный, а загрузка не предполагает множества дополнительных действий. Типичные примеры: загрузка прайс-листов, загрузка заказов, загрузка начальных остатков.
Подходящих случаев использования универсальных механизмов загрузки действительно много, иначе их не стали бы включать в библиотеку стандартных подсистем. Но если функциональности стандартных средств недостаточно, всегда можно создать свою собственную обработку. Ниже рассмотрены несколько приемов, которые можно использовать при загрузке файлов Excel и других табличных документов в 1С.
Особенности загрузки из файлов Excel с несколькими листами
При использовании метода табличного документа Прочитать(), файл Excel с несколькими листами читается так, что каждый лист помещается в отдельную именованную область ячеек, но при этом весь файл выводится в один табличный документ.
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДД = ПолучитьИзВременногоХранилища(АдресВХ);
ДД.Записать(ИмяВременногоФайла);
СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
//Рассмотрим пример, когда загружаем в 1С файл xlsx с листами
// Лист1, Лист2, Лист3, Лист4, Лист5
Попытка
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
МассивИмен = Новый Массив;
Для Каждого Область Из ТабДок.Области Цикл
МассивИмен.Добавить(Область.Имя);
КонецЦикла;
Элементы.ИмяЛиста.СписокВыбора.ЗагрузитьЗначения(МассивИмен);
Исключение
КонецПопытки;
КонецПроцедуры
Загрузка с обходом строк и колонок
Для первого примера используем решение “в лоб”. Предположим, что количество и порядок колонок в файле известно заранее, и не меняется. Также будем считать постоянной и известной заранее первую строку, с которой следует начинать загрузку. Тогда нам достаточно в цикле пройти от первой строки до конца табличного документа.
Не следует путать методы табличного документа Область() и ПолучитьОбласть(). Первый возвращает область ячеек, а второй – новый табличный документ.
Если структура колонок таблицы, в которую мы загружаем, полностью идентична структуре колонок файла, мы можем загрузить данные, используя индексы.
&НаСервере
Процедура ПрочитатьВТаблицуЗначенийНаСервере()
//Работает и на сервере, и в тонком клиенте, возвращает область ячеек
ОбластьТЗ = ТабДок.Области.Лист2;
ОбластьТЗ = ТабДок.Область("Лист2");
//Работает только на сервере, возвращает табличный документ
Лист2 = ТабДок.ПолучитьОбласть("Лист2");
ТаблицаЗначений.Очистить();
ТЗ = ТаблицаЗначений.Выгрузить();
Для НомерСтроки = 6 По Лист2.ВысотаТаблицы Цикл
СтрТЗ = ТЗ.Добавить();
Для НомерКолонки = 2 По Лист2.ШиринаТаблицы Цикл
СтрТЗ[НомерКолонки-2] = Лист2.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).Текст;
КонецЦикла;
КонецЦикла;
ТаблицаЗначений.Загрузить(ТЗ);
КонецПроцедуры
Если же состав колонок отличается, предпочтительнее использовать имена колонок. Обратите внимание, что при получении текста области, мы используем четыре параметра, чтобы получить область в виде конкретной ячейки. Но также можно указывать два параметра, если вы уверены, что в файле не будет объединенных ячеек, либо наоборот, указывать прямоугольную область объединенных ячеек – все зависит от конкретной задачи.
ТаблицаЗначений.Очистить();
ТЗ = ТаблицаЗначений.Выгрузить();
Для НомерСтроки = 6 По Лист2.ВысотаТаблицы Цикл
СтрТЗ = ТЗ.Добавить();
Наименование = Лист2.Область(НомерСтроки, 2, НомерСтроки, 2).Текст;
Количество = Лист2.Область(НомерСтроки, 3, НомерСтроки, 3).Текст;
Цена = Лист2.Область(НомерСтроки, 4, НомерСтроки, 4).Текст;
Сумма = Лист2.Область(НомерСтроки, 5, НомерСтроки, 5).Текст;
СтрТЗ.Наименование = Наименование;
СтрТЗ.Количество = Количество;
СтрТЗ.Цена = Цена;
СтрТЗ.Сумма = Сумма;
КонецЦикла;
ТаблицаЗначений.Загрузить(ТЗ);
С полученными данными можно дальше работать как угодно. Например, выполнить поиск товара по наименованию, и если он не найден – создать такой товар. Либо наоборот – вывести пользователю ошибку, что товар не удалось найти. Выбор подходящей бизнес-логики выходит за рамки данной статьи.
Загрузка табличного документа при помощи построителя отчета
В случае, когда у загружаемого файла есть строка с заголовками, можно выполнить загрузку из файла Excel, используя построитель отчета. В этом случае следует задать прямоугольную область ячеек, включая строку заголовков. В результате получится объект РезультатЗапроса, который далее можно обрабатывать как обычно – например, выгрузить в таблицу значений, поместить во временную таблицу и использовать в других запросах, и т.д.
&НаСервере
Процедура ПрочитатьПриПомощиПостроителяНаСервере()
Лист3 = ТабДок.ПолучитьОбласть("Лист3");
ОбластьЯчеек = Лист3.Область(5, 2, Лист3.ВысотаТаблицы, Лист3.ШиринаТаблицы);
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
ТЗ = ПостроительОтчета.Результат.Выгрузить();
ТаблицаЗначений2.Загрузить(ТЗ);
КонецПроцедуры
Важно! В случае, если заголовки колонок в файле не соответствуют правилу именования переменных в 1С, они будут изменены компоновщиком – некорректные символы и пробелы будут заменены на знак подчеркивания “_”.
Динамическое сопоставление данных при загрузке
Предыдущие примеры ориентированы на работу с известным и неизменным составом колонок в исходном файле. Но что, если формат файла может меняться? Чтобы каждый раз не переписывать код, можно сделать его более гибким. Рассмотрим более сложный пример.
Предположим, есть несколько прайс-листов от разных поставщиков. Эти файлы имеют похожие, но не одинаковые форматы. Колонки могут располагаться в разном порядке, по-разному называться, шапка файла также имеет разное количество строк. В этом случае можно создать обработку, которая пусть и не будет универсальной, но будет достаточно гибко настраиваемой.
Добавим реквизит для указания имени области (чтобы можно было выбирать конкретный лист для чтения). Также добавим реквизит для указания пользователем номера первой строки. И основная часть настроек – таблица сопоставления колонок. Минимально достаточно будет сделать две колонки – номер исходный и номер принимающий. Такой прием распространен достаточно широко, и называется маппингом. Кроме маппинга по номерам существуют и другие варианты маппинга – например, по именам колонок.
&НаСервере
Процедура ПрочитатьСДинамическимиНастройкамиНаСервере()
НужныйЛист = ТабДок.ПолучитьОбласть(ИмяЛиста);
ТаблицаЗначений3.Очистить();
ТЗ = ТаблицаЗначений3.Выгрузить();
Для НомерСтроки = НомерПервойСтроки По НужныйЛист.ВысотаТаблицы Цикл
СтрТЗ = ТЗ.Добавить();
Для Каждого СтрСопоставления Из ТаблицаСопоставления Цикл
НомерКолонки = СтрСопоставления.НомерКолонкиИсходный;
СтрТЗ[СтрСопоставления.НомерКолонкиПринимающий-1] = НужныйЛист.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).Текст;
КонецЦикла;
КонецЦикла;
ТаблицаЗначений3.Загрузить(ТЗ);
КонецПроцедуры
Более сложные сценарии
Не всегда форматы получаемых файлов удобны для загрузки. И не всегда есть возможность попросить передающую сторону обработать файл перед отправкой. Например, файл формируется каким-нибудь веб-ресурсом, либо присылается брокером по электронной почте. Можно конечно, посадить отдельного человека на обработку таких файлов и приведение их к единому формату – но это не самое рациональное и экономически оправданное решение.
Универсального “рецепта” нет, и далее будут только мои рекомендации и подходы, которые сформировались за годы практики.
Выше приведен специально усложненный формат файла, но на практике встречаются гораздо более неудобные файлы excel, которые нужно загрузить в 1С. Итак, с чем можно столкнуться, и что можно попробовать предпринять?
- “Плавающая” шапка. В зависимости от каких-нибудь условий, первая строка значимой информации может изменяться. Решение – динамически определять начало таблицы для загрузки – по тексту шапки таблицы, по цвету ячеек, и т.п.
- Несколько таблиц на одном листе. Решение – динамически определять начало и окончание каждой таблицы. В качестве окончания могут служить строки с текстом “Итого”, “Всего”. Также определять начало следующей таблицы и отнимать определенное количество строк, которое разделяет одну и другую таблицы в файле.
- Неподходящий формат ячеек. Текст “100 500.50” не является числом, и необходимо выполнить ряд действий, чтобы преобразовать его к числу – удалить разделитель разрядов, заменить точку на запятую, при необходимости удалить символ валюты, если он также присутствует в ячейке.
- Объединенные ячейки. Решение – анализируйте формат, используйте соответствующие параметры при задании области ячеек.
- Пустые строки, пустые колонки. Встречаются решения, когда файл анализируется с определенной строки и до первой встретившейся пустой ячейки – предполагается, что достигнут конец файла. Но такой подход не всегда корректен. Возможны случаи, когда после пустой строки или колонки продолжаются значимые строки. Решение – использовать более точный способ определения конца таблицы: метод ВысотаТаблицы, ячейки с ключевыми словами, ячейки с ключевым оформлением цветом.
Если вас не испугал последний раздел, и вы дочитали до конца – поздравляю и благодарю! Мне доводилось загружать файлы excel на китайском языке, загружать отчеты брокеров с самыми дикими форматами, загружать xls-файлы, полученные путем распознавания отсканированного изображения, и бороться с кучей ошибок.
Верьте в себя, не опускайте руки перед лицом проблем, и все получится!
Релиз 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С выглядит как-то половинчато. Я ещё не определился чем удобнее пользоваться. Вы решайте, и пишите о ваших решениях, и что вас к ним подтолкнуло.
[необходимо зарегистрироваться для просмотра ссылки]
В платформе начиная с версии 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С Предприятие.
Однако в работе частенько складывается ситуация, когда часть данных хранится где-то еще.
- Интернет магазин (хранит данные обычно во внешней MySQL/SQL базе)
- Другая база.
Для работы с такими данными, которые хранятся в других базах данных, нужно разрабатывать специальные механизмы.
В версии 1С 8.2.14 появился новый под названием Внешние источники данных 1С, которые сильно облегчают работу программиста, так как:
- теперь специальные механизмы получения данных создавать не нужно
- к таким данным можно обращаться обычным
- такие данные можно просматривать в списках 1С.
- В свойстве Поле ключа – указать одну из колонок, которая будет обеспечивать уникальную идентификацию строки; если уникальность обеспечивают несколько строк – то данный способ не работает (аналог поля Код)
- В свойстве Поле представления – указать одну из колонок, которая будет обеспечивать краткое представление строки (аналог поля Наименование)
- В свойстве Тип данных таблицы – указать Объектные данные.
- Если в первой строке таблицы Excel расположены названия колонок, то нужно указывать просто имя этой колонки, например «Код».
- Иначе нужно указывать полное имя с именем таблицы «Лист1$.Код», но в параметрах добавить «HDR=NO;».
- Файлы 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;
Имя и путь к файлу нужно указать собственные.
Внешний источник данных 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 выглядят вот так:
В 8 версии программы 1С разработчики добавили в функционал возможность подключения сторонних баз данных и получения информации из них напрямую из конфигуратора, без использования COM соединений и OLE объектов. Эта возможность реализована при помощи нового объекта – «Внешних источников данных»
Внешние источники данных в 1С можно использовать так же, как и остальные таблицы системы:
- При создании отчетов и расчетов с помощью системы компоновки данных (СКД);
- Для получения ссылок на информацию, хранящуюся в сторонних источниках;
- Для изменения хранящихся в таблицах данных;
- При формировании запросов.
Важно знать, что этот механизм не рассчитан на работу с другими базами данных 1С, поскольку сама модель функционирования «1С.Предприятия» не предполагает вмешательства в данные на уровне физических таблиц.
Создание нового источника
Добавление нового внешнего источника в программу происходит в режиме «Конфигуратора». В дереве конфигурации есть соответствующая ветка (Рис.1)
Попотеть при создании нового источника придется, несмотря на то, что форма нового объекта имеет всего четыре закладки:
- Основные;
- Данные;
- Функции;
- Права.
Первая закладка имеет только один интересный параметр – режим управления блокировкой. Если не задаваться вопросами о блокировании данных в транзакциях, о тонкостях распараллеливания информационных потоков можно оставить этот параметр в режиме автоматической блокировки. Однако подобный подход может привести к появлению избыточных ограничений (например, когда вместо отдельной записи программа заблокирует всю физическую таблицу, лишив остальных пользователей возможности работы с ней).
Управляемые блокировки, в отличие от автоматических используют механизм транзакций, заложенный в самой программе, а не в СУБД, что позволяет перевести захваты таблиц на гораздо более низкий уровень.
Установив в этом параметре значение «Автоматический и управляемый» мы предоставляем системе возможность определить, какой режим использовать, обратившись непосредственно к аналогичному свойству каждой конкретной таблицы.
Закладка «Данные» формы свойств внешнего источника
Форма закладки «Данные» представлена на Рис. 2
Рис. 2
Здесь мы можем добавить таблицы внешнего источника и кубы. Добавлять таблицу можно двумя способами:
- Вручную, тогда перед нами откроется форма добавления таблицы (Рис. 3);
Рис. 3
- Либо выбрать из списка физических таблиц источника (Рис. 4), в этом случае перед нами открывается специальный конструктор.
Рис. 4
Рассмотрим подробнее форму добавления таблицы. Свойство «Имя» служит для однозначной идентификации объекта в конфигурации.
Сопоставление объекта метаданных и конечной физической таблицы происходит через свойство «Имя в источнике данных», расположенном на закладке «Дополнительно» (Рис. 5)
Рис. 5
Дальше мы должны определить тип таблицы, точнее её объектность. Если данные, хранимые в структуре можно однозначно идентифицировать через какое-либо одно поле, таблица – может быть объектной. Если индивидуальность записи определяется набором ключевых полей – таблица должна иметь необъектный тип.
Сравнивая такие таблицы с другими объектами метаданных можно привести следующую аналогию:
- Объектные таблицы – это справочники;
- Необъектные – это регистры сведений.
Набор ключевых полей определяется в следующем параметре формы («Поля ключа»). Это поле обязательно к заполнению, если оставить его пустым, сохранение конфигурации завершится ошибкой.
Как видно из Рис.5, некоторые поля и кнопки формы недоступны для изменения:
- Выражение в источнике данных;
- Тип данных таблицы;
- Поле представления;
- Обработчики представления.
Их можно будет использовать только после того, как мы заполним поля таблицы, определив их тип и задав им идентификаторы (Рис. 6)
Рис. 6
Здесь следует обратить внимание на параметр «Разрешить Null», если установлен этот флажок, такое поле нежелательно использовать в качестве ключа.
Конструктор таблиц
Пожалуй, самым важным и интересным моментом в работе с внешними источниками является создание строки подключения. Её конструктор открывается, если нажать кнопку с тремя точками у параметра «Строка соединения».
В первую очередь нам предложат определиться с драйвером, который будет использоваться для подключения (Рис. 7)
Рис. 7
Неправильное определение этого параметра не позволит подключиться к сторонней информационной базе. Также следует понимать, что не все указанные в выпадающем списке драйвера могут быть использованы для автоматического формирования строки соединения. Если платформа выдала ошибку (Рис. 8), то строку соединения придется прописывать вручную.
Рис.8
Рис. 9
Сама строка представляет собой жестко регламентированную конструкцию.
Пример строки подключения
Рассмотрим стороннюю базу данных, созданную в Microsoft Access и расположенную в корне диска D. Для подключения этой базы мы должны использовать соответствующий драйвер, но его выбор в конструкторе строки приводит к появлению ошибки Рис.8.
Самостоятельно пропишем параметры подключения.
Driver={Microsoft Access Driver (*.mdb)} – именно так выглядит первая часть строки. В фигурных скобках мы определили драйвер.
Для файлов Excel она будет иметь вид {Microsoft Excel Driver (*.xls)} , для экселевских файлов, созданных в офисе старше 2003, строка драйвера будет иметь вид {Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}.
Отделив точкой запятой этот параметр от следующего, мы должны прописать адрес нашего хранилища (в нашем случае DBQ=D:База данных1.mdb).
Сложив эти два параметра получим Driver={Microsoft Access Driver (*.mdb)};DBQ=D:База данных1.mdb, записав этот параметр, получим доступ к внутренним структурам этой базы.
Для объекта «Внешний источник» мало просто создать его в конфигурации, его еще надо подключить и в режиме «Предприятия». Это можно сделать из меню «Все функции»->Внешние источники. При первом входе в нашу таблицу нам надо прописать ту же самую строку соединения уже в режиме «Предприятия».
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес приложений с твердой уверенностью скажет вам — что ему нравится больше всего в 1С. Конечно конструктор запросов — самый удобный и продуманный механизм написания запросов для получения данных из реляционных структур, который я лично когда-либо встречал. А теперь 1С нам предоставили такую замечательную возможность использовать его не только с 1С, но и с любыми другими таблицами. Вот только в эту «бочку мёда» насыпана куча «ложек дёгтя». Обо всём по порядку:
1) Настройка и использование
— без «танцев с бубном» не получится
a) Добавляете внешний источник данных — вроде ничего сложного
б) ставите галочку «Выбрать из списка» — обязательно — это нужно чтобы проверить работоспособность уже в начале и избавит от лишних заморочек
в) — обязательно нажимаем «…» — подключение именно ODBC. Не OLEDB как мы все привыкли, а на уровень ниже
Г) А вот здесь будьте ОЧЕНЬ ВНИМАТЕЛЬНЫ.
Это драйвер ODBC — в случае использования клиент-серверной версии он должен обязательно быть на сервере. Если вы ведёте разработку на одной системе, а рабочая версия на другой (как это обычно бывает) убедитесь что вас не ждут сюрпризы. Странная рекоммендация, но выбирайте самый древний или самый общий драйвер в случае если вас не особо заботит скорость и за пределы возможностей стандарта SQL92 вы выходить не намерены. Это обеспечит вам лучшую совместимость. Например для SQL Server 2008 лучшим драйвером будет SQL Server Native Client 11, но рекоммендую выбирать просто SQL Server, иначе этот самый native client придётся устанавливать либо на сервер, либо на все клиентские машины (в случае использования файловой версии), а выигрыша особого для простых задач он не даст.
д) Стандартные диалоги выбора Сервера
Е) На вопрос сохранения пароля рекомендую ответить «да», иначе так и не получится это дело запустить.
ж) Выбираете таблицу и реквизиты… замечательная возможность — её можно сразу же переименовать так как вам нравится (и реквизиты тоже), при этом в свойствах у вас будут отображаться названия полей источника данных
З) А теперь запускаете, открываете конструктор запросов — выбираете тупо все записи из таблицы и ОПА — ошибка. Что делать? Если у вас управляемый интерфейс — заглянуть в меню сервис, а если обычный…
Я лично использовал вот такой код:
Код 1C v 8.х
Параметры = ВнешниеИсточникиДанных.DAX.ПолучитьОбщиеПараметрыСоединения();
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = «sa»;
Параметры.Пароль = «pas»;
Параметры.СтрокаСоединения = «DRIVER={SQL Server};SERVER=servet;UID=sa;PWD=;DATABASE=database»;
Параметры.СУБД = «MSSQLServer»;
ВнешниеИсточникиДанных.DAX.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияСеанса(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьСоединение();
Может каких-то кусков и не нужно, но это работает.
Выполнить код нужно ОДИН РАЗ. После чего будет нормально подключаться… мистика конечно — зачем это было нужно не понятно…
2) Источники данных только для чтения
— Да, чудес не бывает… но иногда так хочется….
3) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВНУТРЕННИМИ ИСТОЧНИКАМИ ДАННЫХ
Меня лично этот факт убил наповал
Как же так…. то чего так ждали и уже представляли и облизывались как мы сейчас в одном запросе соединим наши данные с 1С-кой свернём — сгруппируем, вставим в отчет, а не тут то было…
Но естественно опытных людей это не останавливает… какая мысль пришла в голову? Правильно — временные таблицы:
4) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВРЕМЕННЫМИ ТАБЛИЦАМИ
А вот это уже не похоже на технологические трудности, а очень смахивает на то что нам хотят «чтобы жизнь раем не казалась» сделать:).
5) Можно использовать только в соединениях СКД
Для тех кто не знает — это в СКД на вкладке «Связи наборов данных». Часто вы ими пользуетесь? Удобно? Видимо так нас хотят принудить к использованию их чаще. Вот только там есть колонка «Условие связи» и «Параметр связи». Ни в одной типовой конфигурации не нашел примера их использования, в документации и у Хрусталевой тоже как-то всё не прозрачно. Кто-нибудь сможет мне объяснить как работает «условие связи». Если там написать РеквизитИсточника = РевизитПриемника это не работает. Конечно условие можно записать в поле «Выражение» — в большинстве случаев этого хватает… вот только как-то не очень просто получается.
Итого ранее эта задача решалась где-то так:
Код 1C v 8.х
Функция ИнициализироватьИсточникДанных()
ДатаНач = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Значение;
ДатаКон = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Значение;
Если ДатаКон > «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 = «S_elect * fr om PH wh ere 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С выглядит как-то половинчато. Я ещё не определился чем удобнее пользоваться. Вы решайте, и пишите о ваших решениях, и что вас к ним подтолкнуло.
Информация взята с сайта