Имя: Пароль:
1C
1С v8
Запись новой строки из таблицы в MS SQL Server
, ,
0 catherineskoch
 
10.12.19
19:44
Здравствуйте, очень нужна помощь.
В общем, есть БД в MS SQL Server
Есть 1С БП, в которую дописана обработка соединения с БД.
С божьей помощью я вывела таблицу из БД в таблицу на форму в 1С.
Вот код соединения с БД:


Процедура ВыполнитьОбработкуНасервере()
    //Инициализация переменных
    ИмяСервераSQL = "WIN-1D641A4LV0A\SQLEXPRESS";
    ПользовательSQL = "sa";
    ПарольSQL = "123";
    БазаДанныхSQL = "BROK1";
    ТаблицаSQL = "BROK1.dbo.MN";
    
    
    //Подключение к SQL-серверу
    Попытка
        Соединение  = Новый COMОбъект("ADODB.Connection");
        Команда     = Новый COMОбъект("ADODB.Command");
        Выборка     = Новый COMОбъект("ADODB.RecordSet");
        Соединение.ConnectionString =
        "driver={SQL Server};" +
        "server="+ИмяСервераSQL+";"+
        "uid="+ПользовательSQL+";"+
        "pwd="+ПарольSQL+";"+
        "database="+БазаДанныхSQL+";";
        Соединение.ConnectionTimeout = 30;
        Соединение.CommandTimeout = 600;
        //Открытие соединение
        Соединение.Open();
        Команда.ActiveConnection   = Соединение;
        Сообщить("Успешное подключение!");
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    
    таблица.Очистить();
    
    ТекстИнструкции ="SELECT BROK1.dbo.MN.MN_DOC_NUMBER,
                          | BROK1.dbo.PRODUCTS.P_NAME,
                          | BROK1.dbo.MN.MN_QUANTITY
                          | FROM BROK1.dbo.MN
                          | JOIN BROK1.dbo.PRODUCTS
                          | ON BROK1.dbo.PRODUCTS.P_NAME = BROK1.dbo.MN.MN_PRODUCT";
    Команда.CommandText = ТекстИнструкции;
    ЗаписиSQL = Команда.Execute()
    
    Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы
        НоваяСтрока = Таблица.Добавить();
            НоваяСтрока.MN_DOC_NUMBER = ЗаписиSQL.Fields(0).Value;
            НоваяСтрока.P_NAME = ЗаписиSQL.Fields(1).Value;
            НоваяСтрока.MN_QUANTITY = ЗаписиSQL.Fields(2).Value;
                ЗаписиSQL.MoveNext();
    КонецЦикла;

КонецПроцедуры


Это выглядит вот таким образом https://ibb.co/w6fzRcD

И вот теперь, что я хочу. Я хочу добавить кнопочку "Записать новую запись в БД", после нажатия которой добавленная запись записывается в базу данных. Как это сделать, подскажите, пожалуйста.
1 Ёпрст
 
10.12.19
19:46
(0) читайте про insert
2 catherineskoch
 
10.12.19
19:48
Я знаю, как написать запрос
вот например
INSERT INTO BROK1.dbo.MN
([MN_DOC_NUMBER], [MN_PRODUCT],[MN_QUANTITY])
VALUES ('2', 'Продукция 1', '3')
Но как реализовать это из 1С?
3 MyNick
 
10.12.19
19:50
(2) ну очевидно что
Команда.CommandText = ТекстИнструкции;
Команда.Execute()
4 Ёпрст
 
10.12.19
19:50
(2) что значит как ?

ТекстЗапроса = "INSERT INTO BROK1.dbo.MN ([MN_DOC_NUMBER], [MN_PRODUCT],[MN_QUANTITY])  VALUES ('2', Продукция 1', '3')";
    Command.CommandText = ТекстЗапроса;    
    RecordSet = Новый COMОбъект("ADODB.RecordSet");    
    RecordSet = Command.Execute();
5 Ёпрст
 
10.12.19
19:51
*RecordSet = Новый COMОбъект("ADODB.RecordSet");   //это лишнее
6 catherineskoch
 
10.12.19
19:55
(4), а как сделать, чтобы в VALUES были значения из полей таблицы? вот как выглядит таблица https://ibb.co/LZzCNCm
и еще, не могли бы Вы подсказать, как реализовать цикл, если например будут добавляться сразу несколько записей? ЭтоНовый подойдет?
7 catherineskoch
 
10.12.19
19:57
Так, не пояснила про ЭтоНовый, то есть как я это понимаю, цикл как-то должен проверить, какие записи являются новыми и только их записать
8 Ёпрст
 
10.12.19
19:58
(6) обходишь свою коллекцию и собираешь строку для инсерта динамически.

Если это не разовая задача, то можно через внешние источники слепить, там прям "1с -ый" синтаксис будет
9 Ёпрст
 
10.12.19
19:58
(7) тогда проверяешь, если запись есть по ключевым полям, тогда update, иначе insert
10 Ёпрст
 
10.12.19
20:00
тип того:
   update table with (serializable) set ...
   where key = key

   if @@rowcount = 0
   begin
      insert into table (key, ...) values (key,..)
   end
11 catherineskoch
 
10.12.19
20:08
(6) я что-то читала про внешние источники, мне сказали их не трогать и делать все через COMO объекты, вот.
что Вы написали в (10) я поняла только интуитивно, не уверена, что смогу вообще это как-то реализовать и мне кажется, что Вы сейчас очень переоценили мои знания и способности.
Смотрите, вот я начинаю писать процедуру

&НаСервере
Процедура ЗаписьНовуюЗаписьНаСервере()
как отсюда обратиться к таблице и проверить, что строка является новой?
далее, если она новая, то надо выполнить запрос на добавление
текст запроса
и все также для меня загадка, как обратиться к полям таблицы....

КонецПроцедуры
12 catherineskoch
 
10.12.19
20:10
Вот что я смогла написать в той же процедуре, где и чтение записей
//Для каждого стр из Таблица цикл
    //    ТекстТекущейИнструкции = "INSERT INTO BROK1.dbo.MN ([MN_DOC_NUMBER], [MN_PRODUCT],[MN_QUANTITY])
    //    | VALUES '"+Стр.MN_DOC_NUMBER+"', '"+Стр.P_NAME+"', '"+Стр.MN_QUANTITY+"'";
    //    Команда.CommandText = ТекстТекущейИнструкции;
    //    ЗаписиSQL = Команда.Execute();    
    //КонецЦикла;    


И вот не могу сообразить как сделать не для каждого, а для новой стр из таблицы
13 Ёпрст
 
10.12.19
20:10
(11) для начала, нужно определиться, что вы считаете "новой" строкой. Там где все поля совпадают ?
14 catherineskoch
 
10.12.19
20:12
(13) ну вот я нажимаю "добавить" и ввожу значения. пока что вообще нет необходимости проверять является ли она уникальной, просто чтобы была добавлена самостоятельно в 1С
15 catherineskoch
 
10.12.19
20:12
Хотя наверное будет проще проверить является ли она уникальной, а не просто новой, так? Наверное..
16 H A D G E H O G s
 
10.12.19
21:09
(11) Прекратите трогать тех, кто сказал вам про ВнешниеИсточники и сделайте по человечьи, тоесть через ВнешниеИсточники
17 AAA
 
11.12.19
04:04
(0)Зачем вообще Вам вставка записи средствами SQL ? Поясните свою задачу более предметно. Что Вы хотите добавить ?
18 Sserj
 
11.12.19
04:23
(12)
ТекстТекущейИнструкции = "
|IF NOT exists(SELECT *
|              FROM BROK1.dbo.MN
|              WHERE MN_DOC_NUMBER = '"+Стр.MN_DOC_NUMBER+"'
|                   AND MN_PRODUCT = '"+Стр.P_NAME+"'
|                   AND MN_QUANTITY = '"+Стр.MN_QUANTITY+"'"
|              )
|INSERT INTO BROK1.dbo.MN ([MN_DOC_NUMBER], [MN_PRODUCT],[MN_QUANTITY])
|VALUES '"+Стр.MN_DOC_NUMBER+"', '"+Стр.P_NAME+"', '"+Стр.MN_QUANTITY+"'
|"
19 Sserj
 
11.12.19
04:34
+(18) Кстати кажется при вставке значения должны быть в скобках:
INSERT INTO BROK1.dbo.MN ([MN_DOC_NUMBER], [MN_PRODUCT],[MN_QUANTITY])
VALUES ('"+Стр.MN_DOC_NUMBER+"', '"+Стр.P_NAME+"', '"+Стр.MN_QUANTITY+"')"
20 catherineskoch
 
11.12.19
15:55
(19) общаться конструкцией Стр.ИмяПоля можно в том случае, если используется цикл для каждого стр из таблица цикл
иначе непонятно, что за стр
вот у меня и возникают вопросы, как это сделать
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс