1с зовнішні джерела даних створення документа. Зовнішні джерела даних. Створення нового джерела

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

Для того, щоб запис у зовнішні джерела став можливим, компанія 1С додала нові властивості таблицям даних та полям зовнішніх джерел:

  • Для всієї таблиці – властивість ТількиЧитання. ТількиЧитання = Істинаозначає, що зміна даних у цій таблиці неможлива;
  • Для окремих полів таблиці – властивості ТількиЧитання, ДозволитиNullі ЗначенняЗаповнення:
    • ТількиЧитання = Істинаозначає, що зміна даних у цьому полі неможлива;
    • ДозволитиNull = Істинаозначає, що це поле може бути записано значення NULL;
    • ЗначенняЗаповненнямістить стандартне значення цього поля (якщо таке існує).

Ці властивості ви (при описі таблиць вручну) або платформа (при створенні таблиць конструктором) можете використовувати в такий спосіб.

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

Додавати, змінювати та видаляти дані у зовнішніх джерелах можна за допомогою вбудованої мови або інтерактивно. У вбудованому мові при цьому використовуються такі методи менеджера таблици:

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

Відповідно у об'єктів ЗовнішнійДжерелоДанихТаблицяНабірЗаписіві ЗовнішнійДжерелоДанихТаблицяОб'єктз'явилися нові методи Записати()і Видалити().

Додавання даних

При додаванні даних до зовнішнього джерела ви створюєте об'єкт (або набір записів), встановлюєте значення полів та записуєте. При цьому є деякі особливості, які корисно знати.

Наприклад, при спробі встановити значення поля, у якого ТількиЧитання = Істина, буде видано помилку. А при безпосередньому запису до бази даних у виразі INSERTтакі поля будуть пропущені. В інші поля записуються ті значення, які ви їм надали. Тому значення Nullі значення за замовчуванням потрібно надавати полям у явному вигляді.

  • id(ДозволитиNull = Істина);
  • name(ДозволитиNull = Істина);
мХарактеристика = ЗовнішніДжерелаДаних.ІМ.Таблиці.shop_feature.СтворитиОб'єкт();

мХарактеристика.id = Код; Записати()мХарактеристика.name = Найменування; мХарактеристика.Записати();Виконання оператора INSERTпризведе до того, що спочатку буде викликаний обробник події ПередЗаписом.

, потім виконано фізичний запис до таблиці зовнішнього джерела ( INSERT), потім буде викликаний обробник події ПріЗаписиЗ ключовим полем таблиці зовнішнього джерела ви можете чинити так. Якщо ключове поле доступне для зміни, тоді ви вручну задаєте його значення перед записом. Якщо зміна ключового поля заборонена, то платформа самостійно отримає ключ у мХарактеристика.Записати();чи безпосередньо після. Ви можете втрутитись у цей процес за допомогою методу ПередЗаписом).

ВстановитиПосиланняНового()

до фізичного запису (в обробнику події ) або безпосередньо після фізичного запису (в обробнику події.

Зміна даних

При зміні даних оновлюються значення всіх полів таблиці, які мають ТількиЧитання = Брехняі МХарактеристика = Зовнішні Джерела Даних. ІМ. Таблиці. shop_feature. мОбъект = мХарактеристика.ОтриматиОбъект(); мОбъект.name = Найменування; мОб'єкт.Записати();.

Якщо необхідно записати лише деякі поля, ви можете вказати їх перелік прямо з вбудованої мови за допомогою методів

ВстановитиЗаписуваніПоля() ОтриматиЗаписуваніПоля().

Видалення даних

У разі видалення даних виконується безпосереднє видалення рядка з таблиці бази даних. При цьому пошук посилань на об'єкт, що видаляється, не виконується. Якщо така функціональність потрібна, ви можете запрограмувати її самостійно в обробнику події

ПередВидаленням() МХарактеристика = Зовнішні Джерела Даних. ІМ. Таблиці. shop_feature. мОбъект = мХарактеристика.ОтриматиОбъект(); мОбъект.Выдалить();:

  • Транзакції;
  • Читання зовнішніх джерел, як і раніше, виконується поза транзакцією, а при записі платформа відкриває неявну транзакцію. При цьому і читання, і запис можна виконувати і в явних транзакціях за допомогою методів об'єкта;
  • ЗовнішнійДжерелоДанихМенеджер.

Розпочати транзакцію()

  • ЗафіксуватиТранзакцію();
  • СкасуватиТранзакцію();
  • Блокування.

Автоматичний Керований:

Крім цього, можна самостійно задати рівень блокувань у методі Транзакції.

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

Працювати з ними у списках у режимі 1С Підприємство.

Однак у роботі часто складається ситуація, коли частина даних зберігається десь ще.

  • Інтернет магазин (зберігає дані зазвичай у зовнішній MySQL/SQL базі)
  • Інша основа.

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

У версії 1С 8.2.14 з'явився новий під назвою Зовнішні джерела даних 1С, які полегшують роботу програміста, так як:

  • тепер спеціальні механізми отримання даних створювати не потрібно
  • до таких даних можна звертатися звичайним
  • такі дані можна переглядати у списках 1С.
    • Зовнішнє джерело даних 1С – зовнішня база SQL

      Допустимо, у нас є база SQL, в якій зберігаються потрібні нам дані. Спробуємо прочитати дані із неї за допомогою механізму Зовнішнє джерело даних 1С.

      Додамо зовнішнє джерело даних 1С. Потрібно зайти до конфігуратора, зовнішні джерела даних знаходяться у вікні конфігурації, в самому низу дерева.

      1. Підключення

      Додамо нове зовнішнє джерело даних 1С, назвемо довільно.

      База даних складається із таблиць. Нам потрібно додати їх усередині доданого зовнішнього джерела даних. Натисніть на ньому правою кнопкою миші та виберіть Додати таблицю.

      Вперше він запропонує вказати рядок підключення. Її можна ввести вручну, або сформувати, для чого потрібно натиснути кнопку «…».

      Як драйвер у нашому конкретному випадку виберемо «SQL Server»

      Заповнимо основні параметри підключення до SQL. Ім'я сервера можна вписати або вибрати зі списку.

      1С здійснить з'єднання з SQL і запропонує вибрати зі списку конкретну базу даних.

      Після цього 1С відобразить список таблиць у цій базі даних та їх колонок. Потрібно вибрати галочками необхідні таблиці.

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

      Ось приклад доданої таблиці:

      Ось приклад доданої колонки:

      Щоб платформа 1С працювала із зовнішньою таблицею також, як вона робить із довідниками 1С, у таблиці можна вказати додаткові параметри:

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

      2. Перегляд

      З'єднання з віддаленою базою не здійснюється автоматично. Щоб підключитись, потрібно вибрати типове меню .

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

      Спочатку потрібно зазначити параметри з'єднання з базою.

      Коли ви робили налаштування в конфігураторі, він в результаті показав рядок з'єднання. Ви можете повторно побачити її, ще раз натиснувши Додати таблицю в конфігураторі.

      Скопіюйте рядок з'єднання та вкажіть його у режимі 1С Підприємство.

      Після цього необхідно здійснити власне підключення.

      Після того, як здійснено підключення, можна працювати зі списками.

      3. Використання у мові 1С

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

      Параметри підключення вказуються так:
      ПараметриЗ'єднання = ЗовнішніДжерелаДаних.Ім'яДжерелаКонфігураторі.Отримати ЗагальніПараметриЗ'єднання();

      Параметри З'єднання. Аутентифікація Стандартна = Істина;
      Параметри З'єднання. Ім'я Користувача = «sa»;
      ПараметриСполуки.Пароль = «пароль»;
      Параметри З'єднання.Рядок З'єднання = «рядок з'єднання з конфігуратора»;
      Параметри З'єднання. СУБД = «MSSQLServer»;

      ЗовнішніДжерелаДаних.Ім'яДжерелаКонфігураторе.ВстановитиЗагальніПараметриЗ'єднання(ПараметриЗ'єднання);
      ЗовнішніДжерелаДаних.Ім'яДжерелаКонфігураторі.ВстановитиПараметриЗ'єднанняКористувача(Ім'яКористувача(), Параметри);
      ЗовнішніДжерелаДаних.Ім'яДжерелаКонфігураторе.ВстановитиПараметриЗ'єднанняСеансу(Параметри);
      ЗовнішніДжерелаДаних.Ім'яДжерелаКонфігураторе.ВстановитиСполука();

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

      ВИБРАТИ
      ТаблицяЗовнішньогоДжерела.Ім'яПоля
      З
      ЗовнішнійДжерелоДаних.НашЗовнішнійДжерело.Таблиця.ТаблицяЗовнішньогоДжерела»

      Зовнішнє джерело даних 1С - робота з файлом Excel

      Спробуємо інший варіант – роботу із файлом Excel через зовнішнє джерело даних 1С.

      Створимо найпростіший файл Excel.

      Додамо зовнішнє джерело, назвемо довільно Файл Excel. До нього додамо таблицю «Лист1$». Як неважко помітити – це ім'я аркуша Excel з додаванням символу «$».

      Як і у випадку із SQL, додамо колонки. Їх можна додати вручну. Важливо стежити за відповідністю типів колонок, що додаються, інакше пізніше можна отримати помилку виду «Невідповідність типів даних».

      Для колонки потрібно вказувати ім'я 1С та ім'я в джерелі даних.

      Для Excel існує особливість (помилка виду «Занадто мало параметрів. Потрібно 3»):

      • Якщо у першому рядку таблиці Excel розташовані назви колонок, потрібно вказувати просто ім'я цієї колонки, наприклад «Код».
      • Інакше потрібно вказувати повне ім'я з ім'ям таблиці "Лист1$.Код", але в параметрах додати "HDR = NO;".

      Параметри з'єднання для файлу Excel виглядають так:

      • Файли XLSX (версія Office 2007 та вище)
        Driver=(Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb));DBQ=D:\ФайлExcel.xlsx;
      • Файли XLS (раніше)
        Driver=(Microsoft Excel Driver (*.xls)); DriverID=790; DBQ=D:\ФайлExcel.xls;
        Ім'я та шлях до файлу потрібно вказати власні.

Чому ця можливість викликає такий інтерес? Будь-яка людина, яка програмувала в 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 * від 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 версії програми 1С розробники додали у функціонал можливість підключення сторонніх баз даних та отримання інформації з них безпосередньо з конфігуратора, без використання COM з'єднань та OLE об'єктів. Ця можливість реалізована за допомогою нового об'єкта – «Зовнішніх джерел даних»

Зовнішні джерела даних у 1С можна використовувати як і, як та інші таблиці системы:

  1. При створенні звітів та розрахунків за допомогою системи компонування даних (СКД);
  2. Для отримання посилань на інформацію, що зберігається у сторонніх джерелах;
  3. Для зміни даних, що зберігаються в таблицях;
  4. Під час формування запитів.

Важливо знати, що цей механізм не розрахований на роботу з іншими базами даних 1С, оскільки сама модель функціонування «1С.Підприємства» не передбачає втручання у дані на рівні фізичних таблиць.

Створення нового джерела

Додавання нового зовнішнього джерела до програми відбувається у режимі «Конфігуратора». У дереві конфігурації є відповідна гілка (Рис.1)

Попітніти при створенні нового джерела доведеться, незважаючи на те, що форма нового об'єкта має лише чотири закладки:

  1. Основні;
  2. Дані;
  3. функції;
  4. Права.

Перша закладка має лише один цікавий параметр – режим керування блокуванням. Якщо не запитувати про блокування даних у транзакціях, про тонкощі розпаралелювання інформаційних потоків можна залишити цей параметр у режимі автоматичного блокування. Однак подібний підхід може призвести до появи надмірних обмежень (наприклад, коли замість окремого запису програма заблокує всю фізичну таблицю, позбавивши інших користувачів можливості роботи з нею).

Керовані блокування, на відміну від автоматичних, використовують механізм транзакцій, закладений у самій програмі, а не в СУБД, що дозволяє перевести захоплення таблиць на набагато нижчий рівень.

Встановивши в цьому параметрі значення «Автоматичний та керований», ми надаємо системі можливість визначити, який режим використовувати, звернувшись безпосередньо до аналогічної властивості кожної конкретної таблиці.

Закладка «Дані» форми властивостей зовнішнього джерела

Форму закладки «Дані» представлено на Мал. 2

Мал. 2

Тут ми можемо додати таблиці зовнішнього джерела та куби. Додавати таблицю можна двома способами:

  1. Вручну тоді перед нами відкриється форма додавання таблиці (Рис. 3);

Мал. 3

  1. Або вибрати зі списку фізичних таблиць джерела (Рис. 4), у разі перед нами відкривається спеціальний конструктор.

Мал. 4

Розглянемо докладніше форму додавання таблиці. Властивість «Ім'я» служить для однозначної ідентифікації об'єкта конфігурації.

Зіставлення об'єкта метаданих та кінцевої фізичної таблиці відбувається через властивість «Ім'я в джерелі даних», розташованому на закладці «Додатково» (Рис. 5)

Мал. 5

Далі ми маємо визначити тип таблиці, точніше її об'єктність. Якщо дані, що зберігаються у структурі, можна однозначно ідентифікувати через якесь одне поле, таблиця – може бути об'єктною. Якщо індивідуальність запису визначається набором ключових полів, таблиця повинна мати необ'єктний тип.

Порівнюючи такі таблиці з іншими об'єктами метаданих, можна навести таку аналогію:

  • Об'єктні таблиці – це довідники;
  • Необ'єктні – це регістри відомостей.

Набір ключових полів визначається наступним параметром форми («Поля ключа»). Це поле обов'язково заповнити, якщо залишити його порожнім, збереження конфігурації завершиться помилкою.

Як видно з Рис.5, деякі поля та кнопки форми недоступні для зміни:

  • Вираз у джерелі даних;
  • Тип даних таблиці;
  • Поле уявлення;
  • Обробники подання.

Їх можна буде використовувати лише після того, як ми заповнимо поля таблиці, визначивши їх тип та задавши їм ідентифікатори (Рис. 6).

Мал. 6

Тут слід звернути увагу на параметр «Дозволити Null», якщо цей прапорець встановлений, таке поле небажано використовувати як ключ.

Конструктор таблиць

Мабуть, найважливішим та цікавим моментом у роботі із зовнішніми джерелами є створення рядка підключення. Її конструктор відкривається, якщо натиснути кнопку з трьома точками у параметра Рядок з'єднання.

Насамперед нам запропонують визначитися з драйвером, який використовуватиметься для підключення (Рис. 7)

Мал. 7

Неправильне визначення цього параметра не дозволить підключитись до сторонньої інформаційної бази. Також слід розуміти, що не всі вказані у списку драйвера, що випадає, можуть бути використані для автоматичного формування рядка з'єднання. Якщо платформа видала помилку (Рис. 8), рядок з'єднання доведеться прописувати вручну.

Рис.8

Мал. 9

Сам рядок є жорстко регламентованою конструкцією.

Приклад рядка підключення

Розглянемо сторонню базу даних, створену в Microsoft Access і розташовану в корені диска D. Для підключення цієї бази ми повинні використовувати відповідний драйвер, але його вибір у конструкторі рядка призводить до появи помилки.

Самостійно пропишемо параметри підключення.

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, записавши цей параметр, отримаємо доступ до внутрішніх структур цієї бази.

Для об'єкта "Зовнішнє джерело" мало просто створити його в конфігурації, його ще треба підключити і в режимі "Підприємства". Це можна зробити з меню "Всі функції"->Зовнішні джерела. При першому вході в нашу таблицю нам треба прописати той самий рядок з'єднання вже в режимі «Підприємства».

Реліз 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 * від 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С виглядає якось половинчасто. Я ще не визначився, чим зручніше користуватися. Ви вирішуйте і пишіть про ваші рішення, і що вас до них підштовхнуло.

[необхідно зареєструватися для перегляду посилання]