1c modul recordset sumber data eksternal. Sumber data eksternal. Hanya dapat digunakan dalam koneksi SKD

23.04.2020 USB flash drive

Mengapa kesempatan ini begitu menarik? Setiap orang yang telah memprogram dalam 1C cukup akrab dengan SQL dan setidaknya secara umum akrab dengan arsitektur dan prinsip-prinsip pengembangan platform teknologi lain untuk aplikasi bisnis akan memberi tahu Anda dengan pasti apa yang paling dia sukai di 1C. Tentu saja, pembuat kueri adalah mekanisme yang paling nyaman dan bijaksana untuk menulis kueri untuk memperoleh data dari struktur relasional yang pernah saya temui secara pribadi. Dan sekarang 1C telah memberi kami kesempatan luar biasa untuk menggunakannya tidak hanya dengan 1C, tetapi juga dengan tabel lainnya. Berikut adalah sekelompok "lalat dalam salep" yang dituangkan ke dalam "tong madu" ini. Semuanya berurutan:

1) Pengaturan dan penggunaan- tanpa "menari dengan rebana" tidak akan berfungsi
a) Tambahkan sumber luar data - seperti tidak ada yang rumit
b) centang kotak "Pilih dari daftar" - perlu - ini perlu untuk memeriksa kinerja di awal dan menyelamatkan Anda dari masalah yang tidak perlu
c) - pastikan untuk menekan "..." - koneksi ODBC. Bukan OLEDB seperti yang biasa kita semua lakukan, tetapi satu tingkat lebih rendah

D) Berhati-hatilah di sini.

Ini adalah driver ODBC - jika Anda menggunakan versi client-server, itu harus di server. Jika Anda mengembangkan pada satu sistem dan mengerjakan yang lain (seperti biasanya), pastikan Anda tidak mendapatkan kejutan apa pun. Rekomendasi yang aneh, tetapi pilih driver tertua atau paling umum jika Anda tidak terlalu peduli dengan kecepatan dan Anda tidak bermaksud melampaui batas standar SQL92. Ini akan memberi Anda kompatibilitas terbaik. Misalnya untuk SQL Server 2008 pengemudi terbaik akan ada SQL Server Native Client 11, tetapi saya sarankan memilih hanya SQL Server, jika tidak, klien yang sangat asli ini harus diinstal baik di server atau di semua mesin klien (dalam hal menggunakan versi file), dan itu akan tidak memberikan banyak keuntungan untuk tugas-tugas sederhana.
e) Dialog pemilihan Server Standar

E) Saya sarankan menjawab "ya" untuk pertanyaan menyimpan kata sandi, jika tidak maka tidak akan berhasil untuk memulai bisnis ini.
g) Pilih tabel dan detailnya... peluang bagus - Anda dapat segera mengganti namanya sesuka Anda (dan detailnya juga), sementara di properti Anda akan melihat nama bidang sumber data

H) Dan sekarang Anda menjalankan, buka desainer kueri - Anda dengan bodohnya memilih semua catatan dari tabel dan OPA - kesalahan. Apa yang harus dilakukan? Jika Anda memiliki antarmuka terkelola, lihat di menu layanan, dan jika Anda memiliki antarmuka normal...
Saya pribadi menggunakan kode ini:
Kode 1C v 8.x Parameter = ExternalDataSources.DAX.GetCommonConnectionParameters();
Parameters.AuthenticationStandard = true;
Parameters.UserName = "sa";
Parameter.Password = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=database";
Parameters.DBMS = "MSSQLServer";

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameter);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parameter);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameter);

ExternalDataSources.DAX.SetConnection();
Mungkin beberapa bagian tidak diperlukan, tetapi berhasil.
Anda perlu mengeksekusi kode SEKALI. Setelah itu, itu akan terhubung secara normal ... mistisisme tentu saja - mengapa itu perlu tidak jelas ...

2) Sumber data hanya baca- Ya, keajaiban tidak terjadi ... tetapi terkadang Anda ingin ....

3) JANGAN GUNAKAN BERSAMA DENGAN SUMBER DATA INTERNAL
Secara pribadi, fakta ini membunuh saya di tempat.

Gimana nih.... tunggu apa lagi mereka udah bayangin dan jilat gimana kita sekarang dalam satu request gabungin data kita dengan 1C, putar balik - kelompokkan, masukkan ke report, tapi gak ada.. .
Tapi tentu saja, ini tidak menghentikan orang yang berpengalaman ... pikiran apa yang muncul di benak? Itu benar - tabel sementara:

4) JANGAN GUNAKAN BERSAMA DENGAN TABEL SEMENTARA

Tapi ini tidak lagi terlihat seperti kesulitan teknologi, tetapi sangat mirip dengan apa yang mereka ingin kita lakukan "agar hidup tidak tampak seperti surga" :).

5) Hanya dapat digunakan di koneksi SKD
Bagi yang belum tahu, ada di ACS pada tab "Dataset Links". Seberapa sering Anda menggunakannya? Nyaman? Rupanya mereka ingin memaksa kita untuk menggunakannya lebih sering. Tetapi ada kolom "Kondisi tautan" dan "Parameter tautan". Tidak ada konfigurasi tipikal Saya tidak menemukan contoh penggunaannya, dalam dokumentasi dan di Khrustaleva juga, entah bagaimana semuanya tidak transparan. Adakah yang bisa menjelaskan kepada saya bagaimana "kondisi tautan" bekerja. Jika Anda menulis SourceAttribute = ReceiverRevision di sana, itu tidak berfungsi. Tentu saja, kondisinya dapat ditulis di bidang "Ekspresi" - dalam banyak kasus ini sudah cukup ... tetapi entah bagaimana itu tidak terlalu mudah.

Secara total, masalah ini sebelumnya diselesaikan di suatu tempat seperti ini:
Kode 1C v 8.x Fungsi InitializeDataSource()

DateStart = BuilderSettings.Settings.DataParameters.Items.Value;
DateCon = BuilderSettings.Settings.DataParameters.Items.Value;
Jika DateCon > "20100101" Lalu
DateCon = "20100101";
Berakhir jika;

QN = NewQualifiersNumber(15,2);
cs = NewStringQualifiers(255);

ArrayNumber = Array Baru();
ArrayNumber.Add(Type("Nomor"));

ArrayString = Array Baru();
ArrayString.Add(Tipe("String"));

ArrayData = Array Baru();
ArrayDate.Add(Tipe("Tanggal"));

//Kami akan mengisi biaya akuntansi di tabel
TypeNumber = NewTypeDescription(ArrayNumber,KN);
StringType = NewTypeDescription(ArrayString, CS);
TypeDate = NewTypeDescription(ArrayDate);

//tabel untuk memuat data dari SQL
TK = Tabel Nilai Baru();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Jumlah", TypeNumber);
TK.Columns.Add("Periode", TypeDate);

TK.Indices.Add("Periode");

// Hubungkan ke SQL
ConnectionString = "Penyedia=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Sumber Data=;Gunakan Prosedur untuk Siapkan=1;Terjemahkan Otomatis=True;Ukuran Paket=4096;ID Workstation=;Gunakan Enkripsi for Data=False;Tag dengan susunan kolom bila memungkinkan=False;Katalog Awal=Laporan";
Koneksi = COMObject Baru("ADODB.Koneksi");
Command = COMObject Baru("ADODB.Command");
RecordSet = COMObject Baru("ADODB.RecordSet");
Tanggal = "";
Percobaan
Connection.Open(ShortLP(ConnectionString));
Command.ActiveConnection = Koneksi;
Command.CommandText = "S_elect * dari PH dimana titik >= "" + String(Format(DateStart, "DF=yyyyMMdd")) + "" dan titik<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Perintah.Execute();
RecordSet.MoveFirst();
Pengecualian
Pengembalian TK;
Akhir Upaya;

Sementara RecordSet.EOF = False Loop
String = TK.Tambah();
String.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Nilai;
String.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Nilai;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Nilai;
RecordSet.MoveNext();
Siklus Akhir;

Permintaan = Permintaan Baru();
VrTable = NewTempTableManager();
Query.SetParameter("vDataTable", TK);
Query.SetParameter("TanggalMulai",TanggalMulai);
Query.SetParameter("DateCon", DateCon);
Query.Teks = "PILIH
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Periode
|PUT DataTable
| DARI
| &vrDataTable SEBAGAI vrDataTable
| DIMANA
| vrDataTable.Period >= &TanggalMulai
| Dan vrDataTable.Period<= &ДатаКон";
Permintaan.Jalankan();
TK = Tidak ditentukan;

Permintaan = Permintaan Baru;
Query.TempTableManager = VrTable;
Query.Text = "Ini adalah query yang melibatkan tabel temp";

Hasil = Permintaan.Jalankan();
Hasil Pengembalian;

Fungsi Akhir

OuterSet = InisialisasiDataSource();
DataSet = Struktur Baru();
DataSet.Insert("Tabel SQL", ExternalSet);
GenericReports.Generate GenericReport(Objek Ini, Hasil, Data Dekripsi, OutputToReportForm,Dataset);

Sebenarnya, tidak banyak baris kode dan cukup standar ... dalam hal ini, Anda dapat menggunakan fungsionalitas penuh dari pembuat kueri, dan hanya memberikan fungsi KOMPOSISI DATA di ACS

Tapi, tentu saja, itu terlihat sedikit tidak begitu indah ... dan mengunggah ke tabel nilai setiap kali Anda perlu menulis kode dan memeriksa apakah Anda membuat kesalahan dalam nama detailnya ... jika tidak, apa yang kami berikan di 1C terlihat setengah hati. Saya belum memutuskan mana yang lebih nyaman untuk digunakan. Anda memutuskan, dan menulis tentang keputusan Anda dan apa yang mendorong Anda untuk membuatnya.

Informasi diambil dari situs

Pada platform versi 8.3.5.1068 (dan yang lebih baru), menjadi mungkin untuk menambah, mengubah, dan menghapus data di sumber eksternal menggunakan perangkat lunak 1C. Contoh fitur ini disajikan dalam artikel ini.

Untuk memungkinkan perekaman ke sumber eksternal, 1C telah menambahkan properti baru ke tabel data dan bidang sumber eksternal:

  • Untuk seluruh tabel - properti Hanya membaca. Hanya Baca = Benar berarti bahwa mengubah data dalam tabel ini tidak mungkin;
  • Untuk bidang tabel individual - properti Hanya membaca, IzinkanNull dan Isi nilai:
    • Hanya Baca = Benar berarti bahwa mengubah data di bidang ini tidak mungkin;
    • AllowNull = Benar berarti nilai dapat ditulis ke bidang ini BATAL;
    • Isi nilai berisi nilai default bidang ini (jika ada).

Anda (saat menjelaskan tabel secara manual) atau platform (saat membuat tabel dengan desainer) dapat menggunakan properti ini dengan cara berikut.

  • Hanya Baca = Benar set, misalnya, untuk tampilan (view), tabel yang diperoleh berdasarkan ekspresi (hasil fungsi) dan sejenisnya. Data dalam tabel tersebut tidak dapat diubah;
  • Hanya Baca = Benar tentukan untuk bidang yang diatur secara otomatis ( PENINGKATAN OTOMATIS), bidang terhitung, dan sejenisnya. Data di bidang ini tidak dapat diubah;
  • AllowNull = Benar ditetapkan untuk semua bidang, kecuali bidang utama, dan bidang yang dijelaskan dalam sumber eksternal sebagai BUKAN NULL;
  • Isi nilai bidang yang akan ditetapkan jika nilai standar bidang ini ditentukan di sumber eksternal (nilai BAWAAN).

Anda dapat menambahkan, mengubah, dan menghapus data di sumber eksternal menggunakan bahasa bawaan atau secara interaktif. Dalam bahasa bawaan, metode pengelola tabel berikut digunakan untuk ini:

  • Buat RecordSet()- untuk tabel non-objek;
  • Metode baru BuatObjek()- untuk tabel objek.

Dengan demikian, objek ExternalDataSourceTableRecordSet dan ExternalDataSourceTableObject metode baru muncul Menulis() dan Menghapus().

Menambahkan data

Saat Anda menambahkan data ke sumber eksternal, Anda membuat objek (atau kumpulan rekaman), mengatur nilai bidang, dan menulis. Namun, ada beberapa fitur yang berguna untuk diketahui.

Misalnya, ketika mencoba mengatur nilai bidang yang memiliki Hanya Baca = Benar, kesalahan akan dilemparkan. Dan saat menulis langsung ke database dalam ekspresi MEMASUKKAN bidang seperti itu akan dilewati. Bidang lainnya diisi dengan nilai yang Anda tetapkan. Oleh karena itu, nilai-nilai Batal dan nilai default harus ditetapkan ke bidang secara eksplisit.

  • Indo(AllowNull = Benar);
  • nama(AllowNull = Benar);
mCharacteristic = ExternalDataSources.IM.Tables.shop_feature.CreateObject(); mCharacteristic.id = Kode; mCharacteristic.name = Nama; mKarakteristik.Tulis();

Eksekusi pernyataan Menulis() akan menyebabkan event handler dipanggil terlebih dahulu Sebelum Merekam, maka penulisan fisik dibuat ke tabel sumber eksternal ( MEMASUKKAN), maka event handler akan dipanggil Saat Merekam.

Dengan bidang kunci dari tabel sumber eksternal, Anda dapat melakukan hal berikut. Jika bidang kunci dapat diedit, maka Anda "secara manual" mengatur nilainya sebelum menulis. Jika mengubah bidang kunci dilarang, maka platform akan secara mandiri mendapatkan kunci di MEMASUKKAN atau segera setelahnya. Anda dapat campur tangan dalam proses ini dengan metode SetReferensiBaru() sebelum rekaman fisik (di event handler Sebelum Merekam) atau langsung setelah entri fisik (di event handler Saat Merekam).

Ubah data

Saat data diubah, nilai semua bidang tabel yang ada Hanya Baca = Salah.

MFeature = ExternalDataSources.IM.Tables.shop_feature.FindByField("id",kode); mObject = mCharacteristic.GetObject(); mObject.name = Nama; mObject.Write();

Jika hanya perlu merekam beberapa bidang, Anda dapat menentukan daftarnya langsung dari bahasa bawaan menggunakan metode SetWritableFields() dan GetWritableFields().

Menghapus data

Menghapus data secara langsung menghapus baris dari tabel database. Pada saat yang sama, referensi ke objek yang dihapus tidak dicari. Jika fungsi tersebut diperlukan, Anda dapat memprogramnya sendiri di event handler SebelumHapus().

MFeature = ExternalDataSources.IM.Tables.shop_feature.FindByField("id",Kode); mObject = mCharacteristic.GetObject(); mObject.Hapus();

Transaksi

Membaca data dari sumber eksternal, seperti sebelumnya, dilakukan di luar transaksi, dan saat menulis, platform membuka transaksi implisit. Pada saat yang sama, Anda dapat melakukan membaca dan menulis dalam transaksi eksplisit menggunakan metode objek ExternalDataSourceManager:

  • MulaiTransaksi();
  • KomitTransaksi();
  • BatalkanTransaksi().

Kunci

  • Mobil;
  • Dikelola;
  • Otomatis dan terkontrol.

serta properti tabel sumber eksternal Transaksi Level Isolasi:

Selain itu, Anda dapat secara mandiri mengatur tingkat kunci dalam metode ini MulaiTransaksi().

Saya melengkapi artikel tipikal dengan contoh) Akan ada lebih banyak waktu - saya akan menambahkan lebih banyak contoh.

Mengapa kesempatan ini begitu menarik? Setiap orang yang telah memprogram dalam 1C cukup akrab dengan SQL dan setidaknya secara umum akrab dengan arsitektur dan prinsip-prinsip pengembangan platform teknologi lain untuk aplikasi bisnis akan memberi tahu Anda dengan pasti apa yang paling dia sukai di 1C. Tentu saja, pembuat kueri adalah mekanisme yang paling nyaman dan bijaksana untuk menulis kueri untuk memperoleh data dari struktur relasional yang pernah saya temui secara pribadi. Dan sekarang 1C telah memberi kami kesempatan luar biasa untuk menggunakannya tidak hanya dengan 1C, tetapi juga dengan tabel lainnya. Berikut adalah sekelompok "lalat dalam salep" yang dituangkan ke dalam "tong madu" ini. Semuanya berurutan:

1) Pengaturan dan penggunaan- tanpa "menari dengan rebana" tidak akan berfungsi
a) Tambahkan sumber data eksternal - sepertinya tidak ada yang rumit
b) centang kotak "Pilih dari daftar" - perlu - ini perlu untuk memeriksa kinerja di awal dan menyelamatkan Anda dari masalah yang tidak perlu
c) - pastikan untuk menekan "..." - koneksi ODBC. Bukan OLEDB seperti yang biasa kita semua lakukan, tetapi satu tingkat lebih rendah

D) Berhati-hatilah di sini.

Ini adalah driver ODBC - jika Anda menggunakan versi client-server, itu harus di server. Jika Anda mengembangkan pada satu sistem dan mengerjakan yang lain (seperti biasanya), pastikan Anda tidak mendapatkan kejutan apa pun. Rekomendasi yang aneh, tetapi pilih driver tertua atau paling umum jika Anda tidak terlalu peduli dengan kecepatan dan Anda tidak bermaksud melampaui batas standar SQL92. Ini akan memberi Anda kompatibilitas terbaik. Misalnya, untuk SQL Server 2008, driver terbaik adalah SQL Server Native Client 11, tetapi saya sarankan memilih hanya SQL Server, jika tidak, klien yang sangat asli ini harus diinstal baik di server atau di semua mesin klien (dalam kasus ini menggunakan versi file), dan keuntungannya khusus untuk yang sederhana dia tidak akan memberi Anda pekerjaan.
e) Dialog pemilihan Server Standar

dan DB

f) Saya sarankan menjawab "ya" untuk pertanyaan menyimpan kata sandi, jika tidak maka tidak akan berhasil untuk memulai bisnis ini.
g) Pilih tabel dan detailnya... peluang bagus - Anda dapat segera mengganti namanya sesuka Anda (dan detailnya juga), sementara di properti Anda akan melihat nama bidang sumber data


h) Dan sekarang Anda menjalankan, buka perancang kueri - Anda dengan bodohnya memilih semua catatan dari tabel dan OPA - kesalahan. Apa yang harus dilakukan? Jika Anda memiliki antarmuka terkelola, lihat di menu layanan, dan jika Anda memiliki antarmuka normal...
Saya pribadi menggunakan kode ini:
Kode 1C v 8.x Parameter = ExternalDataSources.DAX.GetCommonConnectionParameters();
Parameters.AuthenticationStandard = true;
Parameters.UserName = "sa";
Parameters.Password = "pas";
Parameters.ConnectionString = "DRIVER=(SQL Server);SERVER=servet;UID=sa;PWD=;DATABASE=database";
Parameters.DBMS = "MSSQLServer";

ExternalDataSources.DAX.SetCommonConnectionParameters(Parameter);
ExternalDataSources.DAX.SetUserConnectionParameters(UserName(), Parameter);
ExternalDataSources.DAX.SetSessionConnectionParameters(Parameter);

ExternalDataSources.DAX.SetConnection();
Mungkin beberapa bagian tidak diperlukan, tetapi berhasil.
Anda perlu mengeksekusi kode SEKALI. Setelah itu, itu akan terhubung secara normal ... mistisisme tentu saja - mengapa itu perlu tidak jelas ...

2) Sumber data hanya baca- Ya, keajaiban tidak terjadi ... tetapi terkadang Anda ingin ....

3) JANGAN GUNAKAN BERSAMA DENGAN SUMBER DATA INTERNAL
Secara pribadi, fakta ini membunuh saya di tempat.

Gimana nih.... tunggu apa lagi mereka udah bayangin dan jilat gimana kita sekarang dalam satu request gabungin data kita dengan 1C, putar balik - kelompokkan, masukkan ke report, tapi gak ada.. .
Tapi tentu saja, ini tidak menghentikan orang yang berpengalaman ... pikiran apa yang muncul di benak? Itu benar - tabel sementara:

4) JANGAN GUNAKAN BERSAMA DENGAN TABEL SEMENTARA


Tapi ini tidak lagi terlihat seperti kesulitan teknologi, tetapi sangat mirip dengan apa yang mereka ingin kita lakukan "agar hidup tidak tampak seperti surga".

5) Hanya dapat digunakan di koneksi SKD
Bagi yang belum tahu, ada di ACS pada tab "Dataset Links". Seberapa sering Anda menggunakannya? Nyaman? Rupanya mereka ingin memaksa kita untuk menggunakannya lebih sering. Tetapi ada kolom "Kondisi tautan" dan "Parameter tautan". Saya tidak menemukan contoh penggunaannya dalam konfigurasi khas apa pun, dalam dokumentasi dan di Khrustaleva juga, entah bagaimana semuanya tidak transparan. Adakah yang bisa menjelaskan kepada saya bagaimana "kondisi tautan" bekerja. Jika Anda menulis SourceAttribute = ReceiverRevision di sana, itu tidak berfungsi. Tentu saja, kondisinya dapat ditulis di bidang "Ekspresi" - dalam banyak kasus ini sudah cukup ... tetapi entah bagaimana itu tidak terlalu mudah.

Secara total, masalah ini sebelumnya diselesaikan di suatu tempat seperti ini:
Kode 1C v 8.x Fungsi InitializeDataSource()

DateStart = BuilderSettings.Settings.DataParameters.Items.Value;
DateCon = BuilderSettings.Settings.DataParameters.Items.Value;
Jika DateCon > "20100101" Lalu
DateCon = "20100101";
Berakhir jika;

QN = NewQualifiersNumber(15,2);
cs = NewStringQualifiers(255);

ArrayNumber = Array Baru();
ArrayNumber.Add(Type("Nomor"));

ArrayString = Array Baru();
ArrayString.Add(Tipe("String"));

ArrayData = Array Baru();
ArrayDate.Add(Tipe("Tanggal"));

//Kami akan mengisi biaya akuntansi di tabel
TypeNumber = NewTypeDescription(ArrayNumber,KN);
StringType = NewTypeDescription(ArrayString, CS);
TypeDate = NewTypeDescription(ArrayDate);

//tabel untuk memuat data dari SQL
TK = Tabel Nilai Baru();
TK.Columns.Add("NomenclatureCode", TypeString);
TK.Columns.Add("Jumlah", TypeNumber);
TK.Columns.Add("Periode", TypeDate);

TK.Indices.Add("Periode");

// Hubungkan ke SQL
ConnectionString = "Penyedia=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Sumber Data=;Gunakan Prosedur untuk Siapkan=1;Terjemahkan Otomatis=True;Ukuran Paket=4096;ID Workstation=;Gunakan Enkripsi for Data=False;Tag dengan susunan kolom bila memungkinkan=False;Katalog Awal=Laporan";
Koneksi = COMObject Baru("ADODB.Koneksi");
Command = COMObject Baru("ADODB.Command");
RecordSet = COMObject Baru("ADODB.RecordSet");
Tanggal = "";
Percobaan
Connection.Open(ShortLP(ConnectionString));
Command.ActiveConnection = Koneksi;
Command.CommandText = "S_elect * dari PH di mana titik >= "" + String(Format(DateStart, "DF=yyyyMMdd")) + "" dan titik<= "" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + """;
RecordSet = Perintah.Execute();
RecordSet.MoveFirst();
Pengecualian
Pengembalian TK;
Akhir Upaya;

Sementara RecordSet.EOF = False Loop
String = TK.Tambah();
String.NomenclatureCode = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Nilai;
String.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Nilai;
Row.Period = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Nilai;
RecordSet.MoveNext();
Siklus Akhir;

Permintaan = Permintaan Baru();
VrTable = NewTempTableManager();

Query.SetParameter("vDataTable", TK);
Query.SetParameter("TanggalMulai",TanggalMulai);
Query.SetParameter("DateCon", DateCon);
Query.Teks = "PILIH
| vrDataTable.NomenclatureCode,
| vrDataTable.Qnty,
| vrDataTable.Periode
|PUT DataTable
| DARI
| &vrDataTable SEBAGAI vrDataTable
| DIMANA
| vrDataTable.Period >= &TanggalMulai
| Dan vrDataTable.Period<= &ДатаКон";
Permintaan.Jalankan();
TK = Tidak ditentukan;

Permintaan = Permintaan Baru;
Query.TempTableManager = VrTable;
Query.Text = "Ini adalah query yang melibatkan tabel temp";

Hasil = Permintaan.Jalankan();
Hasil Pengembalian;

Fungsi Akhir

OuterSet = InisialisasiDataSource();
DataSet = Struktur Baru();
DataSet.Insert("Tabel SQL", ExternalSet);
GenericReports.Generate GenericReport(Objek Ini, Hasil, Data Dekripsi, OutputToReportForm,DataSet);

Sebenarnya, tidak banyak baris kode dan cukup standar ... dalam hal ini, Anda dapat menggunakan fungsionalitas penuh dari pembuat kueri, dan hanya memberikan fungsi KOMPOSISI DATA di ACS

Tapi, tentu saja, itu terlihat sedikit tidak begitu indah ... dan mengunggah ke tabel nilai setiap kali Anda perlu menulis kode dan memeriksa apakah Anda membuat kesalahan dalam nama detailnya ... jika tidak, apa yang kami berikan di 1C terlihat setengah hati. Saya belum memutuskan mana yang lebih nyaman untuk digunakan. Anda memutuskan, dan menulis tentang keputusan Anda dan apa yang mendorong Anda untuk membuatnya.
Pengarang.

Mulai dari versi 8.3.5, platform mengimplementasikan kemampuan untuk menulis data ke tabel sumber data eksternal. Artikel mempertimbangkan fungsi ini, yang memperluas kemungkinan yang ada untuk mengintegrasikan konfigurasi dengan sistem pihak ketiga.

Penerapan

Artikel ini membahas platform 1C 8.3.5. Materi juga relevan untuk rilis platform saat ini.

Menulis ke sumber data eksternal di 1C:Enterprise 8

Di platform 8.2.14, objek baru ditambahkan ke pohon metadata - sumber data eksternal. Tujuan dari mekanisme ini adalah untuk mendapatkan data dari database eksternal dalam kaitannya dengan 1C.

Dengan rilis rilis baru platform, sumber data eksternal telah berevolusi, misalnya, menjadi mungkin untuk menempatkannya di tabel sementara, melakukan penggabungan dengan tabel biasa.

Dalam artikel ini, kita akan melihat alat apa yang dimiliki pengembang untuk menulis ke sumber data eksternal.

Semua tindakan dilakukan pada DBMS Microsoft SQL Server 2008 R2.

Di platform 8.3.4, kemampuan untuk menggunakan fungsi yang dijelaskan dalam sumber data eksternal diimplementasikan.

Fitur ini memungkinkan Anda untuk menjalankan prosedur tersimpan di sisi SQL Server, dan dengan bantuannya mengakses data dari sumber eksternal, termasuk untuk menulis.

Mari kita ambil contoh. Mari kita buat database baru dengan nama kursy_test menggunakan SQL Management Studio. Semua percobaan lebih lanjut akan dilakukan di atasnya.

Pada database ini kita akan membuat tabel nomenklatura, untuk itu kita akan menulis script dengan isi sebagai berikut :

GUNAKAN [kursy_test]
PERGILAH
BUAT TABEL [dbo]. [nomenklatur](
[ id ] [ int ] TIDAK NULL ,
[ deskripsi ] [ nvarchar ](150 ) TIDAK NULL ,
[ harga ] [ numerik ](15 , 2 ) NULL ,
CONSTRAINT [ PK_id ] PRIMARY KEY ([ id ])
PERGILAH

Sebagai hasil dari eksekusi, tabel struktur berikut akan dibuat:

Sekarang kita perlu membuat dua prosedur tersimpan yang akan digunakan untuk memodifikasi data.

Mari kita panggil prosedur pertama insert_nomenklatura. Ini akan dirancang untuk menambahkan baris baru ke tabel. Script untuk membuatnya akan terlihat seperti ini:

GUNAKAN [kursy_test]
PERGILAH
BUAT PROSEDUR insert_nomenklatura
@id int ,
@deskripsi nvarchar(150 ),
@pricenumeric (15 , 2 )
SEBAGAI
MULAI
MASUKKAN KE [kursy_test].dbo. [ nomenklatura ] ([ id ], [ deskripsi ] ,[ harga ])
NILAI (@id , @deskripsi , @harga )
AKHIR
PERGILAH

Prosedur kedua, bernama update_nomenklatura, akan memperbarui record yang sudah ada di tabel. Untuk membuatnya, skrip berikut dijalankan:

Di Object Browser, tabel yang dihasilkan dan dua prosedur tersimpan terlihat seperti ini:

Kami telah menyelesaikan semua langkah persiapan di sisi Microsoft SQL Server, sekarang kita akan ke konfigurator 1C:Enterprise 8.

Kami membuat sumber data eksternal baru bernama Nomenklatura. Saat membuat tabel baru di sumber data ini, kami menentukan parameter berikut untuk menghubungkan ke sumber data:

String koneksi adalah sebagai berikut:

Driver = (SQL Server); Server =(lokal ); Basis data = cursy_test ; Id Pengguna = sa ; kata sandi =;

Jika pengguna sa memiliki kata sandi, itu harus ditentukan dalam parameter Kata Sandi dari string koneksi.

Jika semua parameter koneksi ditentukan dengan benar, saat Anda mengklik OK, sebuah jendela akan terbuka berisi tabel yang tersedia di sumber data:

Kami menandai bidang yang menarik bagi kami di tabel. Saat Anda menekan tombol Siap tabel dbo_nomenklatura akan dibuat di sumber data eksternal Nomenklatura:

Sekarang kita beralih ke tab “Fungsi” dari sumber data kita.

Menggunakan wizard serupa, kami menambahkan dua prosedur tersimpan:

Kami mendapatkan tampilan tab "Fungsi" berikut:

Sekarang mari kita program antarmuka pengguna untuk bekerja dengan sumber data eksternal.

Dalam bentuk daftar di panel perintah, letakkan tombol "Tambah" dengan handler berikut:

&PadaKlien
Tambahkan() prosedur
waspada = baru DeskripsiAlerts(“BukaTabelSelesai”, Objek Ini );
Formulir Terbuka (
“ExternalDataSource.Nomenklatura.Table.dbo_nomenklatura.ObjectForm”
, , , , , ,
Peringatan, FormWindowOpenModeForm.LockAllInterface);
AkhirProsedur

&PadaKlien
Prosedur Simpan (Perintah)
SimpanDiServer();
Prosedur Akhir &Di Server
Prosedur SimpanDiServer()
Jika sebuah Objek.Referensi.Kosong() Kemudian
ExternalDataSources.Nomenklatura.dbo_insert_nomenklatura
Jika tidak
ExternalDataSources.Nomenklatura.dbo_update_nomenklatura
(Object.id , Object.description , Object.price );
Berakhir jika ;
AkhirProsedur

Dalam mode perusahaan, formulir daftar terlihat seperti ini:

Bentuk benda tersebut dapat dilihat di bawah ini:

Klik pada gambar untuk memperbesar.

Jadi, dengan menggunakan prosedur tersimpan, kami telah menerapkan penulisan ke sumber data eksternal.

Di platform 8.3.5, fitur baru telah muncul - menulis ke sumber data eksternal secara langsung, melewati mekanisme prosedur tersimpan yang dibahas di atas.

Data dapat diedit baik secara terprogram maupun interaktif. Dan untuk contoh kami, Anda tidak perlu menggunakan konfigurasi.

Di bilah perintah dan di menu "Lainnya", Anda dapat melihat tombol standar, seperti "Buat", "Salin", "Edit", dll.

Klik pada gambar untuk memperbesar.

Dan dalam bentuk objek, tombol "Simpan" dan "Simpan dan tutup" muncul:

Seperti yang Anda lihat, sekarang bekerja dengan sumber eksternal mirip dengan bekerja dengan direktori, dokumen, dll.

Pertimbangkan perubahan apa yang telah dibuat pada tingkat metadata untuk memungkinkan penulisan ke sumber data eksternal.

Properti baru telah ditambahkan ke tabel data Hanya membaca(tipe - boolean).

Jika properti ini disetel ke True, menulis data ke tabel ini melalui platform tidak dimungkinkan.

Bidang tabel data sekarang memiliki properti berikut:

  • Hanya membaca(tipe - boolean) – apakah mungkin untuk mengubah data di bidang ini;
  • IzinkanNull(ketik - boolean) - apakah mungkin untuk menyimpan nilai NULL di bidang ini.

Properti Hanya membaca harus disetel ke BENAR untuk bidang basis data dengan modifikasi otomatis, bidang kunci yang dibuat secara otomatis, bidang terhitung, dll.

Anda dapat menambahkan, mengubah, dan menghapus data di sumber eksternal menggunakan bahasa bawaan.

Untuk ini, objek ExternalDataSourceTableRecordSet dan ExternalDataSourceTableObject metode baru telah diterapkan Menulis() dan Menghapus().

Pertimbangkan contoh penambahan record baru secara terprogram untuk sumber data eksternal yang dibahas di atas.

&PadaKlien
Prosedur Buat Secara Terprogram(Tim )
Buat Secara Terprogram Di Server();
Prosedur Akhir &Di Server

Prosedur Buat Secara Terprogram Di Server()
Objek yang Dapat Ditulis=
ExternalDataSources.Nomenklatura.Tables.dbo_nomenklatura.CreateObject();
WritableObject.id= 5 ;
WritableObject.deskripsi= “Lemari” ;
dapat ditulisObject.price= 5000 ;
Objek yang Dapat Ditulis.Tulis();
AkhirProsedur

Dalam modul objek tabel dari sumber data eksternal, Anda sekarang dapat mengatur penangan peristiwa tulis, seperti: SebelumMenulis(), Pada catatan() dll.:

Dalam artikel ini, dua opsi untuk menulis data ke sumber data eksternal dipertimbangkan - menggunakan prosedur tersimpan dan menggunakan mekanisme baru platform 8.3.5.

Dengan demikian, platform sekarang mengimplementasikan mekanisme untuk integrasi penuh dengan aplikasi eksternal.

Dalam versi 8.3.6, fungsionalitas yang dijelaskan di atas telah diperluas dengan metode khusus baru GetChangableFields() dan SetChangableFields(). Dengan bantuan mereka, dimungkinkan untuk melakukan operasi tulis ke bidang-bidang tabel VIEW yang ditandai di konfigurator sebagai hanya-baca. Berkat ini, menjadi mungkin untuk mengimplementasikan skenario di mana penulisan ke bidang individual dari tabel VID hanya dimungkinkan dalam kasus-kasus ketika diperlukan sesuai dengan logika bisnis aplikasi.

Dalam versi 8.3.7, mekanisme telah diperbaiki yang menentukan bidang tertentu dari tabel VIEW yang dapat berisi nilai NULL. Sampai saat ini, semua tabel VIEW bisa mengambil nilai ini. Perubahan ini disebabkan oleh peningkatan kecepatan pengurutan dalam daftar dinamis menurut bidang ini.

Dalam rilis 8.3.8, akhirnya dimungkinkan untuk menentukan apakah sumber data eksternal berada dalam status transaksional. Fungsionalitas ini disediakan oleh metode baru ExternalDataSourceManager.TransactionActive()

Sebagai kesimpulan, kami mencatat bahwa untuk sumber data eksternal, seperti yang ditunjukkan di atas, tabel data dari model relasional klasik dijelaskan. Platform menggunakan paradigma yang berbeda untuk bekerja dengan data, menawarkan pengembang satu set jenis objek aplikasi tertentu (buku referensi, dokumen, register, dll.). Itulah sebabnya sistem, saat bekerja dengan tabel sumber data eksternal, tidak mendukung sebagian besar fungsi yang melekat pada objek "aslinya". Oleh karena itu, disarankan untuk tidak mengembangkan semacam logika bisnis, dengan mempertimbangkan penggunaan tabel VID, jika ini tidak terkait dengan tugas integrasi dengan sistem yang ada. Atau, sederhananya, Anda harus mencoba untuk menghindari penyimpanan data yang secara aktif digunakan dalam aplikasi Anda di beberapa tabel lain dari sistem eksternal jika tidak digunakan oleh sistem ini.

Pada artikel berikutnya, kami akan mempertimbangkan kelanjutan logis dari penggunaan teknologi sumber data eksternal dalam sistem 1C:Enterprise.