Скрипт автообновления типовых конфигураций Батник на "языке 1С" для клиент серверных баз, скачивает с сайта ИТС нужное обновление, бекапит базу и обновляет. Подойдет как рабочая заготовка для собственных "обновляторов". В текущем виде все работает. Надо только занести свои переменные.
Код 1C v 8.3 // Путь к обновлениям
Перем мРасположениеОбновлений;
//Параметры для подключения к серверу обновления 1С
Перем мИтсЛогин;
Перем мИтсПароль;
//****
Перем home;
Перем DumpIB;
Перем ФайлСписокОбновленийZIP;
Перем ФайлСписокОбновленийXML;
Перем КодВозврата;
// Проверка существования файла или каталога.
//
// Параметр:
// ПутьКФайлу - Строка - путь к файлу или каталогу, существование которого
// нужно проверить.
//
// Возвращаемое значение:
// Булево - признак существования файла или каталога.
//
Функция ФайлСуществует(Знач ПутьКФайлу) Экспорт
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл.Существует();
КонецФункции
Процедура УстановитьКонстанты()
каталог_tmplts = "D:\tmplts";
мИтсЛогин = "---";
мИтсПароль = "---";
//**Ниже можно не менять.
мРасположениеОбновлений = каталог_tmplts + "\1c";
home = каталог_tmplts + "\1Cupdate";
DumpIB = home + "\DumpIB\";
ФайлСписокОбновленийXML = home + "\v8cscdsc.xml";
ФайлСписокОбновленийZIP = home + "\v8upd11.zip";
Если НЕ ФайлСуществует(home) Тогда
СоздатьКаталог(home);
КонецЕсли;
Если НЕ ФайлСуществует(DumpIB) Тогда
СоздатьКаталог(DumpIB);
КонецЕсли;
Если НЕ ФайлСуществует(мРасположениеОбновлений) Тогда
СоздатьКаталог(мРасположениеОбновлений);
КонецЕсли;
КонецПроцедуры
Функция ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
ПараметрыБазы = Неопределено;
Попытка
//Создаем COM-объект с идентификатором V82.COMConnector
COMОбъект = Новый COMОбъект("V"+мВерсияПлатформы+".COMConnector"); //выйдет V82.COMConnector
Исключение
Сообщить("Не удалось создать COM-объект!");
Возврат ПараметрыБазы;
КонецПопытки;
ПутьКБазе = "srvr="""+ СокрЛП(мИмяСервера) +""";" + "ref=""" + СокрЛП(мИмяБазы) +""";";
СтрокаСоединения = ПутьКБазе + "Usr="""+ СокрЛП(мБазаЛогин) +""";" + "Pwd="""+ СокрЛП(мБазаПароль) + """;";
Попытка
//Устанавливаем внешнее соединение с информационной базой через COM-соединение
V82 = COMОбъект.Connect(СтрокаСоединения);
Исключение
Сообщить(СтрокаСоединения);
Сообщить("Внешнее соединение не установлено!");
Возврат ПараметрыБазы;
КонецПопытки;
ПараметрыБазы = Новый Структура;
ПараметрыБазы.Вставить("ТекущаяВерсия", v82.Метаданные.Версия);
ПараметрыБазы.Вставить("ПутьКПлатформе",v82.КаталогПрограммы() + "1cv8.exe");
Возврат ПараметрыБазы;
КонецФункции
Процедура УстановитьCOMСоединение(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Попытка
//Создаем COM-объект с идентификатором V82.COMConnector
COMОбъект = Новый COMОбъект("V"+мВерсияПлатформы+".COMConnector"); //выйдет V82.COMConnector
Исключение
Сообщить("Не удалось создать COM-объект!");
Возврат;
КонецПопытки;
//Инициализируем строку подключения к информационной базе:
// Если ФайловаяИБ Тогда
//Файловый вариант
// ПутьКБазе = "File="""+ СокрЛП(КаталогИБ) +""";";
// Иначе
//Серверных вариант
ПутьКБазе = "srvr="""+ СокрЛП(мИмяСервера) +""";"+
"ref=""" + СокрЛП(мИмяБазы) +""";";
// КонецЕсли;
СтрокаСоединения = ПутьКБазе +
"Usr="""+ СокрЛП(мБазаЛогин) +""";"+
"Pwd="""+ СокрЛП(мБазаПароль) +""";";
Сообщить(СтрокаСоединения);
Попытка
//Устанавливаем внешнее соединение с информационной базой через COM-соединение
V82 = COMОбъект.Connect(СтрокаСоединения);
Исключение
Сообщить(СтрокаСоединения);
Сообщить("Внешнее соединение не установлено!");
Возврат;
КонецПопытки;
КонецПроцедуры
// Загрузка списка обновлений из файла XML
// Достаем из XML файла, наибольший номер возможного обновления
Функция ВыполнитьЗагрузкуСпискаОбновлений(ИмяФайлаЗагрузки,ТекущаяВерсияКонфигурации)
СообщениеОбОшибке = "Ошибка при чтении файла списка обновлений.";
Если НЕ ФайлСуществует(ИмяФайлаЗагрузки) Тогда
Сообщить("Нету XML файла (списка обновлений)");
Возврат Неопределено;
КонецЕсли;
ВерсияДляОбновления = Неопределено;
Попытка
// ТаблицаЗначений = Новый ТаблицаЗначений;
// ТаблицаЗначений.Колонки.Добавить("Конфигурация", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("Поставщик", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("Версия", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("ВерсияДляОбновления", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("ПутьКФайлуОбновления", Тип("Строка"));
// ТаблицаЗначений.Колонки.Добавить("РазмерФайлаОбновления", Тип("Число"));
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаЗагрузки);
ЧтениеXML.Прочитать(); // <?xml version="1.0" encoding="UTF-8" ?>
// Дата формирования файла.
ЧтениеXML.Прочитать();
ЧтениеXML.Прочитать();
ДатаФормирования = ЧтениеXML.Значение;
ЧтениеXML.Прочитать();
// Читаем начало элемента Update или конец элемента UpdateList.
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "v8u:updateList" Тогда
Прервать;
Иначе
Конфигурация = ЧтениеXML.ПолучитьАтрибут("configuration");
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "v8u:update" Тогда
Прервать;
Иначе
Если ЧтениеXML.Имя = "v8u:vendor" Тогда
ЧтениеXML.Прочитать();
Поставщик = ЧтениеXML.Значение;
ИначеЕсли ЧтениеXML.Имя = "v8u:version" Тогда
ЧтениеXML.Прочитать();
Версия = ЧтениеXML.Значение;
ИначеЕсли ЧтениеXML.Имя = "v8u:file" Тогда
ЧтениеXML.Прочитать();
ПутьКФайлуОбновления = ЧтениеXML.Значение;
ИначеЕсли ЧтениеXML.Имя = "v8u:size" Тогда
ЧтениеXML.Прочитать();
РазмерФайлаОбновления = ЧтениеXML.Значение;
ИначеЕсли ЧтениеXML.Имя = "v8u:target" Тогда
ЧтениеXML.Прочитать();
// НоваяСтрока = ТаблицаЗначений.Добавить();
// НоваяСтрока.Конфигурация = Конфигурация;
// НоваяСтрока.Поставщик = Поставщик;
// НоваяСтрока.Версия = Версия;
// НоваяСтрока.ВерсияДляОбновления = ЧтениеXML.Значение;
// НоваяСтрока.ПутьКФайлуОбновления = ПутьКФайлуОбновления;
// НоваяСтрока.РазмерФайлаОбновления = РазмерФайлаОбновления;
Если ЧтениеXML.Значение = ТекущаяВерсияКонфигурации Тогда //279 Новые в конце. на последнюю полученную и будем обновяться
ВерсияДляОбновления = Версия;
КонецЕсли;
КонецЕсли;
ЧтениеXML.Прочитать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Исключение
Сообщить(СообщениеОбОшибке);
ЧтениеXML.Закрыть();
Возврат Неопределено;
КонецПопытки;
//Возврат ТаблицаЗначений;
ЧтениеXML.Закрыть();
Возврат ВерсияДляОбновления;
КонецФункции // ВыполнитьЗагрузкуСпискаОбновлений()
//Входящие Сервер - База - ТипКонфигурации - ВерсияРелиза - ВерсияПлатформы-ИТС логин и пароль необязательно
Процедура ПроверитьОбновлениеКонфигурации(мИмяСервера,мИмяБазы,мТипКонфигурации,мВерсияРелиза,мВерсияПлатформы,мБазаЛогин,мБазаПароль)
Сообщить("----------------------------------------------------------------------");
//удалить старые файлы
УдалитьФайлы(ФайлСписокОбновленийXML);
УдалитьФайлы(ФайлСписокОбновленийZIP);
// Качаем v8cscdsc.xml в виде v8upd11.zip
// Создание HTTP-соединения с сервером обновлений
СерверОбновлений = Новый HTTPСоединение("downloads.1c.ru",,мИтсЛогин,мИтсПароль,);
ЗапросКСерверуОбновлений = Новый HTTPЗапрос("/ipp/ITSREPV/V8Update/Configs/"+мТипКонфигурации+"/"+мВерсияРелиза+"/"+мВерсияПлатформы+"/v8upd11.zip");
СерверОбновлений.Получить(ЗапросКСерверуОбновлений,ФайлСписокОбновленийZIP);
// Распаковываем v8cscdsc.xml
ФайлZip = Новый ЧтениеZipФайла(ФайлСписокОбновленийZIP);
ФайлZip.ИзвлечьВсе(home);
ФайлZip.Закрыть();
УдалитьФайлы(ФайлСписокОбновленийZIP);
//+++++ Запрос версии конфигурации базы...
ПараметрыComБазы = ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль);
Если ПараметрыComБазы = Неопределено Тогда
Возврат;
КонецЕсли;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений(ФайлСписокОбновленийXML,ПараметрыComБазы.ТекущаяВерсия);
ТребуетсяОбновление = Ложь;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ");
Возврат;
КонецЕсли;
Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " update: " + ВерсияДляОбновления);
//----- Запрос версии конфигурации базы...
КомандаПакетногоАрхивирования = """" + ПараметрыComБазы.ПутьКПлатформе +""""+" CONFIG /S"+мИмяСервера+"\"+мИмяБазы+" /N"""+мБазаЛогин+""" /P"""+мБазаПароль+""" /DumpIB "+DumpIB + мИмяБазы + ".dt /OUT """+home+"\"+мИмяБазы+".log"" -NoTruncate";
//NoTruncate - не очищать логи
//Сообщить(КомандаПакетногоАрхивирования);
ЗапуститьПриложение(КомандаПакетногоАрхивирования,,Истина,КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("Резервная копия успешно создана.");
Иначе
Сообщить("Ошибка при создании резервной копии");
Возврат;
КонецЕсли;
Версия_Для_Обновления = СтрЗаменить(ВерсияДляОбновления, ".", "_"); //в каталоге шаблонов через подчеркивание храняться
//качаем новую версию, если уже не скачено
Если НЕ ФайлСуществует(мРасположениеОбновлений +"\"+мТипКонфигурации+"\"+Версия_Для_Обновления+"\") Тогда
//качаем новую
// Создание HTTP-соединения с сервером обновлений
Заголовки = Новый Соответствие();
Заголовки.Вставить("User-Agent", "1C+Enterprise/8.2"); //без заголовка сайт не даст скачать.
СерверОбновлений = Новый HTTPСоединение("downloads.v8.1c.ru",,мИтсЛогин,мИтсПароль,);
СтрокаЗапросHTTP = "/tmplts/1c/"+мТипКонфигурации+"/"+ Версия_Для_Обновления +"/1cv8.zip";
Сообщить(СтрокаЗапросHTTP);
ЗапросКСерверуОбновлений = Новый HTTPЗапрос(СтрокаЗапросHTTP,Заголовки);
СерверОбновлений.Получить(ЗапросКСерверуОбновлений, мРасположениеОбновлений+"\1cv8.zip");
ФайлZip = Новый ЧтениеZipФайла(мРасположениеОбновлений+"\1cv8.zip");
ФайлZip.ИзвлечьВсе(мРасположениеОбновлений+"\"+мТипКонфигурации+"\"+Версия_Для_Обновления);
ФайлZip.Закрыть();
УдалитьФайлы(мРасположениеОбновлений+"\1cv8.zip");
КонецЕсли;
//запускаем обновление
КомандаПакетногоОбновления = """" + ПараметрыComБазы.ПутьКПлатформе +""""+" CONFIG /S"+мИмяСервера+"\"+мИмяБазы+" /N"""+мБазаЛогин+""" /P"""+мБазаПароль+""" /UpdateCfg "+мРасположениеОбновлений+"\"+мТипКонфигурации+"\"+Версия_Для_Обновления + "\1cv8.cfu /UpdateDBCfg /OUT """+home+"\"+мИмяБазы+".log"" -NoTruncate";
//Сообщить(КомандаПакетногоОбновления);
ЗапуститьПриложение(КомандаПакетногоОбновления,,Истина,КодВозврата);
Если КодВозврата = 0 Тогда
Сообщить("База Успешно обновлена");
Иначе
Сообщить("ОШИБКА ПРИ ОБНОВЛЕНИИ");
Возврат;
КонецЕсли;
//Еще разок запрос версии
//+++++ Запрос версии конфигурации базы...
ПараметрыComБазы = ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль);
Если ПараметрыComБазы = Неопределено Тогда
Возврат;
КонецЕсли;
ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений(ФайлСписокОбновленийXML,ПараметрыComБазы.ТекущаяВерсия);
ТребуетсяОбновление = Ложь;
Если ВерсияДляОбновления = Неопределено Тогда
Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ");
Возврат;
КонецЕсли;
Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " update: " + ВерсияДляОбновления);
//----- Запрос версии конфигурации базы...
КонецПроцедуры
УстановитьКонстанты();
//ОСНОВНЫЕ
//ЗУП 2.5
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_el","HRM","25","82","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_spb","HRM","25","82","Администратор","Администратор");
//БП 3.0
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_domx","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_el","Accounting","30","83","Администратор","Администратор");
//СВЕТЛАНЫ
//БП 3.0
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_ip","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_guild","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_lebedeva","Accounting","30","83","Администратор","Администратор");
//ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_service","AccountingBase","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_porsche","Accounting","30","83","Администратор","Администратор");
//ЗУП 2.5
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_service","HRM","25","82","Администратор","Администратор");
Источник
Категория:
Администрирование Запись во внешний источник данных из 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.ФормаОбъекта");
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновитьВнешнийИсточникДанных" Тогда
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
Вот и все, теперь мы можем как добавлять, так и редактировать данные таблицы. При необходимости можно добавить дополнительный контроль ввода, автонумерацию, удаление и прочие механизмы.
Источник
Категория:
Внешние источники данных Excel файл как Внешний источник данных Подключимся и загрузим из файла Excel данные в таблицу значений 1С. Сделать теперь это очень просто.
1. В конфигурации добавляет новый объект метаданных типа "Внешние источники данных" и назовем его просто "Excel".
2. На закладке "Данные" созданного объекта "Excel" добавляем новую таблицу. При этом появится окно мастера добавления таблицы внешнего источника.
Выбираем первый пункт "Вручную", т.к. лично у меня второй пункт "Выбрать из списка таблиц внешнего источника данных" работает нестабильно.
Если Вы все же хотите попробовать добавить таблицу через второй пункт, то в качестве строки соединения в появившемся окне указываем:
Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\Documents and Settings\Admin\Мои документы\finance3.xls; DriverID=790
В этой строке укажите путь к своему файлу. Имя пользователя и пароль я не указывал.
Отмечу, что путь к файлу и строка соединения в дальнейшем не запоминается и нужны эти параметры единожды, чтобы создать автоматически описание полей таблицы источника.
Если соединение прошло нормально, то должен отобразиться список таблиц источника. Флажком можно выбрать нужную таблицу и ее поля.
3. Даем имя новой таблице "Данные". Переходим на вкладку таблицы "Данные". В поле "Имя в источнике данных" указываем имя листа в файле Excel и добавляем в конце знак "$". В моем случае это "Данные$". В табличной части "Поля" добавляем поля и редактируем их тип.
У каждого поля в свойствах должно быть задано как минимум "Имя" и "Имя в источнике данных".
4. Создаем процедуру в которой пишем подключение к источнику и запрос:
Код 1C v 8.х ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения=
"Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\Documents and Settings\Admin\Мои документы\finance2.xls; DriverID=790";
ВнешниеИсточникиДанных.Excel.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.Excel.УстановитьСоединение();
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| Данные.date КАК Дата,
| Данные.time КАК Время,
| Данные.account КАК Счет,
| Данные.amount КАК Сумма,
| Данные.currency КАК Валюта,
| Данные.category КАК Категория,
| Данные.parent КАК КатегорияРодитель
|ИЗ
| ВнешнийИсточникДанных.Excel.Таблица.Данные КАК Данные";
ТЗ = Запрос.Выполнить().Выгрузить();
Вот и все!
Источник:
passion-programmer
Параметры соединения для файла Excel выглядят вот так:
Файлы XLSX (версия Office 2007 и выше)
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:\ФайлExcel.xlsx;
Файлы XLS (ранее)
Driver={Microsoft Excel Driver (*.xls)}; DriverID=790; DBQ=D:\ФайлExcel.xls; Категория:
Внешние источники данных Как очистить кэш 1С? Бывают случаи, когда на данном компьютере пользователя в рабочей базе была старая конфигурация, хотя на любом другом ПК и на сервере она обновилась. Так же может возникать ошибка потока данных. В этих и некоторых других случаях поможет очистка кеша.
В связи с тем, что 1С может быть установлена на различных операционных системах, папка, где хранится кэш, может быть различной.
Для Win XP:
%userprofile%\Local Settings\Application Data\1C\1Cv82
%userprofile%\Application Data\1C\1Cv82
Для Win 7:
%userprofile%\AppData\Roaming\1C\1Cv82
%userprofile%\AppData\Local\1C\1Cv82
Серверные оси Windows 2008
C:\Users\<username>\AppData\Local\1C
C:\Users\<username>\AppData\Roaming\1C
А самый простой способ найти папки – это использовать поиск по системе(win + F) по ключевым словам «1сv81» и/или «1cv82». Нужные нам папки находятся в каталоге пользователя.
Напимер:
C:\Documents and Settings\%userprofile%\Local Settings\Application Data\1C\1Cv81
C:\Documents and Settings\%userprofile% \Local Settings\Application Data\1C\1Cv82
C:\Documents and Settings\%userprofile% \Application Data\1C\1Cv81\
C:\Documents and Settings\%userprofile% \Application Data\1C\1Cv82\
Важно:
1) Кэш хранится в двух папках. Чаще всего эти папки называются «LocalSettings» и «ApplicationData». Обе папки находятся в каталоге пользователя.
2) Формат кэш-файлов выглядит вот так: «0df525c2-1c3e-44be-b852-c7059f17c5aa» или «0f2c4d8f-cc84-4033-8744-1acfa6204474». Удалять необходимо только те папки, у которых такой же формат в названии.
3.) Не удаляйте файл ibases.v8i — он содержит список баз
Можно ли изменить путь кэша метаданных?
Можно. С помощью групповых политик (gpedit.msc) можно переопределить путь профиля пользователя целиком (не только кэш метаданных).
ВАРИАНТЫ АВТОМАТИЗАЦИИ:
1. Доп. ключик командной строки
/ClearCache — очистка кэша клиент-серверных вызовов (используется для тонкого и толстого клиентов в режиме 1С:Предприятия).
2. bat / cmd файл:
Код VBS @FOR /D %%i in ("C:\Users\*") do (
@FOR /D %%j in ("%%i\Local settings\Application data\1C\1Cv82\????????-????-????-????-????????????") do rd /s /q "%%j"
@FOR /D %%j in ("%%i\AppData\Roaming\1C\1Cv82\????????-????-????-????-????????????") do rd /s /q "%%j"
)
и текст батника с проверкой на ХР или 7:
Код VBS If Exist %USERPROFILE%\AppData\Roaming\1C\1Cv82 (
rem Удаляем все файлы в 7
Del /F /Q %USERPROFILE%\AppData\Roaming\1C\1Cv82\*.*
Del /F /Q %USERPROFILE%\AppData\Local\1C\1Cv82\*.*
rem Удаляем все каталоги в 7
for /d %%i in ("%USERPROFILE%\AppData\Roaming\1C\1Cv82\*") do rmdir /s /q "%%i"
for /d %%i in ("%USERPROFILE%\AppData\Local\1C\1Cv82\*") do rmdir /s /q "%%i"
)
If Exist %USERPROFILE%\Local Settings\Application Data\1C\1Cv82 (
rem Удаляем все файлы в XP
Del /F /Q %USERPROFILE%\Local Settings\Application Data\1C\1Cv82\*.*
Del /F /Q %USERPROFILE%\Application Data\1C\1Cv82\*.*
rem Удаляем все файлы в XP
for /d %%i in ("%USERPROFILE%\Local Settings\Application Data\1C\1Cv82\*") do rmdir /s /q "%%i"
for /d %%i in ("%USERPROFILE%\Application Data\1C\1Cv82\*") do rmdir /s /q "%%i"
)
3. Процедуру ОчиститьКэшИПерезапуститьПрограмму() создаем в глобальном модуле и вызываем ее когда нужно почистить кэш 1С
Код 1C v 8.х // Процедура создает и запускает vbs файл, который производит очистку кэша.
// 1С и презапускает программу
//
Процедура ОчиститьКэшИПерезапуститьПрограмму() Экспорт
СкриптФайл = Новый ТекстовыйДокумент;
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
СтрокаЗапускаПрограммы = КаталогПрограммы();
ПутьКФайлуСкрипта = КаталогВременныхФайлов() + "CacheCleaning.vbs";
ПутьКФайлу1С = СтрокаЗапускаПрограммы + "1cv8.exe";
ИмяСервера = "";
ИмяБазы = "";
Путь = "";
КомандаЗапуска = "";
Один = """";
Два = """""";
Три = """""""";
Если (Найти(СтрокаСоединенияСБД, "File=") <> 0) Тогда
Путь = СтрЗаменить(СтрокаСоединенияСБД, "File=", "");
Путь = Лев(Путь, СтрДлина(Путь)-1);
КомандаЗапуска = "WshShell.Run " + Три + ПутьКФайлу1С + Два + " ENTERPRISE /F" + Путь + Один + ", 1, true";
Иначе
МассивПараметровСоединения = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(), ";");
МассивПараметровСервера = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(МассивПараметровСоединения[0], """");
ИмяСервера = СокрЛП(МассивПараметровСервера[1]);
МассивПараметровБазы = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(МассивПараметровСоединения[1], """");
ИмяБазы = СокрЛП(МассивПараметровБазы[1]);
КомандаЗапуска = "WshShell.Run " + Три + ПутьКФайлу1С + Два + " ENTERPRISE /S" + ИмяСервера + "\" + ИмяБазы + Один + ", 1, true";
КонецЕсли;
// Если пользователь не хочет перезапускать сеанс 1С, то после выполнения скрипта ничего не делаем.
Если Не глЗначениеПеременной("глПерезапускатьСеансРаботыСПрограммой") Тогда
КомандаЗапуска = "";
КонецЕсли;
СкриптФайл.УстановитьТекст("WScript.Sleep(5000)
|
|Dim FSO
|Set FSO = WScript.CreateObject(""Scripting.FileSystemObject"")
|Set WshShell = WScript.CreateObject(""WScript.Shell"")
|Set colEnvVars = WshShell.Environment(""Process"")
|
|strComputer = "".""
|Set objWMIService = GetObject(""winmgmts:"" _
|& ""{impersonationLevel=impersonate}!\\"" _
|& strComputer & ""\root\cimv2"")
|
|Set colProcesses = objWMIService.ExecQuery( _
|""S_elect * From Win32_Process "" _
|& ""Where Name = '1cv8.exe'"")
|
|For Each objProcess In colProcesses
| objProcess.Terminate
|Next
|
|WScript.Sleep(1000)
|
|FolderName1 = ""\Local Settings\Application Data\1C\1Cv82""
|FolderName2 = ""\Local Settings\Application Data\1C\1Cv81""
|FolderName3 = ""\appdata\Local\1C\1Cv82""
|FolderName4 = ""\appdata\Local\1C\1Cv81""
|
|If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName1) Then
| GoSubFolders colEnvVars(""userprofile"") & FolderName1
|End If
|If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName2) Then
|GoSubFolders colEnvVars(""userprofile"") & FolderName2
| End If
|If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName3) Then
| GoSubFolders colEnvVars(""userprofile"") & FolderName3
|End If
|If FSO.FolderExists(colEnvVars(""userprofile"") & FolderName4) Then
| GoSubFolders colEnvVars(""userprofile"") & FolderName4
|End If
|
|" + КомандаЗапуска + "
|Set WshShell = Nothing
|
|Sub DelFile(sFILE)
| On Error Resume Next
| FSO.DeleteFile sFILE, True
| If Err.Number <> 0 Then
| Wscript.Echo ""Error deleting file: "" & sFILE
| End If
|End sub
|
|Function GetFolder(sFOLDER)
| On Error Resume Next
| Set GetFolder = FSO.GetFolder(sFOLDER)
| If Err.Number <> 0 Then
| Wscript.Echo ""Error connecting to folder:"" & sFOLDER & VBlf & ""["" & Err.Number & ""]"" & Err.Description
| Wscript.Quit Err.Number
| End If
|End Function
|
|Sub GoSubFolders (objDIR)
| ProcessFilesInFolder objDIR
| Set sFolder = GetFolder(objDIR)
| For Each eFolder in sFolder.SubFolders
| GoSubFolders eFolder
| Next
| FSO.DeleteFolder sFolder, True
|End Sub
|
|Sub ProcessFilesInFolder (objDIR)
|Set sFolder = GetFolder(objDIR)
|For Each objFile in sFolder.Files
| DelFile objFile
|Next
|End Sub");
Попытка
СкриптФайл.Записать(ПутьКФайлуСкрипта, КодировкаТекста.Системная);
ЗапуститьПриложение(ПутьКФайлуСкрипта);
Исключение
КонецПопытки;
КонецПроцедуры
Что хранится в C:\Documents and Settings\User\Application Data\1C\... Категория:
Администрирование Внешние источники данных Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес приложений с твердой уверенностью скажет вам - что ему нравится больше всего в 1С. Конечно конструктор запросов - самый удобный и продуманный механизм написания запросов для получения данных из реляционных структур, который я лично когда-либо встречал. А теперь 1С нам предоставили такую замечательную возможность использовать его не только с 1С, но и с любыми другими таблицами. Вот только в эту "бочку мёда" насыпана куча "ложек дёгтя". Обо всём по порядку:
1) Настройка и использование - без "танцев с бубном" не получится
a) Добавляете внешний источник данных - вроде ничего сложного
б) ставите галочку "Выбрать из списка" - обязательно - это нужно чтобы проверить работоспособность уже в начале и избавит от лишних заморочек
в) - обязательно нажимаем "..." - подключение именно ODBC. Не OLEDB как мы все привыкли, а на уровень ниже
г) А вот здесь будьте ОЧЕНЬ ВНИМАТЕЛЬНЫ.
Это драйвер ODBC - в случае использования клиент-серверной версии он должен обязательно быть на сервере. Если вы ведёте разработку на одной системе, а рабочая версия на другой (как это обычно бывает) убедитесь что вас не ждут сюрпризы. Странная рекоммендация, но выбирайте самый древний или самый общий драйвер в случае если вас не особо заботит скорость и за пределы возможностей стандарта SQL92 вы выходить не намерены. Это обеспечит вам лучшую совместимость. Например для SQL Server 2008 лучшим драйвером будет SQL Server Native Client 11, но рекоммендую выбирать просто SQL Server, иначе этот самый native client придётся устанавливать либо на сервер, либо на все клиентские машины (в случае использования файловой версии), а выигрыша особого для простых задач он не даст.
д) Стандартные диалоги выбора Сервера
и БД
е) На вопрос сохранения пароля рекомендую ответить "да", иначе так и не получится это дело запустить.
ж) Выбираете таблицу и реквизиты... замечательная возможность - её можно сразу же переименовать так как вам нравится (и реквизиты тоже), при этом в свойствах у вас будут отображаться названия полей источника данных
з) А теперь запускаете, открываете конструктор запросов - выбираете тупо все записи из таблицы и ОПА - ошибка. Что делать? Если у вас управляемый интерфейс - заглянуть в меню сервис, а если обычный...
Я лично использовал вот такой код:
Код 1C v 8.х Параметры = ВнешниеИсточникиДанных.DAX.ПолучитьОбщиеПараметрыСоединения();
Параметры.АутентификацияСтандартная = Истина;
Параметры.ИмяПользователя = "sa";
Параметры.Пароль = "pas";
Параметры.СтрокаСоединения = "DRIVER={SQL Server};SERVER=servet;UID=sa;PWD=;DATABASE=database";
Параметры.СУБД = "MSSQLServer";
ВнешниеИсточникиДанных.DAX.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияПользователя(ИмяПользователя(), Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьПараметрыСоединенияСеанса(Параметры);
ВнешниеИсточникиДанных.DAX.УстановитьСоединение();
Может каких-то кусков и не нужно, но это работает.
Выполнить код нужно ОДИН РАЗ. После чего будет нормально подключаться... мистика конечно - зачем это было нужно не понятно...
2) Источники данных только для чтения - Да, чудес не бывает... но иногда так хочется....
3) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВНУТРЕННИМИ ИСТОЧНИКАМИ ДАННЫХ
Меня лично этот факт убил наповал
Как же так.... то чего так ждали и уже представляли и облизывались как мы сейчас в одном запросе соединим наши данные с 1С-кой свернём - сгруппируем, вставим в отчет, а не тут то было...
Но естественно опытных людей это не останавливает... какая мысль пришла в голову? Правильно - временные таблицы:
4) НЕЛЬЗЯ ИХ ИСПОЛЬЗОВАТЬ ВМЕСТЕ С ВРЕМЕННЫМИ ТАБЛИЦАМИ
А вот это уже не похоже на технологические трудности, а очень смахивает на то что нам хотят "чтобы жизнь раем не казалась" сделать
.
5) Можно использовать только в соединениях СКД
Для тех кто не знает - это в СКД на вкладке "Связи наборов данных". Часто вы ими пользуетесь? Удобно? Видимо так нас хотят принудить к использованию их чаще. Вот только там есть колонка "Условие связи" и "Параметр связи". Ни в одной типовой конфигурации не нашел примера их использования, в документации и у Хрусталевой тоже как-то всё не прозрачно. Кто-нибудь сможет мне объяснить как работает "условие связи". Если там написать РеквизитИсточника = РевизитПриемника это не работает. Конечно условие можно записать в поле "Выражение" - в большинстве случаев этого хватает... вот только как-то не очень просто получается.
Итого ранее эта задача решалась где-то так:
Код 1C v 8.х Функция ИнициализироватьИсточникДанных()
ДатаНач = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[5].Значение;
ДатаКон = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[4].Значение;
Если ДатаКон > '20100101' Тогда
ДатаКон = '20100101';
КонецЕсли;
КЧ = Новый КвалификаторыЧисла(15,2);
КС = Новый КвалификаторыСтроки(255);
МассивЧисло = Новый Массив();
МассивЧисло.Добавить(Тип("Число"));
МассивСтрока = Новый Массив();
МассивСтрока.Добавить(Тип("Строка"));
МассивДата = Новый Массив();
МассивДата.Добавить(Тип("Дата"));
//В таблицу будем заполнять бухгалтерскую себестоимость
ТипЧисло = Новый ОписаниеТипов(МассивЧисло,,КЧ);
ТипСтрока = Новый ОписаниеТипов(МассивСтрока,,КС);
ТипДата = Новый ОписаниеТипов(МассивДата);
//таблица для загрузки данных из SQL
ТЗ = Новый ТаблицаЗначений();
ТЗ.Колонки.Добавить("НоменклатураКод", ТипСтрока);
ТЗ.Колонки.Добавить("Qnty", ТипЧисло);
ТЗ.Колонки.Добавить("Период", ТипДата);
ТЗ.Индексы.Добавить("Период");
//Подключаемся к SQL
СтрокаПодключения = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Pwd=;Data Source=;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Reports";
Connection = Новый COMОбъект("ADODB.Connection");
Command = Новый COMОбъект("ADODB.Command");
RecordSet = Новый COMОбъект("ADODB.RecordSet");
Дата = "";
Попытка
Connection.Open(СокрЛП(СтрокаПодключения));
Command.ActiveConnection = Connection;
Command.CommandText = "S_elect * from PH where period >= '" + Строка(Формат(ДатаНач, "ДФ=ггггММдд")) + "' and period <= '" + Строка(Формат(ДатаКон, "ДФ=ггггММдд")) + "'";
RecordSet = Command.Execute();
RecordSet.MoveFirst();
Исключение
Возврат ТЗ;
КонецПопытки;
Пока RecordSet.EOF = Ложь Цикл
Строка = ТЗ.Добавить();
Строка.НоменклатураКод = RecordSet.Fields(RecordSet.Fields.Item(1).Name).Value;
Строка.Qnty = RecordSet.Fields(RecordSet.Fields.Item(12).Name).Value;
Строка.Период = RecordSet.Fields(RecordSet.Fields.Item(13).Name).Value;
RecordSet.MoveNext();
КонецЦикла;
Запрос = Новый Запрос();
ВрТаблица = Новый МенеджерВременныхТаблиц();
Запрос.МенеджерВременныхТаблиц = ВрТаблица;
Запрос.УстановитьПараметр("врТаблицаДанных", ТЗ);
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Запрос.Текст = "ВЫБРАТЬ
| врТаблицаДанных.НоменклатураКод,
| врТаблицаДанных.Qnty,
| врТаблицаДанных.Период
|ПОМЕСТИТЬ ТаблицаДанных
|ИЗ
| &врТаблицаДанных КАК врТаблицаДанных
|ГДЕ
| врТаблицаДанных.Период >= &ДатаНач
| И врТаблицаДанных.Период <= &ДатаКон";
Запрос.Выполнить();
ТЗ = Неопределено;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = ВрТаблица;
Запрос.Текст = "Здесь запрос с участием верменной таблицы";
Результат = Запрос.Выполнить();
Возврат Результат;
КонецФункции
Внешнийнабор = ИнициализироватьИсточникДанных();
НаборДанных = Новый Структура();
НаборДанных.Вставить("ТаблицаSQL", Внешнийнабор);
ТиповыеОтчеты.СформироватьТиповойОтчет(ЭтотОбъект, Результат, ДанныеРасшифровки, ВыводВФормуОтчета, НаборДанных);
Собственно строчек кода не много и они достаточно стандартны... при этом можно пользоваться полным функционалом конструктора запросов, а в СКД отдать только функцию КОМПАНОВКИ ДАННЫХ
Но на вид чуть конечно не так красиво... да и выгрузка в таблицу значений каждый раз нужно код писать и проверять не ошибся ли в названии реквизитов... а то что нам дали в 1С выглядит как-то половинчато. Я ещё не определился чем удобнее пользоваться. Вы решайте, и пишите о ваших решениях, и что вас к ним подтолкнуло.
Автор:
Олег Филиппов Категория:
Встроенные Функции Открытие, перемещение и загрузка файла Пример обработки загрузки данных на управляемой форме, с определением необходимости передачи файла на сервер:
Код 1C v 8.2 УП &НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "*.xml|*.xml";
Если Диалог.Выбрать() Тогда
Объект.ИмяФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ИмяФайлаОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ЗапуститьПриложение(Объект.ИмяФайла);
КонецПроцедуры
&НаКлиенте
Процедура Загрузить(Команда)
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
ws = НСтр(СтрокаСоединения, "ws");
ИмяСервера = НСтр(СтрокаСоединения, "Srvr");
Если ИмяСервера = "" Тогда
Если ws = "" Тогда
ПередачаФайлаНаСервер = Ложь;
Иначе
ПередачаФайлаНаСервер = Истина;
КонецЕсли;
Иначе
ПередачаФайлаНаСервер = (ИмяКомпьютера() <> ИмяСервера);
КонецЕсли;
Если ПередачаФайлаНаСервер Тогда
ПоместитьФайл(АдресХранилища, Объект.ИмяФайла,, Ложь, УникальныйИдентификатор);
КонецЕсли;
ЗагрузитьСервер();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьСервер()
ЧтениеXML = Новый ЧтениеXML;
Если ПередачаФайлаНаСервер Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
Иначе
ЧтениеXML.ОткрытьФайл(Объект.ИмяФайла);
КонецЕсли;
ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
/// Код загрузки
Сообщить("Загрузка завершена");
КонецПроцедуры
Категория:
Работа с Файлами и Каталогами Сохранение рабочей конфигурации в файл средствами встроенного языка Как сохранить рабочую конфигурацию из конфигуратора знают все, но это не всегда удобно. Мне понадобилось сохранять рабочую конфигурацию и тут-же этот файл обрабатывать. Предлагаю простую процедуру:
Код 1C v 8.х // функция сохраняет рабочую конфигурацию в файл, в случае успеха возвращает Истина
// параметры:
// Логин - имя пользователя с правами на админисирирование БД
// Пароль - строка пароля
// ИмяФайла - полное имя файла для сохранения конфигурации, не обязательно.
// по умолчанию использует каталог временных файлов и имя 1Cv8.cf
функция СохранитьТекущуюКонфигурацию (Логин, Пароль, ИмяФайла="") экспорт
результат = Ложь;
Если ИмяФайла = "" Тогда
ИмяФайла = КаталогВременныхФайлов() + "1Cv8.cf";
КонецЕсли;
СтрокаБазы = СтрокаСоединенияИнформационнойБазы();
Если Лев(СтрокаБазы, 5) = "File=" Тогда
// файловый вариант
СтрокаБазы = Сред(СтрокаБазы, 6, СтрДлина(СтрокаБазы) - 6);
Иначе
// серверный вариант пока не готов...
// может кто допишет?
возврат Ложь;
КонецЕсли;
ВыбФайл = Новый Файл(ИмяФайла);
Если ВыбФайл.Существует() Тогда
Сигнатура = Строка(ВыбФайл.Размер()) + Строка(ВыбФайл.ПолучитьВремяИзменения());
Иначе
Сигнатура = "";
КонецЕсли;
СтрокаЗапуска = """" + КаталогПрограммы() + "1cv8.exe"" CONFIG /F " + СтрокаБазы
+ ?(Логин = "", "", " /N " + Логин)
+ ?(Пароль = "", "", " /P " + Пароль) + " /DumpDBCfg """ + ИмяФайла + """";
//
// КомандаСистемы (СтрокаЗапуска); не работает!!!!! из-за кавычек в параметрах
// приходиться идти кругом...
// зато можно избежать черного окошка
//
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(СтрокаЗапуска, 0, Истина);
ВыбФайл = Новый Файл(ИмяФайла);
Если ВыбФайл.Существует() Тогда
НоваяСигнатура = Строка(ВыбФайл.Размер()) + Строка(ВыбФайл.ПолучитьВремяИзменения());
Если Сигнатура <> НоваяСигнатура Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
ну и пример использования (работает если нет пароля):
Код 1C v 8.х Функция ЗаписатьКонфигурациюВФайл(ИмяФайла="")
Результат = Ложь;
ВыбФайл = Новый Файл(ИмяФайла);
Если ВыбФайл.Существует() Тогда
Если ВыбФайл.ЭтоКаталог() Тогда
ИмяФайла="";
КонецЕсли;
КонецЕсли;
Попытка
Массив = ПользователиИнформационнойБазы.ПолучитьПользователей();
Логин = "";
Пароль = "";
Если Массив.Количество() > 0 тогда
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Логин = Пользователь.Имя;
Если Пользователь.ПарольУстановлен Тогда
// тут нужно получить пароль, лучше интерактивно
// но лично мне это совсем не нужно
Предупреждение("У Вас установлен пароль, этот режим сейчас не доступен");
Возврат Ложь;
КонецЕсли
КонецЕсли;
Результат = СохранитьТекущуюКонфигурацию(Логин, Пароль, ИмяФайла);
Если не Результат Тогда
Предупреждение("Конфигурация не сохранена");
Иначе
Сообщить("Конфигурация успешно сохранена в файл: " + ИмяФайла);
КонецЕсли;
Исключение
Предупреждение("У Вас не достаточно прав для сохранения конфигурации");
Возврат Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Автор статьи: vde69 Категория:
Полезные, Универсальные Функции Функция выборки данных из SQL сервера и передача во временную таблицу 1С Код 1C v 8.х Функция ЗапросSQL (SQLServer,Login,Password,ЗапросSQL)
СтрокаСоединения = ("Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer +
(";UID=") + Login + ("; PWD=") + Password + (";");
СоединениеSQL = Новый ComObject("ADODB.Connection");
СоединениеSQL.ConnectionString=СтрокаСоединения;
Попытка
СоединениеSQL.Open();
Состояние ("Подключение к серверу SQL...");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Состояние ("Выполнение запроса SQL...");
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
ЗаписиSQL.ActiveConnection = СоединениеSQL;
ЗаписиSQL = СоединениеSQL.Execute (ЗапросSQL);
Таблица = Новый ТаблицаЗначений;
Состояние ("Заполнение временной таблицы...");
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
//Сообщить(ИмяСтолбца);
КонецЦикла;
Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы
НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
//Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
КонецЦикла;
ЗаписиSQL.MoveNext();
КонецЦикла;
Состояние ("Закрываем соединение с SQL...");
ЗаписиSQL.Close();
СоединениеSQL.Close();
Возврат Таблица; // Возврат таблицы значений запроса SQL
КонецФункции
Категория:
COM-объекты, WMI, WSH База для Разработки или Рабочая? Как быстро определить? Когда-то я работал консультантом
SAP . В SAPe есть настройка изменения цвета главного окна программы и у нас было негласное правило:
Рабочая программа - Красный фон ,
Тестовая - Зеленый ,
Разработка - Синий .
Работая в 1С, всегда открыто по 5-6 программ, и перепутать рабочую базу с базой для тестирования, не составляет труда.
Конечно, можно зайти
Справка - О программе и посмотреть значения
Режим, База, Каталог . Но я решил применить опыт SAP проектов к 1С:
1. Нужно чтобы в заголовке программы всегда отображалось с какой базой работаем.
Для этого в Модуль приложения, в самый конец процедуры ПриНачалеРаботыСистемы() добавляем:
Код 1C v 8.х // Мигачев Евгений
УстановитьЗаголовокСистемы(Метаданные.Синоним+" ( База: "+СтрокаСоединенияИнформационнойБазы()+" )");
2. Нужно чтобы рабочая база была в стандартных цветах, а база разработки
Сине-бирюзовый
У нас разделение следующее, на сервере только рабочие базы, базы разработки на локальных компьютерах, соответственно серверные базы должны быть как обычно, локальные
Сине-бирюзовые .
Для этого открываем конфигурацию - Общие -Стили - Копируем и вставляем слой
Основной , получается
Основной1 , меняем его название на
Разработка и открываем. В своем примере я меняю только цвет
Фона кнопки на
Сине-бирюзовый и в Модуль приложения, в самый конец процедуры ПередНачаломРаботыСистемы() добавляю:
Код 1C v 8.х // Мигачев Евгений Изменение Стиля в зависимости от базы
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
// в зависимости от того файловый это вариант БД или нет, по-разному отображается путь в БД
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "FILE=");
Если ПозицияПоиска = 1 тогда
//База "Файловая", меняем стиль отображения
ГлавныйСтиль=БиблиотекаСтилей["Разработка"];
Иначе
//База "Серверная" - оставляем все как есть
КонецЕсли;
Так выглядит Рабочая база, только еще
Строка Соединения Информационной Базы в заголовке:
А так
Сине-бирюзовая база для разработок:
Автор: Мигачев Евгений Категория:
Полезные, Универсальные Функции Как посмотреть список баз, зарегистрированных в выбранном кластере? Код 1C v 8.х // В приведенном примере производится подключение к агенту сервера, выбирается первый кластер.
// Для этого кластера получается список информационных баз, который затем обходится в цикле.
Соединитель = Новый COMObject("V81.COMConnector");
ИмяМашины = "SERVANT";
Порт = "1540";
СтрокаСоединения = "TCP://" + ИмяМашины + ":" + Порт;
СоединениеСАгентом = Соединитель.ConnectAgent(СтрокаСоединения);
МассивКластеров = СоединениеСАгентом.GetClusters();
// получается первый массив кластера.
ОписаниеКластера = МассивКластеров.GetValue(МассивКластеров.GetLowerBound());
// в случае если определены администраторы кластера, должны быть указаны данные о логине.
СоединениеСАгентом.authenticate(ОписаниеКластера, " ", " ");
МассивБаз = СоединениеСАгентом.GetInfoBases(ОписаниеКластера);
МаксимальныйИндекс = МассивБаз.GetUpperBound();
Для ТекущийИндекс = МассивБаз.GetLowerBound() По МаксимальныйИндекс Цикл
ОписаниеБазы = МассивБаз.GetValue(ТекущийИндекс);
Сообщить(ОписаниеБазы.Descr);
Сообщить(ОписаниеБазы.Name);
КонецЦикла;
Категория:
Полезные, Универсальные Функции Формирование списка зарегистрированных информационных баз системы 1Cv8 В отличие от 1Cv7 (
где список зарегистрированных информационных баз хранится в системном реестре (Щелкните для просмотра примеров) ):
в 1C v 8 :
список зарегистрированных информационных баз хранится в текстовом файле v8ib.lst (кодировка UTF-8)
в каталоге \Application Data\1C\1Cv8 текущего пользователя на локальном компьютере (где запускается программа 1С:Предприятие v 8).
т.е. C:\Documents and Settings\%CurrentUser%\Application Data\1C\1Cv8\v8ib.lst
в 1C v 8.1 :
список зарегистрированных информационных баз хранится в текстовом файле ibases.v8i (кодировка UTF-8)
в каталоге \Application Data\1C\1Cv81 текущего пользователя на локальном компьютере (где запускается программа 1С:Предприятие v 8).
т.е. C:\Documents and Settings\%CurrentUser%\Application Data\1C\1Cv81\ibases.v8i
Если открыть этот файл в NotePad.exe, то видно, что он имеет структуру, схожую со стандартным INI-файлом :
[База Разработки]
Connect=File="F:\1C\1Cv8\DBRaz";
ID=1cd97bfa-4e57-4a23-9ee1-073a0a28e01c
OrderInList=16384
Folder=/
OrderInTree=16384
[Enterprise]
Connect=File="F:\1C\1Cv8\1cv8.db\Enterprise";
ID=647840fa-65e0-44e8-ad40-12476f178b92
OrderInList=20480
Folder=/
OrderInTree=32768
в 1C v 8.2 :
список зарегистрированных информационных баз хранится в текстовом файле ibases.v8i (кодировка UTF-8)
в каталоге \Application Data\1C\1Cv8 текущего пользователя на локальном компьютере (где запускается программа 1С:Предприятие v 8).
т.е. C:\Documents and Settings\%CurrentUser%\Application Data\1C\1CEStart\ibases.v8i
Если открыть этот файл в NotePad.exe, то там:
[1C:Документооборот 8 (демо)]
Connect=File="C:\Documents and Settings\E.S.Migachev\Мои документы\1C\DemoDoc8";
ID=b3b46c21-bd2a-481e-b100-e6cbdcba3e3d
OrderInList=16384
Folder=/
OrderInTree=256
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.2
Структура хранения информации по каждой информационной базе :
<Наименование информационной базы>
<ID>
<Connect>
<Folder>
<OrderInList>
<OrderInTree>
Где:
Connect - строка соединения с информационной базой,
ID - внутренний идентификатор информационной базы,
OrderInList - порядок в списке при представлении списком
Folder - наименование ветви в дереве информационных баз,
OrderInTree - порядок в ветви при представлении деревом.
В 1С 8.1 еще добавили External - но он всегда равен 0, для чего он пока не известно.
В 1С 8.2 добавлено:
ClientConnectionSpeed=Normal - скорость соединения
App=Auto - тип соединения - толстый, тонкий клиент.
WA=1
Version=8.2
Вот код получения получения списка баз из файла 1С 8.0 8.1 8.2
Код 1C v 8.х
Функция ПолучимСписокБаз1СИзФайла(Версия)
// Функция получения списка баз 1С 8.0 8.1 8.2 E_Migachev
// Возвращает Таблицу Значений содержащую Название, СтрокаСоединения с базами 1С
// Для начала получим программным путем полный путь к папке Application Data
// Способ из https://helpf.pro/faq/view/271.html
App = Новый COMОбъект("Shell.Application");
AppData=App.Namespace(26).Self.Path;
ТЗБаз=Новый ТаблицаЗначений;
ТЗБаз.Колонки.Добавить("Название",,"Название",25);
ТЗБаз.Колонки.Добавить("СтрокаСоединения",,"СтрокаСоединения",30);
Если Версия = "v80" Тогда
СписокБаз=AppData+"\1C\1Cv8\v8ib.lst";
ИначеЕсли Версия = "v81" Тогда
СписокБаз=AppData+"\1C\1Cv81\ibases.v8i";
ИначеЕсли Версия = "v82" Тогда
СписокБаз=AppData+"\1C\1CEStart\ibases.v8i";
КонецЕсли;
Сообщить("Файл со списком баз: "+Строка(СписокБаз));
//Открываем файл в кодировке UTF8
ФайлБаз= Новый ЧтениеТекста;
ФайлБаз.Открыть(СписокБаз, КодировкаТекста.UTF8);
Стр = ФайлБаз.ПрочитатьСтроку();
Пока НЕ Стр = Неопределено Цикл
Если СтрДлина(СокрЛП(Стр)) Тогда
ТекущаяСтрока = СокрЛП(Стр);
Если Лев(ТекущаяСтрока, 1) = "[" Тогда
НоваяСтрока = ТЗБаз.Добавить();
НоваяСтрока.Название = ТекущаяСтрока;
КонецЕсли;
Если Лев(ТекущаяСтрока, 8) = "Connect=" Тогда
Попытка
НоваяСтрока.СтрокаСоединения = Прав(ТекущаяСтрока, СтрДлина(ТекущаяСтрока)-8);
Исключение
// Это группа
НоваяСтрока.СтрокаСоединения = "";
КонецПопытки;
КонецЕсли;
КонецЕсли;
Стр = ФайлБаз.ПрочитатьСтроку();
КонецЦикла;
//Удалим из ТЗ строки с пустой Строкой Соединения, т.к это группы, а они нам не нужны
ПустыеСтроки = ТЗБаз.НайтиСтроки(Новый Структура("СтрокаСоединения",));
Для каждого СтрокаТаблицы Из ПустыеСтроки Цикл
ТЗБаз.Удалить(СтрокаТаблицы)
КонецЦикла;
Возврат ТЗБаз;
КонецФункции
Процедура ПолучимИзФайла(Кнопка)
ТЗБаз = ПолучимСписокБаз1СИзФайла(Кнопка.Имя);
//Выведем список баз из ТЗ в табличное поле
Список=ТЗБаз;
ЭлементыФормы.Список.СоздатьКолонки();
КонецПроцедуры
Пример обработки для 1С 8.1 "Получения списка баз 1С 8.0 8.1 8.2 E_Migachev"
Скачивать файлы может только зарегистрированный пользователь!
Обработка для 1С 8.1 "Чтение списка информационных баз 1С 8.1"(формирует дерево баз) Fisca
Скачивать файлы может только зарегистрированный пользователь! Категория:
Полезные, Универсальные Функции Получения курса валют из Интернет Код 1C v 8.х Соединение = Новый HTTPСоединение("export.rbc.ru"); //готовим соединение
ИмяФайла = ПолучитьИмяВременногоФайла(".txt");
//строка-образец
//http://export.rbc.ru/free/cb.0/free.fcgi?period=DAILY&tickers=USD&d1=18&m1=01&y1=2009&d2=17&m2=02&y2=2009&lastdays=30&separator=TAB&data_format=BROWSER&header=1
//http://export.rbc.ru/free/cb.5/free.fcgi?period=DAILY&tickers=USDEUR_BASKET&d1=08&m1=07&y1=2009&d2=22&m2=07&y2=2009&lastdays=14&separator=TAB&data_format=BROWSER&header=1
СтрокаСоединения="/free/"+Источник+"/free.fcgi?period=DAILY&tickers="+Валюта1+"&d1="+День1+"&m1="+Месяц1+"&y1="+Год1+"&d2="+День2+"&m2="+Месяц2+"&y2="+Год2+"&separator=%7C&data_format=BROWSER";
СтрокаСоединения=СтрЗаменить(СтрокаСоединения," ","");
Попытка //соединяемся
Соединение.Получить(СтрокаСоединения,ИмяФайла);
Исключение
Сообщить("Невозможно получить курс по адресу http://export.rbc.ru"+СтрокаСоединения);
КонецПопытки;
КурсыТекст=Новый ТекстовыйДокумент; //читаем результат запроса
КурсыТекст.Прочитать(ИмяФайла);
Код 1C v 8.х // еще пример
Функция ПолучитьКакСтроку(Адресс)
соминет = Новый COMОбъект("MSXML2.XMLHTTP");
соминет.open ("GET", Адресс, Ложь);
соминет.send();
Возврат соминет.responseText;
КонецФункции
Функция ПреобразоватьДату(дат)
// Медот преобразования даты времен 1Сv7
//Т=Строка(Дат);
//Возврат Сред(Т,7,4)+"/"+Сред(Т,4,2)+"/"+Лев(Т,2);
Возврат Формат(Дат,"ДФ=""гггг/ММ/дд""");
КонецФункции
Процедура КнопкаЗагрузитьКурсы(Элемент)
//Список - список валют
Для А = 1 по Список.Количество() цикл
Если Список[а-1].Пометка тогда
Сообщить("Загружаем курсы для "+Строка(Список[а-1].Значение));
Код = Строка(Список[а-1].Значение.Код);
Дат = ПериодС;
Пока Дат <= ПериодПо цикл
Стр = ПолучитьКакСтроку("http://cbrates.rbc.ru/tsv/"+Код+"/"+ПреобразоватьДату(Дат)+".tsv");
Поз = Найти(Стр,Символы.Таб);
Если Поз = 0 Тогда
Дат = Дат + 86400;
Продолжить;
КонецЕсли;
Кратность = Число(СокрЛП(Лев(стр,Поз-1)));
курс = Число(СокрЛП(Сред(Стр,Поз+1,СтрДлина(Стр)-Поз)));
Сообщить("Дата="+Строка(Дат)+" Курс="+Строка(курс)+" Кратность="+Строка(Кратность));
Запись = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Запись.Период = Дат;
Запись.Валюта = Список[а-1].Значение.Ссылка;
Запись.Курс = Курс;
Запись.Кратность = Кратность;
Запись.Записать(Истина);
Дат = Дат + 86400;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Код 1C v 7.x // Взято с http://www.1c-club.kz IUnknown
//Небольшая обработка для получения курса валют размещенной на странице Национального Банка РК.
//Внимание: работоспособность данной обработки может быть нарушена, если дизайнеры сайта НБ РК изменят формат страницы с //официальным курсом валюта. Но не большой анализ нового формата и работоспособность обработки будет восстановлена.
// шаблон для отображаемой на форме таблице значения
перем тзПустышка;
//*******************************************
// ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
//
// Параметры:
// стрНазвание - Строка. Наименование реквизита формы инициюрующей
// вызов процедуры.
// чисФлаг - Число. Флаг станадартной обработки иницации нажатия
// кнопки выбора значения.
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Переопределенная процедура инициирующая при нажатии кнопки
// выбора значения реквизита формы.
//
процедура ПриНачалеВыбораЗначения(стрНазвание, чисФлаг)
// Если инициировали из реквизита "стрУРЛа"
если стрНазвание = "стрУРЛа" тогда
// откроем страницу с введенным URL
запуститьприложение(стрУРЛа);
конецесли;
конецпроцедуры
//*******************************************
// кнПолучить()
//
// Параметры:
// Нет
//
// Возвращаемое значение:
// Нет.
//
// Описание:
// Процедура получающая курсы валют с URL находящегося в
// строковом реквизите формы "стрУРЛа". Пытается по указаноому URL
// получить страницу и распарсить ее.
//
// ПРЕДУПРЕЖДЕНИЕ:
// В случае измения формата данных представленных на странице, возможно
// будет работать не правильно.
//
процедура кнПолучить()
// сгенирим имя файла для временного хранения содержимого
// страницы курса валют Национального банка
стрИмяФайла = каталогпользователя() + "$$$$.###";
// создадим объект XMLHttpRequest
олеХМЛ = создатьобъект("Microsoft.XMLHTTP");
// иницируем его типом запроса и нужным нам URL
олеХМЛ.Open("GET", стрУРЛа, 0);
// отправим запрос для обработки серверу
олеХМЛ.Send();
// создадим "поток" через ADODDB для работы с данными
олеАДО = создатьобъект("ADODB.Stream");
// зададим тип и режим потока
олеАДО.Mode = 3;
олеАДО.Type = 1;
// откроем его
олеАДО.Open();
// создадим объект для управления скриптами
олеШелл = создатьобъект("MSScriptControl.ScriptControl");
// установим язык сценариев
олеШелл.Language = "vbscript";
// добавим созданные объекты
олеШелл.AddObject("oleADO", олеАДО);
олеШелл.AddObject("oleXML", олеХМЛ);
// с помощью скрипта запишем в поток ADO данные из
// объекта XMLHttpRequest
// то есть содержимое страницы
олеШелл.Eval("oleADO.Write(oleXML.ResponseBody)");
// запишем данные во временный файл
олеАДО.SaveToFile(стрИмяФайла, 2);
// закроем данный поток
олеАДО.Close();
// для ускорения парсера занесем весь файл в строковую
// переменую с разделителем строк
// для этого инициализуруем поток установкой
// соотвествующим режимом и типом
олеАДО.Mode= 3;
олеАДО.Type = 2;
// так как страница курса валют НБК имеет формат
// символов UTF-8, то установим соотвествующий набор
олеАДО.CharSet="UTF-8";
// откроем поток
олеАДО.Open();
// загрузим содержимое нашего файла в поток
олеАДО.LoadFromFile(стрИмяФайла);
// обнулим временную строковую переменную
стрТемп = "";
// в цикле получим из потока все строки
пока олеАДО.EOS() = 0 цикл
// и запишем их во временную переменую, добавив разделитель строк
стрТемп = стрТемп + олеАДО.ReadText(-2) + разделительстрок;
конеццикла;
// закроем поток
олеАДО.Close();
// удалим временный файл
фс.УдалитьФайл(стрИмяФайла);
// найдем в строке позицию начала блока с данными о курсе
чисПозиция = найти(стрТемп, "Официальные курсы валют на");
если чисПозиция = 0 тогда
// если позиции нет ... то мы имем другую страницу
// или другой формат страницы...
предупреждение("Не получилось получить курсы валют");
иначе
// создаим временную таблицу значений
// для более шустрого заполения из-за отстуствия вызова
// функции перерисовки таблицы при изменении данных
тзТемп = создатьобъект("ТаблицаЗначений");
// установим для нее нужный формат
тзПустышка.Выгрузить(тзТемп);
// отрежем все лишнее
стрТемп = сред(стрТемп, чисПозиция);
// получим дату курса
дтКурса = дата(стрзаменить(стрполучитьстроку(стрТемп, 2), "/", "."));
// первая строка с курсом валюты находится на 18 строке от начала
// после удаления мусора
чисПозиция = 18;
// узнаем сколько всего строк в многострочке
чисКоличествоСтрок = стрколичествострок(стрТемп);
// получим строку
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
// если в строке есть подстрока ... то значит это наверное очередная валюта
пока найти(стрТекущая, "input type=""checkbox"" name=""idval""") > 0 цикл
// добавляем новую строку
тзТемп.НоваяСтрока();
// получаем строку со смещением 1 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 1);
// используя фичу 1С по преобразованию, получим число
// за сколько единиц валюты имеем курс в тенге
тзТемп.Количество = число(стрТекущая);
// путем убирания "мусора" получаем наименование валюты
тзТемп.Наименование = сокрлп(стрзаменить(стрзаменить(стрТекущая, тзТемп.Количество, ""), "</td>", ""));
// получаем строку со смещением 2 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 2);
// убираем html мусор
стрТекущая = сокрлп(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// получаем код валюты
тзТемп.Код1 = лев(стрТекущая, 3);
// получаем код валюты "Тенге"
тзТемп.Код2 = прав(стрТекущая, 3);
// получаем строку со смещением 5 от позиции
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция + 5);
// очищаем от мусора и преобразуем в число... получаем курс
тзТемп.Курс = число(стрзаменить(стрзаменить(стрТекущая, "<td class=""gen7"" align=""center"">", ""), "</td>", ""));
// увеличиваем позицию на 17 ...
чисПозиция = чисПозиция + 17;
если чисПозиция > чисКоличествоСтрок тогда
// если позици дальше имеющихся строк
// то все курсов больше нет
стрТекущая = "";
иначе
// получаем очередную строку для разбора
стрТекущая = стрполучитьстроку(стрТемп, чисПозиция);
конецесли;
конеццикла;
// сформированую таблицу копируем в таблицу на форме
тзТемп.Выгрузить(тзКурсов);
конецесли;
конецпроцедуры
//*******************************************
// установим значение реквизита текущим URL по которому можно получить курс валют
стрУРЛа = "http://www.nationalbank.kz/?docid=460&uid=DD54B73C-802C-E8F0-E27EDF82ECF77C1D";
// формируем формат таблицы
тзПустышка = создатьобъект("ТаблицаЗначений");
тзПустышка.НоваяКолонка("Количество", "число", 3, 0, "", 5);
тзПустышка.НоваяКолонка("Наименование", "строка", , , "Наименование", 70);
тзПустышка.НоваяКолонка("Код1", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Код2", "строка", 3, , "код", 10);
тзПустышка.НоваяКолонка("Курс", "число", 7, 2, "Курс", 10);
// копируем получившийся формат в таблицу на форме
тзПустышка.Выгрузить(тзКурсов);
Категория:
COM-объекты, WMI, WSH Пример подключения к MySQL базе Код 1C v 8.х // Пример 1
Сервер="IP-адрес-сайта"; // IP адрес сайта
ПользовательСервера="имя-пользователя-базы-данных"; // имя пользователя базы данных
ПарольСервера="пароль-пользователя-базы-данных"; // пароль пользователя базы данных
БазаСервера="название-SQL-базы-данных"; // название SQL базы данных
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение_param = "driver={MySQL ODBC 5.1 Driver}; server="+СокрЛП(Сервер)+"; uid="+СокрЛП(ПользовательСервера)+"; pwd="+СокрЛП(ПарольСервера)+"; database="+СокрЛП(БазаСервера)+"; STMT=SET CHARACTER SET utf8";
Try
Соединение.open(Соединение_param);
СоединениеУстановлено = Истина;
Сообщить("Соединение установлено");
Except
ТекстСообщения = ""+ТекущаяДата()+" Connection error: "+ОписаниеОшибки();
Сообщить(ТекстСообщения);
СоединениеУстановлено = Ложь;
return;
EndTry;
Код 1C v 8.х ]// Пример 2
Соединение = Новый COMОбъект("ADODB.Connection");
ConnectionString = "driver={SQL Server}; server=; uid=; Pwd=; Database = "; // это для MS SQL строка
Попытка
Соединение.Open(ConnectionString);
Сообщить("Соединение осуществлено в "+ТекущаяДата());
Исключение
Предупреждение("Невозможно установить соединение");
Возврат;
КонецПопытки;
ТекстЗакпроса = "....................";
НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
НаборЗаписей.ActiveConnection = Соединение;
НаборЗаписей.Open(ТекстЗапроса);
Пока не НаборЗаписей.Eof() Цикл
// ............код обработки.....................
НаборЗаписей.MoveNext();
КонецЦикла;
НаборЗаписей.Close();
Соединение.Close();
Сообщить("Обработка завершена в "+ТекущаяДата());
Код 1C v 7.x DB = СоздатьОбъект("ODBCDatabase");
DB.Соединение("DRIVER={MySQL ODBC 5.1 Driver}; SERVER=IP_Супер_мега_сервера; DATABASE=Мега_база; USER=Супер_юзер; PASSWORD=пароль_супер_мега_юзера; OPTION=3;");
RS = СоздатьОбъект("ODBCRecordSet");
RS.SetDatabase(DB);
Если RS.Выполнить("set names cp1251") = 0 Тогда
Сообщить("Ошибка подключения к MySQL" + РазделительСтрок + RS.ПолучитьОписаниеОшибки());
СтатусВозврата(0);
Возврат;
КонецЕсли;
Используя DSN . Большой плюс dsn есть режим проверки и также в текстах 1с
уже не нужен пользователь и пароль. Все детали скрыты в dsn
вот мой успешно работающий код для MY SQL
Код 1C v 7.x sql = СоздатьОбъект("ODBCDatabase");
Имя0 = "DragNet";
Фл1 = sql.Соединение("DSN=" + Имя0 + ";");
Если Фл1 = 0 Тогда
Сообщить("Не смогли открыть DSN = " + Имя0);
Сообщить("Ошибка = " + sql.ПолучитьОписаниеОшибки() );
Иначе
sql.УстТолькоЧтение(1);
КонецЕсли;
rc = СоздатьОбъект("ODBCRecordSet");
rc.УстБД(sql);
еще, драйвер 3.51:
Код 1C v 7.x //Тестируем установку параметров соединения
клМускул = СоздатьОбъект("ODBCDatabase");
клМускул.СтрокаСоединения = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;
|Port=3306;Database=_1c;User=_1c_user; Password=_1c_pass;
|Option=3;";
Результат = клМускул.СтрокаСоединения;
ПроверитьРавенство(Результат,"Driver={MySQL ODBC 3.51 Driver};Server=localhost;
|Port=3306;Database=_1c;User=_1c_user; Password=_1c_pass;
|Option=3;");
Категория:
COM-объекты, WMI, WSH Заполнение табличного поля данными таблицы значений, полученной из SQL - Запроса Код 1C v 8.х Процедура ЗаполнитьНажатие(Элемент)
запрос = СоставитьЗапрос(); //Функция СоставитьЗапрос() возвращает строку запроса
ТаблицаВывода = Новый ТаблицаЗначений;
ТаблицаВывода.Очистить();
ТаблицаВывода = ЗапросКСкуль(CRM_MSSQL_Сервер,CRM_MSSQL_БазаДанных,CRM_MSSQL_Логин,CRM_MSSQL_Пароль,Запрос);
ТабличноеПоле.Очистить();
ЭлементыФормы.ТабличноеПоле.Значение=ТаблицаВывода;
ЭлементыФормы.ТабличноеПоле.СоздатьКолонки();
КонецПроцедуры
Функция ЗапросКСкуль(SQLServer,DSN,Login,Password,txtSQL)
Соединение = Новый COMОбъект("ADODB.Connection");
НаборЗаписей = Новый ComObject("ADODB.RecordSet");
Команда = Новый COMОбъект("ADODB.Command");
Соединение.ConnectionString = ("Provider=SQLOLEDB; Data Source = ") + SQLServer +
(";Initial Catalog=") + DSN + (";UID=") + Login + ("; PWD=") + Password + (";");
Соединение.ConnectionTimeOut = 15;
//Попытка
Соединение.Open();
// Сообщить("Connect");
//Исключение
// Сообщить("No connect");
//КонецПопытки;
Команда.ActiveConnection = Соединение;
Команда.CommandText = txtSQL;
//Попытка
НаборЗаписей = Команда.Execute ();
// Сообщить("Add record");
//Исключение
// Сообщить("No I_nsert");
//КонецПопытки;
Таблица = Новый ТаблицаЗначений;
//Состояние ("Заполнение временной таблицы...");
Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
ИмяСтолбца =НаборЗаписей.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
//Сообщить(ИмяСтолбца); // Тестовая строка
КонецЦикла;
Пока НЕ НаборЗаписей.EOF Цикл // Заполнение созданной таблицы
НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По НаборЗаписей.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,НаборЗаписей.Fields(НомерСтолбца).Value);
//Сообщить ("Test " + ЗаписиSQL.Fields(НомерСтолбца).Value + ЗаписиSQL.Fields(НомерСтолбца).Name);
КонецЦикла;
НаборЗаписей.MoveNext();
КонецЦикла;
//Состояние ("Закрываем соединение с SQL...");
Соединение.Close();
Возврат Таблица;
КонецФункции
Код 1C v 8.х Функция ЗапросSQL (SQLServer,Login,Password,ТекстSQL) //Функция выборки данных из SQL сервера и передача во временную таблицу 1С
СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer +
(";UID=") + Login + ("; PWD=") + Password + (";");
Подключение = Новый ComObject("ADODB.Connection");
Подключение.ConnectionString=СтрокаСоединения;
Попытка
Подключение.Open(СтрокаСоединения);
Состояние ("Подключение к серверу SQL...");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.NamedParameters = True;
СоединениеSQL.CommandText = ТекстSQL;
СоединениеSQL.CommandType = 1;
//СоединениеSQL.Prepared = Истина;
Param1 = СоединениеSQL.CreateParameter("n",3,1,1,1);
СоединениеSQL.Parameters.Append(Param1);
Param2 = СоединениеSQL.CreateParameter("ДатаПриходаС",200,1,8,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);
Param3 = СоединениеSQL.CreateParameter("ДатаПриходаПо",200,1,8,Формат(КонецПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);
СоединениеSQL.Parameters.Refresh();
Состояние ("Выполнение запроса SQL...");
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
ЗаписиSQL = СоединениеSQL.Execute();
Таблица = Новый ТаблицаЗначений;
Состояние ("Заполнение временной таблицы...");
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
Сообщить(ИмяСтолбца);
КонецЦикла;
Пока ЗаписиSQL.EOF = 0 Цикл // Заполнение созданной таблицы
НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
КонецЦикла;
ЗаписиSQL.MoveNext();
КонецЦикла;
Состояние ("Закрываем соединение с SQL...");
ЗаписиSQL.Close();
Подключение.Close();
Возврат Таблица; // Возврат таблицы значений запроса SQL
КонецФункции
Категория:
COM-объекты, WMI, WSH Как определить какая база "Файловая" или "Серверная"? Функция возвращает вариант базы данных "Файловая" или "Серверная":
Код 1C v 8.х Функция КакаяБаза()
СтрокаСоединенияСБД = СтрокаСоединенияИнформационнойБазы();
// в зависимости от того файловый это вариант БД или нет, по-разному отображается путь в БД
ПозицияПоиска = Найти(Врег(СтрокаСоединенияСБД), "FILE=");
Если ПозицияПоиска = 1 тогда
Возврат "Файловая";
Иначе
Возврат "Серверная";
КонецЕсли;
КонецФункции
Категория:
Полезные, Универсальные Функции