Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Напрямую в SLQ Server
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Vofka
Привет!

Можно в 7.7 напрямую работать с таблицей в SQL Server'е?
World1С
Да можно через ADODB... Где-то книга была с подробными примерами на 7.7 и 8.х
Vofka
Хотелось бы взглянуть на книгу smile.gif
World1С
Не вопрос, найду сегодня в течении дня выложу здесь на форуме...

Ув. Vofka качаем книгу необходимо зарегистрироваться для просмотра ссылки
Vofka
Жду smile.gif
World1С
Выложил на пост выше.
Vofka
Премного благодарен, посмотрю! smile.gif
Спасибо!
liksoft
Цитата(Vofka @ 01.02.10, 9:09) необходимо зарегистрироваться для просмотра ссылки
Привет!

Можно в 7.7 напрямую работать с таблицей в SQL Server'е?

Могу скинуть пример обработки, где я выгружаю напрямую в таблицы SQL-Server.
Vofka
liksoft, кинь smile.gif
World1С, в книге нашел как это в 8 делается, как в 7 - хз. Смотрю дальше...
World1С
По моему примеры описываются параллельно 8.х 7.7.
Ну если не найдешь тогда тебе необходимо зарегистрироваться для просмотра ссылки
Vofka
World1С, по ходу я затупил. Все отличия между 7 и 8 скорей всего состоят только в фунции "СоздатьОбъект" и "Новый". Буду пробовать smile.gif
Vofka
Что-то получилось! smile.gif
Но возник вопрос, который и должен был возникнуть: в форме выбираю элемент (элемент справочника). Мне нужно выбрать данные по этому элементу. Для этого надо его внутренний идентификатор. Как его получить?
С данным вопросом разобрался (может ещё кому-то пригодится):


Функция ПолучитьИД_Вариант1(Объект)
Перем Стр;
Стр=ЗначениеВСтрокуВнутр(Объект);
СЗ=СоздатьОбъект("СписокЗначений");
СЗ.ИзСтрокиСРазделителями(Сред(Стр,2,СтрДлина(Стр)-2));
Возврат СЗ.ПолучитьЗначение(СЗ.РазмерСписка());
КонецФункции
//_____________________________________________________________________________

Функция ПолучитьИД_Вариант2(Объект)
Перем Стр;
СЗ=СоздатьОбъект("СписокЗначений");
СЗ.ДобавитьЗначение("",Объект);
СЗ.ПолучитьЗначение(1,Стр);
Возврат Стр;
КонецФункции
//_____________________________________________________________________________

Процедура Сформировать()
// Пусть "Объект" - это реквизит формы типа "Справочник"
Сообщить("Объект: "+Объект.ТекущийЭлемент());
Сообщить("Вариант 1: "+ПолучитьИД_Вариант1(Объект.ТекущийЭлемент()));
Сообщить("Вариант 2: "+ПолучитьИД_Вариант2(Объект.ТекущийЭлемент()));
КонецПроцедуры
//_____________________________________________________________________________



Если нужно получить id в том виде, в котором он хранится в таблицах 1С, воспользуйтесь недокументированной функцией _IdToStr(),
н-р: Сообщить("Вариант 1: "+_IdToStr(ПолучитьИД_Вариант1(Объект.ТекущийЭлемент())));
World1С
На сайте необходимо зарегистрироваться для просмотра ссылки поищи обработку которая показывает соответствие таблиц 1С и SQL/
Знаю на 8.х точно есть, но думаю 7.7 не исключение....
Vofka
World1С, то о чем Вы сейчас говорите мы уже обсуждали (вот для 7 нашёл необходимо зарегистрироваться для просмотра ссылки
liksoft
Выгружаю в таблицу внаглую
Процедура ОбновлениеТоваров()
  
    ИмяСервера = "LSW11";
    ИмяБазыДанных = "cashbase";
    Попытка
        Соединение =СоздатьОбъект("ADODB.Connection");
        Соединение.Provider = "SQLOLEDB";
        Соединение.ConnectionString = "Server=" + ИмяСервера + ";Database=" + ИмяБазыДанных + ";Trusted_Connection=yes";
        Соединение.ConnectionTimeout = 20;
        Соединение.Open();
        Сообщить("Установлено соединение с базой данных " + ИмяБазыДанных + " на сервере " + ИмяСервера);
        //Возврат 1;
    Исключение
        Предупреждение("Нихуя не получилось. Вероятно спиздили компьютер с данными. " + ИмяБазыДанных + " на сервере " + ИмяСервера,10);
        //Возврат 0;
    КонецПопытки;
    
    RS = СоздатьОбъект("ADODB.Recordset");
    RS.CursorType = 0; //adOpenForwardOnly
    RS.LockType = 3; //adLockReadOnly
    RS.CursorLocation = 2; //adUseServer  
                        
    
    
//==== первая часть мардлезонского балета....    
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "
    |Товары = Справочник.Товары.ТекущийЭлемент;
    |Код = Справочник.Товары.Код;
    |Наименование = Справочник.Товары.Наименование;
    |Группировка Код без групп;
    |";
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
                            
    Сообщить("1 часть марлезонского балета...");
    Сообщить(ТекущееВремя());
    
    шк = СоздатьОбъект("Справочник.ШтрихКод");
    Пока Запрос.Группировка(1) = 1 Цикл  
        Если Запрос.Товары.Актуален = Перечисление.Булево.Да Тогда
            тТов = Запрос.Товары;
            Если тТов.Мест <> 0 Тогда
                Если спМест.НайтиЗначение(тТов.Мест) = 0 Тогда
                    спМест.ДобавитьЗначение(тТов.Мест);
                КонецЕсли;
                тзСкидка.НоваяСтрока();
                тзСкидка.Товар = тТов;
                тзСкидка.Мест = тТов.Мест;
                тзСкидка.ЦенаСк = тТов.ПродажнаяЦена1.Получить(РабочаяДата());
            КонецЕсли;
            тЦена = Запрос.Товары.ПродажнаяЦена3.Получить(РабочаяДата());
            шк.ИспользоватьВладельца(тТов);
            Если шк.ВыбратьЭлементы() = 1 Тогда
                Пока шк.ПолучитьЭлемент() = 1 Цикл
                    Если шк.ПометкаУдаления() = 0 Тогда                        
                        тШК = Число(шк.ШтрихКод);                        
                        Если (тШК <> 0) И (тЦена <> 0) Тогда
                            
                            //ItemList                            
                            //Сообщить(Строка(Запрос.Товары.Код) + " _ " + Строка(Число(шк.ШтрихКод)) + " _ " + Строка(Запрос.Товары.Наименование) + " _ " + Строка(Число(тЦена)));
                            стрСоед = "SELECT Code,Name,Cen,Tax FROM ItemList WHERE Code="+тШК;
                            Rs.Open(стрСоед,Соединение);
                            Если RS.EOF=-1 Тогда                            
                                RS.AddNew();
                                RS.Fields("Code").Value = Число(шк.ШтрихКод);
                            КонецЕсли;
                            RS.Fields("Name").Value = Лев(СокрЛП(Запрос.Товары.Наименование),16);
                            RS.Fields("Cen").Value = Число(Запрос.Товары.ПродажнаяЦена3.Получить(РабочаяДата()));
                            RS.Fields("Tax").Value = Число(?(Запрос.Товары.СтавкаНДС = Перечисление.СтавкаНДС.Двадцать,1,0));
                            RS.Update();                            
                            rs.Close();
                            // CodeAliases
                            str2 = "SELECT Code,Alias,Mult FROM CodeAliases WHERE Alias="+Число(Запрос.Товары.Код);
                            RS.Open(str2,Соединение);
                            Если RS.EOF=-1 Тогда                            
                                RS.AddNew();
                                RS.Fields("Code").Value = Число(шк.ШтрихКод);
                                RS.Fields("Alias").Value = Число(Запрос.Товары.Код);
                                RS.Fields("Mult").Value = 1;
                                RS.Update();                            
                            КонецЕсли;
                            rs.Close();  
                            
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
            Иначе
                //Сообщить(Строка(Запрос.Товары.Код) + " _ " + Строка(Запрос.Товары.Наименование) + " _ " + Строка(Число(тЦена)));
                стрСоед = "SELECT Code,Name,Cen,Tax FROM ItemList WHERE Code="+Число(Запрос.Товары.Код);
                Rs.Open(стрСоед,Соединение);
                Если RS.EOF=-1 Тогда                            
                    RS.AddNew();
                    RS.Fields("Code").Value = Число(Запрос.Товары.Код);
                КонецЕсли;
                RS.Fields("Name").Value = Лев(СокрЛП(Запрос.Товары.Наименование),16);
                RS.Fields("Cen").Value = Число(Запрос.Товары.ПродажнаяЦена3.Получить(РабочаяДата()));
                RS.Fields("Tax").Value = Число(?(Запрос.Товары.СтавкаНДС = Перечисление.СтавкаНДС.Двадцать,1,0));
                RS.Update();                            
                rs.Close();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;  
    Сообщить("окончание 1 части марлезонского балета...");
    Сообщить(ТекущееВремя());
// конец 1 части марлезонског балета
КонецПроцедуры


Выгружаю через INSERT
Процедура ВыгрузкаТоваров()
    
    ИмяСервера = "LSW11";
    ИмяБазыДанных = "cashbase";
    Попытка
        Соединение =СоздатьОбъект("ADODB.Connection");
        Соединение.Provider = "SQLOLEDB";
        Соединение.ConnectionString = "Server=" + ИмяСервера + ";Database=" + ИмяБазыДанных + ";Trusted_Connection=yes";
        Соединение.ConnectionTimeout = 20;
        Соединение.Open();
        Сообщить("Установлено соединение с базой данных " + ИмяБазыДанных + " на сервере " + ИмяСервера);
        //Возврат 1;
    Исключение
        Предупреждение("Нихуя не получилось. Вероятно спиздили компьютер с данными. " + ИмяБазыДанных + " на сервере " + ИмяСервера,10);
        //Возврат 0;
    КонецПопытки;
    
    RS = СоздатьОбъект("ADODB.Recordset");
    RS.CursorType = 0; //adOpenForwardOnly
    RS.LockType = 3; //adLockReadOnly
    RS.CursorLocation = 2; //adUseServer  
    
    Сообщить("2 часть марлезонского балета...");
    Сообщить(ТекущееВремя());
    
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с (ТекущаяДата()) по (ТекущаяДата());
    |Склад = Регистр.ОстаткиТоваров.Склад;
    |Товары = Регистр.ОстаткиТоваров.Товары;
    |Остаток = Регистр.ОстаткиТоваров.Остаток;
    |Функция ОстатокКонОст = КонОст(Остаток);
    |Группировка Товары без групп;
    |Условие(Склад = ВыбСклад);
    |Условие(Остаток > 0);
    |";
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    шк = СоздатьОбъект("Справочник.ШтрихКод");
    Пока Запрос.Группировка(1) = 1 Цикл
        Если Запрос.Товары.Актуален = Да Тогда
            тТов = Запрос.Товары;
            тЦена = Запрос.Товары.ПродажнаяЦена3.Получить(ТекущаяДата());
            шк.ИспользоватьВладельца(тТов);
            Если шк.ВыбратьЭлементы() = 1 Тогда
                Пока шк.ПолучитьЭлемент() = 1 Цикл
                    Если шк.ПометкаУдаления() = 0 Тогда
                        тШК = Число(шк.ШтрихКод);                        
                        Если (тШК <> 0) И (тЦена <> 0) Тогда
                            //DepItems        
                            
                            
                            стрДоб = "INSERT INTO DeptItems (NDep,Code,Name,Cen,Dep,Grp,Tax,Kol,FreeCen,FracKol,WatchKol,Online) VALUES (";
                            стрДоб = стрДоб + Число(ВыбСклад.КодСклада)+","+
                            Строка(Число(шк.ШтрихКод))+","+
                            "'"+Лев(СокрЛП(Запрос.Товары.Наименование),16) + "'"+","+
                            Число(Запрос.Товары.ПродажнаяЦена3.Получить(РабочаяДата()))+","+
                            "'1',"+
                            "'1',"+
                            "'"+Строка(Число(?(Запрос.Товары.СтавкаНДС = Перечисление.СтавкаНДС.Двадцать,1,0)))+"'"+","+
                            Число(Запрос.ОстатокКонОст)+","+
                            "'0',"+
                            "'"+?(Запрос.Товары.ФлагШтучногоТовара = 1,0,255)+"'"+","+
                            "'255','1')";            
                            Сообщить(стрДоб);
                               Rs.Open(стрДоб,Соединение);
                            Сообщить(Строка(Запрос.Товары.Код) + " _ " + Строка(Число(шк.ШтрихКод)) + " _ " + Строка(Запрос.Товары.Наименование) + " _ " + Строка(Число(тЦена)));
                            
                        КонецЕсли;
                    КонецЕсли;
                КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Сообщить("окончание 2 части марлезонского балета...");
    Сообщить(ТекущееВремя());

КонецПроцедуры
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.