helpf.pro
Регистрация
 +3 
Распечатать

Запись во внешний источник данных из 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.ФормаОбъекта");
 
КонецПроцедуры


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

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

Источник

Разместил:   Версии: | 8.2 УП |  Дата:   Прочитано: 6736
 +3 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 2
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код...
1C и Google Maps 12
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во...
1C медленно работает по сети с базой на SQL Server 8
Данное обстоятельство может быть обусловлено многими причинами. Одна из них - неоптимальная настройка MS SQL . Перечислим неоптимальности в настройке: 1) Неправильно указанный сетевой протокол, используемый для...
1C: Enterprise Development Tools 35
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем
1Cv8.1CD - Файл данных достиг максимального размера! 3
1С выдает предупреждение " Файл данных достиг максимального размера" . Подскажите из - за чего это и как можно решить ? Превышен размер файла, обычно это сообщение возникает, когда размер файла 1Cv8.1CD приближается к 10...
Посмотреть все результаты поиска похожих
Комментарии
webstep
12.11.2015 14:25Комментарий: 2
webstep

конструкция СсылкаНаСтроку = ВнешниеИсточникиДанных.ВнешнийSQL.Таблицы.dbo_assortment.ПолучитьСсылку(СтрокаПоля);не работает (причины знает только 1С), а как запросом SQL получить ссылку на строку данных, что бы можно было обратиться например так: СсылкаНаСтроку.price ?

webstep
12.11.2015 14:21Комментарий: 1
webstep

А как получить ссылку на строку данных. что бы можно было обратиться например так: СсылкаНаСтроку.price ?

Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.