HelpF.pro

Запись во внешний источник данных из 1С 8.2

Начиная с платформы 8.2.14 в 1С появилась коллекция "Внешние источники данных". Использование объектов этой коллекции позволяет работать с внешними данными через ODBC. Стандартные механизмы платформы позволяют просматривать данные и использовать их в запросах. Тем не менее, на примере взаимодействия с SQL покажу возможность работы с внешними источниками на прямое добавление/изменение данных SQL из 1С.

Создадим для начала через консоль сервера SQL базу "test" с таблицей "assortment", строковые поля id, name, price. Сделаем ключевым поле id и внесем пару строк в таблицу. Потом создадим пустую базу 1С, в конфигураторе добавим внешний источник данных "ВнешнийSQL". На вкладке "Данные" добавим нашу таблицу. Можно ввести строку соединения, либо воспользоваться конструктором строки. В моей строке указаны явно учетная запись суперадминистратора (sa) и пароль к ней. Поскольку это сервер для тестов, вопросом безопасности можно пренебречь. Для реальной базы такого делать не стоит, либо можно завести отдельного пользователя с правами чтения/записи только на эту базу и хранить его данные.

После подключения находим в списке таблиц нашу, выбираем необходимые поля, в нашем случае все.

После добавляем формы для объекта и списка.

Если запустить нашу конфигурацию сейчас, то элементы формы списка будут открываться только на просмотр.

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

Код 1C v 8.3
 &НаСервере
Процедура ЗаписатьСервер()
 
 пСеанс = ВнешниеИсточникиДанных.ВнешнийSQL.ПолучитьОбщиеПараметрыСоединения();
 
 Если НЕ пСеанс.СУБД = "MSSQLServer" Тогда
  Возврат;
 КонецЕсли;
 
 ЗапросSQL = ?(Объект.Ссылка.Пустая(), ПолучитьЗапросДобавления(), ПолучитьЗапросОбновления());
 
 Connection  = Новый COMОбъект("ADODB.Connection");
 Command  = Новый COMОбъект("ADODB.Command");
 RecordSet  = Новый COMОбъект("ADODB.RecordSet");
 
 //учетка и пароль уже в строке подключения
 //иначе их необходимо добавить в строку
 Попытка
  Connection.Open(СокрЛП(пСеанс.СтрокаСоединения));
  Command.ActiveConnection   = Connection;
  Command.CommandText = ЗапросSQL;
  RecordSet = Command.Execute();
 Исключение
  Сообщить(ОписаниеОшибки());
 КонецПопытки;  


КонецПроцедуры // ЗаписатьСервер()


&НаСервере
Функция ПолучитьЗапросОбновления()
 
 мДанные = Объект.Ссылка.Метаданные();
 СтрокаПоля = "";
 СтрокаДанные = "";
 
 ДанныеОбъект = Объект.Ссылка.ПолучитьОбъект();
 
 Для Каждого мПоле Из мДанные.Поля Цикл
  Если Объект[мПоле.Имя] = ДанныеОбъект[мПоле.Имя] Тогда
   Продолжить;
  КонецЕсли;
  СтрокаДанные = СтрокаДанные + ?(ПустаяСтрока(СтрокаДанные), " SET ", ", ") + мПоле.Имя + "= '" + Объект[мПоле.Имя] + "'";
 КонецЦикла;
 
 //делаем UDPDATE по id, поскольку оно у нас ключевое
 ЗапросSQL = "UPDATE " + мДанные.ИмяВИсточникеДанных + СтрокаДанные + "WHERE (id = '" + ДанныеОбъект.id + "')";
 
 Возврат ЗапросSQL; 
 
КонецФункции


&НаСервере
Функция ПолучитьЗапросДобавления()
 
 мДанные = Объект.Ссылка.Метаданные();
 СтрокаПоля = "";
 СтрокаДанные = "";
 
 Для Каждого мПоле Из мДанные.Поля Цикл
  СтрокаПоля = СтрокаПоля + ?(ПустаяСтрока(СтрокаПоля), " (", ", ") + мПоле.Имя;
  СтрокаДанные = СтрокаДанные + ?(ПустаяСтрока(СтрокаДанные), " VALUES (", ", ") + "'" + Объект[мПоле.Имя] + "'";
 КонецЦикла;
 
 СтрокаПоля = СтрокаПоля + ")";
 СтрокаДанные = СтрокаДанные + ")";
 ЗапросSQL = "INSERT INTO " + мДанные.ИмяВИсточникеДанных + СтрокаПоля + СтрокаДанные;
 
 Возврат ЗапросSQL; 
 
КонецФункции


&НаКлиенте
Процедура ЗаписатьДанные(Команда)
 
 ЗаписатьСервер();
 //делаем оповещение для списка, поскольку он автоматически не обновляется
 Оповестить("ОбновитьВнешнийИсточникДанных");
 
КонецПроцедуры

Теперь в форме списка на панель вешаем команду "Добавить" и добавляем обработку оповещения.

Код 1C v 8.3
 &НаКлиенте
Процедура Добавить(Команда)


 ОткрытьФорму("ВнешнийИсточникДанных.ВнешнийSQL.Таблица.dbo_assortment.ФормаОбъекта");
 
КонецПроцедуры


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
 
 Если ИмяСобытия = "ОбновитьВнешнийИсточникДанных" Тогда
  Элементы.Список.Обновить();
 КонецЕсли;
 
КонецПроцедуры

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

Источник


Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1564.html