Произошла ошибка при работе с SMTP. Код ошибки: 27 (Ошибка установки защищенного SSL/TLS соединения. После обновления на платформу 8.3.23 и далее 8.3.24. При рассылке сообщений на электронную почту появляется ошибка:
Произошла ошибка при работе с SMTP. Код ошибки: 27 (Ошибка установки защищенного SSL/TLS соединения.)"
Произошла ошибка при работе с IMAP ...
Это ошибка1С https://bugboard.v8.1c.ru/error/000142347
Описание:
При использовании почтового сервера imap.gmail.ru происходит ошибка
Произошла ошибка соединения с сервером при работе с IMAP. Код ошибки: 43 Ошибка установки защищенного SSL/TLS соединения
Способ обхода:
В conf.cfg добавить опцию IgnoreInternetMailServerCertificateVerificationList:
Код Batch File (DOS, CMD, BAT) IgnoreInternetMailServerCertificateVerificationList=imap.gmail.com;smtp.gmail.com
В баг репорте ошибка описана для почты gmail, но у нас свой почтовый сервер и ошибка та же самая, и попутно было обнаружено, что и с mail.ru такая же есть ошибка, а вот Yandex.ru ошибку не дает.
Файл conf.cfg находится в папке C:\Program Files\1cv8\conf (для 64 платформы).
Сделайте запись по примеру выше. только замените gmail.com на свой сервер
Категория:
Работа с Интернет, Почтой (Mail), FTP Как найти документ по уникальному идентификатору через com соединение? Потребовалось написать небольшую синхронизацию данных в дополнении к стандартной УТ-БП, нужно по уникальному идентификатору искать документы:
Стандартное Соединение.Справочники.Номенклатура.ПолучитьСсылку(УИ);
Выдает ошибку {Форма.Форма.Форма(301)}: Ошибка при вызове метода контекста (ПолучитьСсылку): Произошла исключительная ситуация: Несоответствие типов (параметр номер '1')
Нужно уникальный идентификатор создавать в com: Соединение.Справочники.Номенклатура.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИ)));
Рабочий пример:
Код 1C v 8.3 &НаСервере
Функция ПодключитьБазуНаСервере(Соединение = "")
Объект.ФайловаяБазаДанных=Ложь;
Объект.Сервер="srv1с";
Объект.База="buh";
Объект.ИмяПользователя="Obmen";
Объект.Пароль="1qaz";
// Подключение к 1С
Если Объект.ФайловаяБазаДанных Тогда
СтрокаПодключения = "file='" + Объект.ПутьКБазе + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
Иначе
СтрокаПодключения = "srvr='" + Объект.Сервер + "'; ref='" + Объект.База + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
КонецЕсли;
Попытка
V8 = Новый COMObject("V83.COMConnector");
Соединение = V8.Connect(СтрокаПодключения);
ЕстьСоединение = Истина;
Исключение
ЕстьСоединение = Ложь;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат Соединение;
КонецФункции
&НаСервере
Процедура ОбновитьДанныеПлатежейНаСервере()
Соединение = ПодключитьБазуНаСервере();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка КАК Ссылка,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа КАК ОснованиеПлатежа,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Сумма КАК Сумма
|ИЗ
|Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа
|ГДЕ
|НЕ ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа ССЫЛКА Документ.ЗаказКлиента";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
УИД = ВыборкаДетальныеЗаписи.Ссылка.УникальныйИдентификатор();
СсылкаНаДок = Соединение.Документы.ПоступлениеНаРасчетныйСчет.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИД)));
//Сообщить(СсылкаНаДок.Номер);
Для каждого СтрокаИсточник Из СсылкаНаДок.РасшифровкаПлатежа Цикл
//Сообщить("Счет: "+Строка(СтрокаИсточник.СчетНаОплату.Номер));
УИД = Соединение.String(СтрокаИсточник.СчетНаОплату.УникальныйИдентификатор());
текДок= Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));
Если ЗначениеЗаполнено(текДок) Тогда
Сообщить(текДок);
текОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
текОбъект.РасшифровкаПлатежа[0].ОснованиеПлатежа= текДок;
текОбъект.РасшифровкаПлатежа[0].Заказ= текДок;
текОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеПлатежей(Команда)
ОбновитьДанныеПлатежейНаСервере();
КонецПроцедуры
Категория:
COM-объекты, WMI, WSH Cодержимое указанного ниже веб-сайта в этом приложении блокируется... Aboutsecurity_1cv8c.exe Проблема: После обновления на 1С:Бухгалтерию предприятия 3-й версии, при нажатии на закладку командного интерфейса 1С:предприятие, выскакивает ошибка:
Aboutsecurity_1cv8c.exe или Aboutsecurity_1cv8.exe
«Содержимое указанного ниже веб-узла в этом приложении блокировано конфигурацией усиленной безопасности Internet Explorer».
Ошибка исчезает после многократного нажатия на «Закрыть», что несколько мешает работать, мягко говоря. Похожая ошибка бывает и в конфигураторе, при обновлении конфигурации или сравнении/объединении конфигураций. Чаще всего, мне попадалась эта проблема в серверных ОС, в частности Windows 2008 r2.
Решение: нужно добавить исключение в настройках безопасности Internet Explorer (далее & IE).
Это делается просто, если у вас один или несколько компьютеров & просто открываете IE/Свойства обозревателя/Безопасность/Надёжные узлы/Сайты, добавляете Aboutsecurity_1cv8c.exe и Aboutsecurity_1cv8.exe, нажимаете Ок, и наслаждаетесь результатом.
Но вот если у вас терминал-сервер и 40/60 пользователей, или еще хуже & пользователей 150 и они ходят в SQL версию 1С с локальных рабочих станций, то бегать по всем корпусам и добавлять эту настройку весьма накладно по времени, да и отвлекать пользователей лишний раз от работы не порядочно.
В этом случае, нужно пользоваться групповыми политиками домена (который у вас должен быть настроен, если вы не офисный спортсмен-бегун).
Вариант №1. Неудавшийся.
Первое решение & прописать настройки через Group Polices (Административные шаблоны/Компоненты Windows/Internet explorer/Вкладка «Безопасность»/Список назначений зоны для веб-сайтов) & не увенчалось успехом. Настройки пользователей, как и обещалось в статьях по данному методу, перестали работать, а вот зоны, описанные в этих настройках, работать не начали. При этом, я пробовал добавлять настройки и в локальные политики, и в доменные и в политики контроллера домена. Скорее всего из-за этих экспериментов с разными зонами действия групповых политик и появилась проблема.
И так, после этих манипуляций, в настройках безопасности IE появилась надпись «Некоторыми параметрами управляет системный администратор» и добавлять/удалять сайты узлов безопасности стало невозможно. От этой надписи, почему-то, оказалось не так просто избавиться. Удаление проделанных настроек GPO не разблокировали вкладку «Безопасность», а манипуляции с реестром привели к появлению ошибок «В параметрах зоны есть ошибка. Не удалось добавить сайт.» (IE 10) или «При установке параметров безопасности зоны произошла ошибка. Добавить узел не удается.» (IE 9) & все дальнейшие действия сходили на нет.
Исправить косяк удалось следующим путём:
Обновил Internet Explorer до версии 10 (был 9-й).
Предварительно экспортировав разделы реестра в файл, на случай восстановления, удалил из следующие ключи:
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\InternetSettings
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings]
Восстановил настройки Internet Explorer (Свойства обозревателя/Дополнительно/Сброс).
Проверить, что проблема не вернётся можно введя команду gpupdate /force в командной строке. После обновления политики запустите IE и проверьте, что настройки остались на месте. Если настройки опять слетели и добавление сайтов в узлы безопасности стало опять невозможно, то, скорее всего вы забыли отключить параметр «Список назначений зоны для веб-сайтов» в какой-то из зон групповой политики.
Чтобы определить в какой из зон групповых политик засела настройка (в локальных, доменных или контроллера домена), удобно пользоваться мастером отчётов «Результаты групповой политики», который находится в консоли «Диспетчер сервера», в разделе «Компоненты/Управление групповой политикой» (в Windows 2008 r2, по крайне мере он там).
Так что, здесь стоит быть осторожным, чтобы не создать себе дополнительной работы.
Вариант №2. Через GPO и реестр.
Этот метод делается через те же групповые политики, но через прямые записи в реестр, а не манипулирование стандартными настройками.
Что делать:
Удаляем узлы Aboutsecurity_1cv8 из настроек IE, если вы их туда уже добавили вручную & это нужно для чистоты эксперимента. Проверьте, что в 1С ошибка сохранилась.
Создаём файл 1csec.reg, с содержимым:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\EscDomains\security_1cv8c.exe]
«about»=dword:00000002
Небольшая ремарка: подраздел EscDomains используется в режиме расширенной настройки безопасности, если же этот режим отключен по какой-то причине, то нужно использовать раздел Domains вместо EscDomains (подробнее о записях реестра IE см. в базе знаний Microsoft).
И пробуем добавить его в реестр & если срабатывает, и в тонком клиенте 1С ошибка Aboutsecurity_1cv8c.exe исчезает, делаем дальше.
Снова открываем Default Domain Policy в диспетчере управления сервером, далее Конфигурация пользователя/Настройка/Конфигурация Windows/Реестр.
Добавляем туда две записи, где поле «Путь раздела»:
в первой записи это «Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\EscDomains\security_1cv8c.exe» (для тонкого клиента 1С),
во второй записи «Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\EscDomains\security_1cv8.exe» (для толстого клиента).
В остальном запись содержит те же данные, что и на картинке.
После этого, как положено, перелогиниваемся и проверяем результат. В толстом и тонком клиенте 1С:предприятие, ошибка должна исчезнуть.
В моём случае, для надёжности избавления от проделанных в Варианте №2 настроек, были добавлены ещё три записи в реестр:
Обновить: HKCU\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings; параметр: ListBox_Support_ZoneMapKey; значение 0 (тип DWORD десятичный)
Удалить: HKCU\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap
Удалить: HKCU\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMapKey
Вариант №3. Интерфейсный.
Есть ещё вариант, который переключит работу программы в режим интерфейса «Такси» : Администрирование/Настройки программы/Интерфейс & здесь включаем «Интерфейс «Такси»" & в этом режиме данная ошибка не появляется, но пользователям может не понравиться работать с этим вариантом интерфейса, т. к. он предназначен для мобильных устройств и планшетов (например, для работы через Web).
Источник
Категория:
Администрирование Яндекс карта : вывод точек на карту Пример о том,как вывести яндекс карту на форму и далее работать с ней:
Основной HTML код карты хранится в макете:
Код VBS <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Примеры. Геокодирование.</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/1.1/index.xml?key=ANpUFEkFAAAAf7jmJwMAHGZHrcLKDsbEqEVjEUtCmufxQMwAAAAAAAAAAAAvVrubVT4btztbduoIgTLAeFILaQ==" type="text/javascript" ></script>
<script type="text/javascript" >
var router;
var myPoints = new Array ();
var myRouts = new Array ();
var strOpen = "OPEN" ;
var strKontr = "Kontragent" ;
var t = new YMaps.Template(
YMaps.Templates.add("my#template" , t);
var KopdinatShirota = 0 ;
var KopdinatDolgota = 0 ;
var UID_Zakaza = "" ;
/*vstavkaStiley;
var map, geoResult;
YMaps.jQuery(function () {
map = new YMaps.Map(YMaps.jQuery("#YMapsID" )[0 ]);
map.setCenter(new YMaps.GeoPoint(37.62 , 55.75 ), 12 );
});
function showAddress (value, contrag, Styles, UID) {
var geocoder = new YMaps.Geocoder(value, {results: 1 , boundedBy: map.getBounds()});
YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
if (this.length()) {
geoResult = this.get (0 );
var point = new YMaps.GeoPoint(geoResult._point.__lng, geoResult._point.__lat);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}else {
}
});
YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (geocoder, error ) {
alert("Произошла ошибка: " + error );
return null ;
})
}
function showAddressCoord (shirota, dolgota, contrag, Styles, UID) {
var point = new YMaps.GeoPoint(dolgota, shirota);
var placemark = new YMaps.Placemark(point, {style: Styles});
placemark.name = UID;
placemark.description = contrag;
myPoints.push(placemark);
map.addOverlay(placemark);
return placemark;
}
function removeAllOverlays (map) {
map.removeAllOverlays();
}
function AddRoute(wayPoint1, wayPoint2) {
if (myRouts.length>0 ) {lastRouter = myRouts[myRouts.length-1 ]; map.removeOverlay(lastRouter)};
var myRouter = new YMaps.Router([wayPoint1, wayPoint2], [], {viewAutoApply: true });
map.addOverlay(myRouter);
YMaps.Events.observe(myRouter, myRouter.Events.Success, function (myRouter) {
myRouter.getWayPoint(0 ).setIconContent(
myRouter.getWayPoint(1 ).setIconContent(
dlMar = myRouter.getDistance()/1000 ;
document.title =
});
myRouts.push(myRouter);
return true ;
}
function mapRazmer(map, SentrSh, SentrDlg, razmer) {
map.setCenter(new YMaps.GeoPoint(SentrSh, SentrDlg), razmer);
}
function changeStyle(numTochki, imStyle){
var restoreDefault = true ;
tochka = myPoints[numTochki];
tochka.setOptions({style: imStyle}, restoreDefault);
point = tochka.getCoordPoint();
map.setCenter(new YMaps.GeoPoint(point.__lng, point.__lat), 12 );
map.redraw();
return tochka.description;
}
</script>
</head>
<body //~~onload~~>
<div id="YMapsID" style="width:100%;height:100%" ></div>
</form>
</body>
</html>
Код вывода карты:
Код 1C v 8.х
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Макет = ПолучитьМакет( "Макет" ) ;
КодХТМЛ = Макет. ПолучитьТекст( ) ;
СтрокаСтиляНачальная = "var BurG = new YMaps.Style();
|BurG.iconStyle = new YMaps.IconStyle();
|BurG.iconStyle.offset = new YMaps.Point(-12, -12);
|BurG.iconStyle.href = "" http://www.burgerking.ru/favicon.ico"" ;
|BurG.iconStyle.size = new YMaps.Point(20, 20);
|BurG.hideIcon = false;
|BurG.balloonContentStyle = new YMaps.BalloonContentStyle("" my#template"" );" ;
СтрокаСтиляИтоговая = "" ;
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| ВидыОбъектов.Ссылка,
| ВидыОбъектов.ПутьКИконке,
| ВидыОбъектов.Код
|ИЗ
| Справочник.ВидыОбъектов КАК ВидыОбъектов
|ГДЕ
| ВидыОбъектов.ПометкаУдаления = ЛОЖЬ" ;
Результат = Запрос. Выполнить( ) ;
ВыборкаДетальныеЗаписи = Результат. Выбрать( ) ;
Пока ВыборкаДетальныеЗаписи. Следующий( ) Цикл
времСтрокаСтиля = СтрокаСтиляНачальная;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "BurG" , "s" + Строка( ВыборкаДетальныеЗаписи. код) ) ;
времСтрокаСтиля = стрЗаменить( времСтрокаСтиля, "http://www.burgerking.ru/favicon.ico" , сокрЛП( ВыборкаДетальныеЗаписи. ПутьКИконке) ) ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + времСтрокаСтиля + символы. ПС;
КонецЦикла ;
СтрокаСтиляИтоговая = СтрокаСтиляИтоговая + СтрокаСтиляНачальная + символы. ПС;
КодХТМЛ = стрЗаменить( КодХТМЛ, "/*vstavkaStiley;" , СтрокаСтиляИтоговая) ;
путьККаталогуКартинок = СтрЗаменить( КаталогПрограммы( ) , "\" , "/" ) ;
КодХТМЛ = СтрЗаменить( КодХТМЛ, "C:/" , путьККаталогуКартинок) ;
ЭлементыФормы. Карта. УстановитьТекст( КодХТМЛ) ;
табАдресов = получитьтабАдресов( ) ;
табУникальныхАдресов = табАдресов. скопировать( ) ;
табУникальныхАдресов. свернуть( "Уник" ) ;
тзДанных = табАдресов. скопировать( ) ;
табАдресов. очистить( ) ;
Для Каждого стр из табУникальныхАдресов Цикл
Отбор = Новый Структура( ) ;
Отбор. Вставить( "Уник" , стр. Уник) ;
Строки = тзДанных. НайтиСтроки( Отбор) ;
НовСтр = табАдресов. добавить( ) ;
НовСтр. уник = стр. уник;
Если Строки. Количество( ) > 0 Тогда
для Каждого тздстр из Строки Цикл
НовСтр. Адрес = тздстр. Адрес;
НовСтр. КД = тздстр. КД;
НовСтр. КШ = тздстр. КШ;
НовСтр. ВидОбъекта = тздстр. ВидОбъекта;
НовСтр. Наименование= Строка( НовСтр. Наименование) + Строка( тздстр. Наименование) + "; " ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
ЭлементыФормы. табАдресов. СоздатьКолонки( ) ;
ВыборМасштаба = "50%" ;
ВыборРегиона = "Москва" ;
ЭлементыФормы. Надпись24 . Заголовок = "Точек: " + Строка( табАдресов. количество( ) ) ;
КонецПроцедуры
Процедура ОсновныеДействияФормыОсновныеДействияФормыВыполнить(Кнопка)
Всего= Строка( табАдресов. Количество( ) ) ; н= 0 ;
Для каждого строкаАдреса Из табАдресов Цикл
н= н+ 1 ; Состояние( "Вывод " + Строка( н) + " из " + Всего) ;
УИД_Дока = Строка( н) ;
имяСтиля = "s" + Строка( строкаАдреса. ВидОбъекта. код) ;
Попытка
Если ЗначениеЗаполнено( строкаАдреса. КД) Тогда
ВызовФункции = "showAddressCoord(" + сокрЛП( строкаАдреса. КШ) + ", " + сокрЛП( строкаАдреса. КД) + ", '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
Иначе
ВызовФункции = "showAddress('" + сокрЛП( строкаАдреса. адрес) + "', '" + сокрЛП( строкаАдреса. адрес) + "', " + имяСтиля + ", '" + сокрЛП( строкаАдреса. ВидОбъекта. наименование) + "')" ;
КонецЕсли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( ВызовФункции) ;
исключение
Сообщить( "Точка с адресом " + сокрЛП( строкаАдреса. адрес) + " не может быть отбражена на карте!" ) ;
конецПопытки
КонецЦикла ;
ТочкиНеСозданы = Ложь ;
ЭлементыФормы. Карта. ПолучитьТекст( ) ;
КонецПроцедуры
Процедура Кнопка1Нажатие(Элемент)
если ЭлементыФормы. ВыборРегиона. значение = "Москва" Тогда
СтрокаКоординат = "37.64, 55.76, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Тверь" Тогда
СтрокаКоординат = "35.90, 56.83, " ;
ИначеЕсли ЭлементыФормы. ВыборРегиона. значение = "Балашиха" Тогда
СтрокаКоординат = "37.97, 55.82, " ;
Иначе
СтрокаКоординат = "37.64, 55.76, " ;
конецесли ;
Если ВыборМасштаба = "" тогда
возврат ;
конецесли ;
числоМасштаба = Число( Лев( ВыборМасштаба, стрдлина( ВыборМасштаба) - 1 ) ) ;
числоМасштаба = числоМасштаба + 5 ;
ВыборМасштаба = строка( числоМасштаба) + "%" ;
ТекущийМасштаб = Строка( Цел( ( числоМасштаба/ 125 ) * ( 20 ) + 4 ) ) ;
если стрДлина( ТекущийМасштаб) = 1 тогда
ТекущийМасштаб = "0" + ТекущийМасштаб;
конецесли ;
ЭлементыФормы. Карта. Document. parentWindow. eval( "mapRazmer(map," + СтрокаКоординат + ТекущийМасштаб + ")" ) ;
КонецПроцедуры
Пример обратного геокодирования - получение координат по адресу:
Код 1C v 8.х Процедура ПолучитьКоординаты() Экспорт
Яндекс = Новый HTTPСоединение( "geocode-maps.yandex.ru" , , , , , Истина ) ;
ВременныйФайл = КаталогВременныхФайлов( ) + "Yandex_geocode_" + СокрЛП( Новый УникальныйИдентификатор) ;
Попытка
Яндекс. Получить( "/1.x/?geocode=" + Адрес + "&results=1" , ВременныйФайл) ;
Исключение
Сообщить( "Ошибка при попытке геокодировать по яндексу адрес: " + Адрес) ;
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML. ОткрытьФайл( ВременныйФайл) ;
ПостроительDOM = Новый ПостроительDOM;
ДокументДОМ = ПостроительDOM. Прочитать( ЧтениеXML) ;
СписокText = ДокументДОМ. ПолучитьЭлементыПоИмени( "text" ) ;
СписокPos = ДокументДОМ. ПолучитьЭлементыПоИмени( "pos" ) ;
Если ( СписокText. Количество( ) = 0 ) ИЛИ ( СписокPos. Количество( ) = 0 ) Тогда
Возврат ;
КонецЕсли ;
Для ъ = 0 по СписокText. Количество( ) - 1 Цикл
Координаты = СписокPos[Ъ]. ТекстовоеСодержимое;
Разделитель = Найти( Координаты, " " ) ;
Широта = Число( Сред( Координаты, Разделитель + 1 ) ) ;
Долгота = Число( Лев( Координаты, Разделитель - 1 ) ) ;
Если Широта = 0 ИЛИ Долгота = 0 Тогда
Продолжить;
КонецЕсли ;
КД = Долгота;
КШ = Широта;
КонецЦикла ;
КонецПроцедуры
Обработка вырванная из конфигурации: YandexMap.rar
Можно ее использовать как макет для создания обработки под свои требования.
Пример автоматизации в котором это использовалось.
Категория:
Географическая схема Универсальная функция для чтения данных из Excel в 1С Иногда требуется разобрать данные из Excel в 1С.
Я считаю что легче и быстрей поместить все данные в ТаблицуЗначений и уже там ими манипулировать.
Пример 2-х функций которые я использую:
ИзExcelВТаблицу – Читает Excel в ТаблицуЗначений
ЭлементСправочника – Создает или находит элемент справочника.
Теперь сам код:
Код 1C v 8.х
Функция ИзExcelВТаблицу(ПутьДоExcel, НомерСтраницы = 1, ПерСтрокаЗаголовок = Ложь , ФормаИндикатора = Неопределено)
Попытка
Док = ПолучитьCOMОбъект( ПутьДоExcel) ;
Исключение
Сообщить( "Произошла ошибка при обращение к Excel:" + Символы. ПС + ОписаниеОшибки( ) ) ;
Возврат Неопределено ;
КонецПопытки ;
ЗакрытьФормуИндиктаора = Ложь ;
Если ФормаИндикатора = Неопределено тогда
ЗакрытьФормуИндиктаора = Истина ;
ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. Открыть( ) ;
КонецЕсли ;
ФормаИндикатора. КомментарийЗначения = "Загрузка данных из Excel..." ;
ТЗ = Новый ТаблицаЗначений( ) ;
Страница = Док. Sheets( НомерСтраницы) ;
МакСтрок = Страница. UsedRange. Rows. Count;
МакСтолб = Страница. UsedRange. Columns. Count;
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
Если ПерСтрокаЗаголовок тогда
ИмяСтолбца = Страница. Cells( 1 , Столбец) . Value;
ИмяСтолбца = СокрЛП( ИмяСтолбца) ;
ИмяСтолбца = СтрЗаменить( ИмяСтолбца, " " , "_" ) ;
КонецЕсли ;
ТЗ. Колонки. Добавить( ИмяСтолбца, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
НачальнаяСтрока = 1 ;
Если ПерСтрокаЗаголовок тогда
НачальнаяСтрока = 2 ;
КонецЕсли ;
Для НомСтрока = НачальнаяСтрока по МакСтрок цикл
СтрТЗ = ТЗ. Добавить( ) ;
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница. Cells( НомСтрока, НомСтолбец) . Value;
СтрТЗ[НомСтолбец- 1 ] = Данные;
КонецЦикла ;
ФормаИндикатора. ЭлементыФормы. Индикатор. Значение = НомСтрока/ МакСтрок * 100 ;
КонецЦикла ;
Если ЗакрытьФормуИндиктаора тогда
ФормаИндикатора. Закрыть( ) ;
КонецЕсли ;
Возврат ТЗ;
КонецФункции
Пример вызова:
Код 1C v 8.х ФормаИндикатора = ПолучитьОбщуюФорму( "ХодВыполненияОбработкиДанных" ) ;
ФормаИндикатора. НаименованиеОбработкиДанных = "Загрузка данных..." ;
ФормаИндикатора. Открыть( ) ;
ТЗ = ИзExcelВТаблицу( ФайлExcel, 1 , Истина , ФормаИндикатора) ;
Если ТЗ = Неопределено тогда
ФормаИндикатора. Закрыть( ) ;
Возврат ;
КонецЕсли ;
ФормаИндикатора. Закрыть( ) ;
или
Код 1C v 8.х ТЗ = ИзExcelВТаблицу( ФайлExcel) ;
Если ТЗ = Неопределено тогда
Возврат ;
КонецЕсли ;
Теперь функция которой я использую когда надо создать элемент справочника из полученных данных.
Код 1C v 8.х
Функция ЭлементСправочника(ИмяСправочника = "" ,ИмяЭлемента, ИмяРодителя = Неопределено, Параметры = Неопределено, СоздатьЕслиНетЭлемента=Истина)
Если ИмяСправочника = "" тогда
Сообщить( "Укажите имя спрачоника - ЭлементСправочника()" ) ;
Возврат Неопределено ;
КонецЕсли ;
Если ПустаяСтрока( ИмяЭлемента) тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = Неопределено ;
Если ИмяРодителя < > Неопределено тогда
ОбрабатИмяРодителя = ИмяРодителя;
РодительГруппы = Справочники[ИмяСправочника]. ПустаяСсылка( ) ;
Пока НЕ ПустаяСтрока( ОбрабатИмяРодителя) цикл
ПозРазделителя = Найти( ОбрабатИмяРодителя, "\\" ) ;
Если ПозРазделителя = 0 тогда
ИмяГруппы = ОбрабатИмяРодителя;
ОбрабатИмяРодителя = ""
Иначе
ИмяГруппы = Сред( ОбрабатИмяРодителя, 1 , ПозРазделителя- 1 ) ;
ОбрабатИмяРодителя = Сред( ОбрабатИмяРодителя, ПозРазделителя+ 2 ) ;
КонецЕсли ;
ТексЗапроса = "ВЫБРАТЬ
| Данные.Ссылка
|ИЗ
| Справочник." + ИмяСправочника+ " КАК Данные
|ГДЕ
| Данные.Родитель = &Родитель
| И Данные.Наименование = &Наименование
| И Данные.ЭтоГруппа" ;
ЗапросРодителя = Новый Запрос( ТексЗапроса) ;
ЗапросРодителя. УстановитьПараметр( "Родитель" , РодительГруппы) ;
ЗапросРодителя. УстановитьПараметр( "Наименование" , ИмяГруппы) ;
РезультатРодителя = ЗапросРодителя. Выполнить( ) . Выгрузить( ) ;
Если РезультатРодителя. Количество( ) < > 0 тогда
РодительГруппы = РезультатРодителя[0 ]. Ссылка
Иначе
ОбъектРодитель = Справочники[ИмяСправочника]. СоздатьГруппу( ) ;
ОбъектРодитель. Родитель = РодительГруппы;
ОбъектРодитель. Наименование = ИмяГруппы;
ОбъектРодитель. Записать( ) ;
РодительГруппы = ОбъектРодитель. Ссылка;
КонецЕсли ;
КонецЦикла ;
Родитель = РодительГруппы;
КонецЕсли ;
Элемент = Справочники[ИмяСправочника]. НайтиПоНаименованию( ИмяЭлемента) ;
ОбъектЭлемент = Неопределено ;
Если Элемент. Пустая( ) тогда
Если СоздатьЕслиНетЭлемента тогда
ОбъектЭлемент = Справочники[ИмяСправочника]. СоздатьЭлемент( ) ;
ОбъектЭлемент. Наименование = ИмяЭлемента;
Иначе
Элемент = Неопределено
КонецЕсли ;
Иначе
ОбъектЭлемент = Элемент. ПолучитьОбъект( ) ;
КонецЕсли ;
Если ОбъектЭлемент < > Неопределено тогда
Если Параметры < > Неопределено тогда
Для каждого СтрПараметр из Параметры цикл
ОбъектЭлемент[СтрПараметр. Ключ] = СтрПараметр. Значение;
КонецЦикла ;
КонецЕсли ;
Если Родитель < > Неопределено тогда
ОбъектЭлемент. Родитель = Родитель;
КонецЕсли ;
ОбъектЭлемент. Записать( ) ;
Элемент = ОбъектЭлемент. Ссылка;
КонецЕсли ;
Возврат Элемент;
КонецФункции
Автор:
borismor Категория:
Работа с Microsoft Office и OpenOffice Последовательность выполнения ПередЗаписью(), ПриЗаписи(), ПослеЗаписи() и ОбработкаПроведения() ? Для чего может пригодиться знание последовательности, в которой отрабатывают такие предопределенные процедуры модуля документа и модуля формы документа, как ПередЗаписью(), ПриЗаписи(), ПослеЗаписи() и ОбработкаПроведения() ?
Ответ прост - что бы правильно организовать обработку данных на разных этапах и режимах проведения документа.
Чтобы выяснить этот вопрос, Вы можете разместить вывод сообщений в указанных процедурах и посмотреть, в каком порядке они запускаются.
Итак, начнем с самого распространенного режима - проведение документа пользователем из его формы (проще говоря нажатием на кнопку "Провести" или "Ок" в форме документа).
Последовательность запуска процедур будет выглядеть следующим образом:
Форма. Перед записью.
Модуль. Перед записью.
Модуль. При записи.
Модуль. Обработка проведения.
Форма. При записи.
Форма. После записи.
При простой интерактивной записи документа (без проведения) порядок будет тот-же, за исключением процедуры ОбработкаПроведения(), которая в режиме записи не запускается. А при отмене проведения вместо нее запускается процедура ОбработкаОтменыПроведения();
На этапах 1 и 2 Вы еще можете программно внести изменения в документ, если это требуется - запись документа в базу еще не
произошла и транзакция записи еще не начата. Начиная с этапа 3 внести изменения уже не получится, т.к. процесс записи документа уже совершился, но транзакция еще не завершена. Транзакция завершится только после завершения этапа 5, когда все требуемые данные и движения документа будут полностью физически записаны в базу данных.
Теперь давайте рассмотрим проведение документа без открытия формы документа (с помощью обработки или из формы списка).
Последовательность запуска процедур будет выглядеть следующим образом:
Модуль. Перед записью.
Модуль. При записи.
Модуль. Обработка проведения.
Как видите, процедуры модуля формы не запустились.
Вывод: Если Вы хотите провести какие-то проверки в процессе оформления документа (т.е. пока он открыт у пользователя), и не хотите, чтобы они выполнялись например при регламентном перепроведении документов, то их следует располагать в модуле формы документа. В противном случае, если надо эти проверки проводить всегда, то код целесообразно разместить в модуле документа. Но при этом надо помнить, что в серверном варианте работы БД код модуля документа выполняется на сервере, поэтому обязательно надо помнить, какие методы программы работают на сервере, а какие нет.
Источник:
lessons1c Категория:
Документы Выгрузка в PDF из 1С (Средствами OpenOffice) Возникла задача отправлять счета почтой. PDFcreator не подошёл поскольку не удалось вместить счёт на одну страницу по ширине. Решил попробовать OpenOffice. Как сохранять в PDF нашёл быстро, а вот как уместить счёт на одну страницу вширь искал долго.
В версии 1С 8.2.232 появилась возможность сохранять табличный документ в xls файл на сервера под линуксом. А вот работать с Опеном офисом из-под линукса пока не получается. Собственно комментари ненужны. Вот весь код. Самое интересное это бодание со стилями страниц в Опене Офисе. Жаль что этот фрагмент работает только на клиенте. На сервере вопрос не решается *08
Код 1C v 8.2 УП Процедура КнопкаВыполнитьНажатие(Кнопка)
Если Письмо. Основание. Пустая( ) Тогда
Возврат
КонецЕсли ;
Попытка
ServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" ) ;
Исключение
Возврат
КонецПопытки ;
Заказ = Письмо. Основание. ПолучитьОбъект( ) ;
Расшифровка= Новый Структура;
Расшифровка. Вставить( "СсылкаНаВнешнююОбработку" , Константы. ПФСчетаДляКлиента. Получить( ) ) ;
Расшифровка. Вставить( "ВидПечатнойФормы" , Перечисления. ВидыДополнительныхВнешнихОбработок. ПечатнаяФорма) ;
Расшифровка. Вставить( "НомерСтроки" , 1 ) ;
тд = УниверсальныеМеханизмы. НапечататьВнешнююФорму( Заказ, Расшифровка) ;
ВременныйФайл = ПолучитьИмяВременногоФайла( ) ;
ВременныйФайлXLS = ВременныйФайл + ".xls" ;
ВременныйФайлPDF = ВременныйФайл + ".pdf" ;
тд. Записать( ВременныйФайлXLS, ТипФайлаТабличногоДокумента. XLS97) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
НастройкиОткрытия = Новый COMSafeArray( "VT_VARIANT" , 1 ) ;
PropertyValue = ServiceManager. Bridge_GetStruct( "com.sun.star.beans.PropertyValue" ) ;
PropertyValue. Name = "Hidden" ;
PropertyValue. Value = Истина ;
НастройкиОткрытия. SetValue( 0 , PropertyValue) ;
ВременныйФайлXLS_какУРЛ = "file:///" + СтрЗаменить( ВременныйФайлXLS, "\" , "/" ) ;
ОпенОфис = Desktop. LoadComponentFromURL( ВременныйФайлXLS_какУРЛ, "_blank" , 0 , НастройкиОткрытия) ;
Стили = ОпенОфис. StyleFamilies. getByName( "PageStyles" ) ;
Для поз = 0 по Стили. count - 1 Цикл
МойСтиль = Стили. getByIndex( поз) ;
МойСтиль. ScaleToPagesX = 1 ;
КонецЦикла ;
НастройкиСохранения = Новый COMSafeArray( "VT_VARIANT" , 1 ) ;
PropertyValue = ServiceManager. Bridge_GetStruct( "com.sun.star.beans.PropertyValue" ) ;
PropertyValue. Name = "FilterName" ;
PropertyValue. Value = "calc_pdf_Export" ;
НастройкиСохранения. SetValue( 0 , PropertyValue) ;
ВременныйФайлPDF_какУРЛ = "file:///" + СтрЗаменить( ВременныйФайлPDF, "\" , "/" ) ;
ОпенОфис. storeToURL( ВременныйФайлPDF_какУРЛ, НастройкиСохранения) ;
ОпенОфис. close( - 1 ) ;
ОпенОфис = Неопределено ;
объектПисьмо = Письмо. ПолучитьОбъект( ) ;
стрВложение = объектПисьмо. Вложения. Добавить( ) ;
стрВложение. ИмяФайла = "Счёт " + Строка( Заказ. Номер) + ".pdf" ;
стрВложение. Файл = Новый ХранилищеЗначения( Новый ДвоичныеДанные( ВременныйФайлPDF) ) ;
объектПисьмо. Записать( ) ;
Попытка
УдалитьФайлы( ВременныйФайлXLS) ;
УдалитьФайлы( ВременныйФайлPDF) ;
Исключение
КонецПопытки ;
КонецПроцедуры
Автор:
Трактор
Функция позволяющая выполнить выгрузку табличного документа в PDF средствами OpenOffice
Код 1C v 8.х
Функция ВыгрузитьТабличныйДокументВPDF(ДанныеВыгрузки, ПутьВыгрузки, ИмяФайлаБезРасширения)
Если НЕ ЗначениеЗаполнено( ПутьВыгрузки) Тогда
ПутьВыгрузки = КаталогВременныхФайлов( ) ;
КонецЕсли ;
ПутьВыгрузки = ? ( Прав( ПутьВыгрузки, 1 ) = "\" , ПутьВыгрузки, ПутьВыгрузки + "\" ) ;
РасширениеXSL = ".xls" ;
РасширениеPDF = ".pdf" ;
ПолноеИмяФайлаXLS = ПутьВыгрузки + ИмяФайлаБезРасширения + РасширениеXSL;
#Если Клиент Тогда
Состояние( "Создание временного файла..." ) ;
#КонецЕсли
Попытка
Если ТипЗнч( ДанныеВыгрузки) = Тип( "ТабличныйДокумент" ) Тогда
ДанныеВыгрузки. Записать( ПолноеИмяФайлаXLS, "XLS" ) ;
ИначеЕсли ТипЗнч( ДанныеВыгрузки) = Тип( "ТекстовыйДокумент" ) Тогда
ДанныеВыгрузки. Записать( ПолноеИмяФайлаXLS, "XLS" ) ;
Иначе
#Если Клиент Тогда
Сообщить( "Данные для выгрузки переданы в неподдерживаемом формате. Дальнейшее выполнение невозможно." + Символы. ПС + ОписаниеОшибки( ) ) ;
#КонецЕсли
Возврат 0 ;
КонецЕсли ;
Исключение
#Если Клиент Тогда
Сообщить( "Произошла ошибка при выгрузке временного файла. Возможно ошибка доступа к папке, в которую происходит запись." + Символы. ПС + ОписаниеОшибки( ) ) ;
#КонецЕсли
Возврат 0 ;
КонецПопытки ;
Попытка
#Если Клиент Тогда
Состояние( "Открытие компоненты OpenOffice..." ) ;
#КонецЕсли
ServiceManager = Новый COMОбъект( "com.sun.star.ServiceManager" ) ;
Скрипт = Новый COMОбъект( "MSScriptControl.ScriptControl" ) ;
Скрипт. language = "javascript" ;
Скрипт. AddObject( "OpenOffice" , ServiceManager) ;
#Если Клиент Тогда
Состояние( "Открытие временного файла..." ) ;
#КонецЕсли
Скрипт. eval( "Массив=new Array()" ) ;
Массив = Скрипт. eval( "Массив" ) ;
Скрипт. eval( "Массив[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')" ) ;
Скрипт. eval( "Массив[0].Name = 'Hidden'" ) ;
Скрипт. eval( "Массив[0].Value = true" ) ;
Скрипт. AddCode( "function SetItem(ind,val){Массив[ind]=val}" ) ;
Скрипт. AddObject( "ServiceManager" , ServiceManager) ;
Desktop = ServiceManager. createInstance( "com.sun.star.frame.Desktop" ) ;
Document = Desktop. LoadComponentFromURL( "file:///" + ПолноеИмяФайлаXLS, "_blank" , 0 , Массив) ;
#Если Клиент Тогда
Состояние( "Запись в PDF..." ) ;
#КонецЕсли
Скрипт. eval( "Массив2=new Array()" ) ;
Массив2 = Скрипт. eval( "Массив2" ) ;
Скрипт. eval( "Массив2[0] = OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')" ) ;
Скрипт. eval( "Массив2[0].Name = 'FilterName'" ) ;
Скрипт. eval( "Массив2[0].Value = 'writer_pdf_Export'" ) ;
ПолноеИмяФайлаPDF = "file:///" + СтрЗаменить( ПолноеИмяФайлаXLS, РасширениеXSL, РасширениеPDF) ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, ВРег( РасширениеXSL) , РасширениеPDF) ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, "\" , "/" ) ;
Document. storeToURL( ПолноеИмяФайлаPDF, Массив2 ) ;
Document. close( - 1 ) ;
Document = Неопределено ;
Desktop = Неопределено ;
#Если Клиент Тогда
Состояние( "Удаление временного файла..." ) ;
#КонецЕсли
Попытка
УдалитьФайлы( ПолноеИмяФайлаXLS) ;
Исключение
#Если Клиент Тогда
Сообщить( "Произошла ошибка при удалении временного файла. Возможно, потребуется удалить его вручную." + Символы. ПС + ОписаниеОшибки( ) ) ;
#КонецЕсли
КонецПопытки ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, "file:///" , "" ) ;
ПолноеИмяФайлаPDF = СтрЗаменить( ПолноеИмяФайлаPDF, "/" , "\" ) ;
#Если Клиент Тогда
Состояние( "Выгрузка выполнена." ) ;
Предупреждение( "Выгрузка выполнена." + Символы. ПС + ПолноеИмяФайлаPDF) ;
#КонецЕсли
Возврат ПолноеИмяФайлаPDF;
Исключение
Document. close( - 1 ) ;
#Если Клиент Тогда
Предупреждение( ОписаниеОшибки( ) ) ;
#КонецЕсли
Возврат 0 ;
КонецПопытки
КонецФункции
Автор:
doom_2001 Категория:
Работа с Microsoft Office и OpenOffice Обмен файлами с FTP сервером средствами Windows Код 1C v 8.х
Процедура ПередатьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт
Если ПутьФТП = Неопределено Тогда
ТекПутьФТП = ПараметрыСеанса. FTPПуть;
Иначе
ТекПутьФТП = ПутьФТП;
КонецЕсли ;
Скрипт= Новый ТекстовыйДокумент;
Скрипт. ДобавитьСтроку( "open " + ПараметрыСеанса. FTP) ;
Скрипт. ДобавитьСтроку( "user" ) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPЛогин) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPПароль) ;
Скрипт. ДобавитьСтроку( "binary" ) ;
Скрипт. ДобавитьСтроку( "cd " + ТекПутьФТП) ;
Скрипт. ДобавитьСтроку( "put " + ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + ИмяФайла) ;
Скрипт. ДобавитьСтроку( "bye" ) ;
Файл = Новый Файл( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" ) ;
Скрипт. Записать( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" , "windows-1251" ) ;
КомандаСистемы( "ftp -n -s:" + ПараметрыСеанса. ПутьКФайлуОбраза+ "\ftp.txt" ) ;
КонецПроцедуры
Процедура ПолучитьПоFTP(ИмяФайла,ПутьФТП=Неопределено) Экспорт
Если ПутьФТП = Неопределено Тогда
ТекПутьФТП = ПараметрыСеанса. FTPПуть;
Иначе
ТекПутьФТП = ПутьФТП;
КонецЕсли ;
Скрипт= Новый ТекстовыйДокумент;
Скрипт. ДобавитьСтроку( "open " + ПараметрыСеанса. FTP) ;
Скрипт. ДобавитьСтроку( "user" ) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPЛогин) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. FTPПароль) ;
Скрипт. ДобавитьСтроку( "binary" ) ;
Скрипт. ДобавитьСтроку( "cd " + ТекПутьФТП) ;
Скрипт. ДобавитьСтроку( "get" ) ;
Скрипт. ДобавитьСтроку( ИмяФайла) ;
Скрипт. ДобавитьСтроку( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + ИмяФайла) ;
Скрипт. ДобавитьСтроку( "bye" ) ;
Файл = Новый Файл( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" ) ;
Скрипт. Записать( ПараметрыСеанса. ПутьКФайлуОбраза+ "\" + "ftp.txt" , "windows-1251" ) ;
КомандаСистемы( "ftp -n -s:" + ПараметрыСеанса. ПутьКФайлуОбраза+ "\ftp.txt" ) ;
КонецПроцедуры
Код 1C v 7.x
Функция ОтправитьФайлыЧерезFTP()
Попытка
Шел= СоздатьОбъект( "shell.application" ) ;
ПапкаФТП= Шел. namespace( "ftp://" + СокрЛП( ФТП_Пользователь) + ":" + СокрЛП( ФТП_Пароль) + "@" + СокрЛП( ФТП_УРЛ) + "/" + СокрЛП( ФТП_ПутьИсходящих) ) ;
ПапкаИсточник= Шел. namespace( КаталогИсходящих) ;
ПапкаЗагруженных = Шел. namespace( КаталогЗагруженных) ;
Предупреждение( "Подключение к FTP серверу..." , 1 ) ;
Темы= ПапкаИсточник. items( ) ;
ПапкаЗагруженных. copyhere( Темы) ;
ПапкаФТП. movehere( Темы) ;
Исключение
Предупреждение( "Внимание! Не удалось передать файлы адресату через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь." ) ;
Возврат 0 ;
КонецПопытки ;
ФС. УстТекКаталог( КаталогИсходящих) ;
ПопытокПроверки = 3 ;
Для Сч = 1 По ПопытокПроверки Цикл
Если НЕ ( ( СокрЛП( ФС. НайтиПервыйФайл( "*.*" ) ) = "" ) или ( СокрЛП( ФС. НайтиПервыйФайл( "*.*" ) ) = "." ) ) Тогда
Если Сч = ПопытокПроверки Тогда
Предупреждение( "Внимание! Не удалось передать файлы адресату через FTP! Попробуйте совершить обмен позже." ) ;
Возврат 0 ;
КонецЕсли ;
Предупреждение( "Передача файлов...." , 3 ) ;
КонецЕсли ;
КонецЦикла ;
Возврат 1 ;
КонецФункции
Функция ПолучитьФайлыЧерезFTP()
Попытка
Шел= СоздатьОбъект( "shell.application" ) ;
ПапкаФТП= Шел. namespace( "ftp://" + СокрЛП( ФТП_Пользователь) + ":" + СокрЛП( ФТП_Пароль) + "@" + СокрЛП( ФТП_УРЛ) + "/" + СокрЛП( ФТП_ПутьВходящих) ) ;
ПапкаПриемник= Шел. namespace( КаталогВходящих) ;
ПапкаЗагруженных = Шел. namespace( КаталогЗагруженных) ;
Предупреждение( "Подключение к FTP серверу..." , 1 ) ;
Темы= ПапкаФТП. items( ) ;
ПапкаЗагруженных. copyhere( Темы) ;
ПапкаПриемник. movehere( Темы) ;
Исключение
Предупреждение( "Внимание! Не удалось получить файлы через FTP! Возможно, параметры FTP заданы неверно, либо отсутствует связь." ) ;
Возврат 0 ;
КонецПопытки ;
ПопытокПроверки = 3 ;
Для Сч = 1 По ПопытокПроверки Цикл
Если ПапкаФТП. items( ) . count> 0 Тогда
Если Сч = ПопытокПроверки Тогда
Предупреждение( "Внимание! Не удалось получить файлы через FTP! Попробуйте совершить обмен позже." ) ;
Возврат 0 ;
КонецЕсли ;
Предупреждение( "Получение файлов...." , 3 ) ;
КонецЕсли ;
КонецЦикла ;
Возврат 1 ;
КонецФункции
Код 1C v 7.x
ТекстВыгрузки. Записать( КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ТекстВыгрузки = "" ;
ТекстВыгрузки = СоздатьОбъект( "Текст" ) ;
ТекстВыгрузки. ДобавитьСтроку( "open " + "192.168.0.1" ) ;
ТекстВыгрузки. ДобавитьСтроку( "****" ) ;
ТекстВыгрузки. ДобавитьСтроку( "*****" ) ;
ТекстВыгрузки. ДобавитьСтроку( "put " + КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ТекстВыгрузки. ДобавитьСтроку( "bye" ) ;
ТекстВыгрузки. Записать( КаталогПользователя( ) + "ftp.txt" ) ;
ТекстВыгрузки = "" ;
КомандаСистемы( "ftp -s:" + КаталогПользователя( ) + "Ftp.txt>> " + ( КаталогПользователя( ) + "report.txt" ) ) ;
ФС. УдалитьФайл( КаталогПользователя( ) + "ftp.txt" ) ;
ТекстВыгрузки = СоздатьОбъект( "Текст" ) ;
ТекстВыгрузки. Открыть( КаталогПользователя( ) + "report.txt" ) ;
КС = ТекстВыгрузки. КоличествоСтрок( ) - 4 ;
Попытка
строкаКомплете = ТекстВыгрузки. ПолучитьСтроку( КС) ;
Если Найти( Нрег( строкаКомплете) , "226 transfer complete" ) = 0
Тогда а= 1 ; а= а/ 0 ;
КонецЕсли ;
тПротокол = ТекущееВремя( ) + " файл данных успешно отправлен на сервер интернет-магазина" + РазделительСтрок+ тПротокол;
Форма. Обновить( ) ;
ТекстВыгрузки = "" ;
ФС. УдалитьФайл( КаталогПользователя( ) + ( ИмяПрайса+ ".csv" ) ) ;
ФС. УдалитьФайл( КаталогПользователя( ) + "report.txt" ) ;
Исключение
тПротокол = ТекущееВремя( ) + " ПРОИЗОШЛА ОШИБКА ВО ВРЕМЯ ЗАГРУЗКИ СФОРМИРОВАННОГО ФАЙЛА НА СЕРВЕР ИНЕТРНЕТ-МАГАЗИНА" + РазделительСтрок+ тПротокол;
тПротокол = ТекущееВремя( ) + ИмяПрайса+ РазделительСтрок+ тПротокол;
Форма. Обновить( ) ;
ТекстВыгрузки. Показать( ) ;
ТекстВыгрузки = "" ;
КонецПопытки ;
Категория:
Работа с Интернет, Почтой (Mail), FTP Загрузка данных из MS Excel через объект ADODB Данный метод обладает гораздо большей производительностью и простотой, чем банальный объектный метод через COM соединение.
Все что потребуется это создание 2 объектов
* ADODB.Connection
* ADODB. Recordset
Здесь универсальная обработка по загрузке Номенклатуры из Excel:
Код 1C v 8.х // Функция для Платформы 1С 8.0 или 8.1
// Выполняет загрузку из файла Excel
//
// Параметры
// ПутьКФайлу - <Строка> - путь к файлу xls
//
// Автор: ---%%%Gmix 16.03.2006 12:38:48
//
// Возвращаемое значение:
// <Булево> – Истина загрузка произошла
// - Ложь загрузки не было
//
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт
Файл=Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути
Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="\" Тогда
Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли;
// Строка корнекта
Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId=790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка
Об_Конект.Open(Стр_Конект);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь;
КонецПопытки;
// формируем запрос
// Здесь есть нюанс первая строка данных всегда будет являться заголовком
// если она пустая то имена клонок формируются следующим образом F<Номер колонки>
Стр_SQL = "S_elect
| F1 as Артикул,
| F2 as Наименование,
| F3 as ПолноеНаименование
| FROM [A1:AZ100000]
| WHERE ((F1 Is Not Null) AND (F1 <>''))";
Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
Попытка
Об_РекордСет=Об_Конект.Execute(Стр_SQL);
Исключение
Сообщить("Не удадлось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ Об_РекордСет.EOF Цикл
// Получаем данные из Об_РекордСет
// ...
Сообщить("");
Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
// Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
КонецЦикла;
// ...
Об_РекордСет.MoveNext();
КонецЦикла;
Об_Конект.Close(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
Категория:
Конвертация данных, Обмен, Перенос Загрузка данных из MS Excel через объект ADODB Данный метод обладает гораздо большей производительностью и простотой, чем банальный объектный метод через COM соединение.
Все что потребуется это создание 2 объектов
* ADODB.Connection
* ADODB. Recordset
Код 1C v 8.х // Выполняет загрузку из файла Excel
// Параметры
// ПутьКФайлу - <Строка> - путь к файлу xls
// Автор: ---%%%Gmix 16.03.2006 12:38:48
// Возвращаемое значение:
// <Булево> – Истина загрузка произошла
// - Ложь загрузки не было
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт
Файл=Новый Файл(ПутьКФайлу);
Если Файл.Существует() Тогда
Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути
Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="\" Тогда
Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли;
// Строка корнекта
Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId=790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка
Об_Конект.Open(Стр_Конект);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь;
КонецПопытки;
// формируем запрос
// Здесь есть нюанс первая строка данных всегда будет являться заголовком
// если она пустая то имена клонок формируются следующим образом F<Номер колонки>
Стр_SQL = "S_elect
| F1 as Артикул,
| F2 as Наименование,
| F3 as ПолноеНаименование
| FROM [A1:AZ100000]
| WHERE ((F1 Is Not Null) AND (F1 <>''))";
Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
Попытка
Об_РекордСет=Об_Конект.Execute(Стр_SQL);
Исключение
Сообщить("Не удадлось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ Об_РекордСет.EOF Цикл
// Получаем данные из Об_РекордСет
// ...
Сообщить("");
Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
// Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
КонецЦикла;
// ...
Об_РекордСет.MoveNext();
КонецЦикла;
Об_Конект.Close(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
Категория:
Работа с Microsoft Office и OpenOffice Получение списка зарегистрированных на текущем компьютере баз 1С Предприятие 1Cv7 Код 1C v 7.x
Процедура ПолучитьСписокИБ()
Попытка
ScrptCtrl= Новый COMObject( "MSScriptControl.ScriptControl" ) ;
ScrptCtrl. Language= "vbscript" ;
ScrptCtrl. AddCode( "
|Function Get1CV77Titles()
| const HKEY_CURRENT_USER = &H80000001
| Set oReg=GetObject("" winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"" )
| strKeyPath = "" Software\1C\1Cv7\7.7\Titles""
| oReg.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValues
| strInfo=vbNullString
| Get1CV77Titles = strInfo
| On Error Resume Next
| For i = LBound(arrValues) To UBound(arrValues)
| call oReg.GetStringValue(HKEY_CURRENT_USER,strKeyPath,arrValues(i),Value)
| strInfo=strInfo & arrValues(i) & vbTab & Value & vbCrLf
| Next
| Get1CV77Titles = strInfo
|End Function
|" ) ;
Текст= СокрЛП( ScrptCtrl. Run( "Get1CV77Titles" ) ) ;
Исключение
Сообщить( ОписаниеОшибки( ) ) ;
Возврат ;
КонецПопытки ;
ТаблицаПути. Очистить( ) ;
Если НЕ ЗначениеЗаполнено( Текст) Тогда
Возврат ;
КонецЕсли ;
Для Ном= 1 По СтрЧислоСтрок( Текст) Цикл
СтрБазы= СтрПолучитьСтроку( Текст, Ном) ;
Разд= Найти( СтрБазы, Символы. Таб) ;
Путь= Лев( СтрБазы, Разд- 1 ) ;
Название= Прав( СтрБазы, СтрДлина( СтрБазы) - Разд) ;
НоваяСтрока = ТаблицаПути. Добавить( ) ;
НоваяСтрока. Имя = Название;
НоваяСтрока. Путь = Путь;
КонецЦикла ;
ТаблицаПути. Сортировать( "Имя" ) ;
КонецПроцедуры
Функция возвращает список значений содержащий список баз установленных на данном компьютаре. В котором в качестве значения указывается путь до базы, а в представлении название базы, так как она отображается в окне выбора баз при запуске 1С. Если баз не обнаруженно то возвращает строку "Error"
Код 1C v 7.x
функция сзПолучитьСписокБаз()
попытка
// Создаем объект Microsoft Script Control.
олеСкрипт = создатьобъект("MSScriptControl.ScriptControl");
// Устанавливаем в качестве языка для выполнения сценариев Visual Basic
олеСкрипт.Language = "VBScript";
// Формируем код на VB.
// В принципе он все делает. Создает объект
// Windows Management Instrumentation и уже через него
// получает значение ключи реестра преобразовывая данные
// в строку.
стрКод =
"function strGetListBase()
| const RootKey = &H80000001
| set Reg = GetObject(""winmgmts:{impersonationLevel=impersonate}!\\."" &_
| ""\root\default:StdRegProv"")
| PathKey = ""Software\1C\1Cv7\7.7\Titles""
| Reg.EnumValues RootKey, PathKey, Arr
| Answer = ""{""""СписокЗначений"""",{""
| for x = LBound(Arr) to UBound(Arr)
| call Reg.GetStringValue(RootKey, PathKey, Arr(x), Value)
| Answer = Answer & ""{{""""Строка"""","""""" &_
| Arr(x) & """"""},"""""" & replace(Value, """""""", """""""""""") &_
| """""",""""0""""}""
| if x <> UBound(Arr) then Answer = Answer & "",""
| next
| Answer = Answer & ""}}""
| strGetListBase = Answer
|end function";
// Добавляем наш код.
олеСкрипт.AddCode(стрКод);
// Вызываем его на выполнение, и пытаемся из полученного результата
// сформировать список значений.
Ответ = значениеизстроки(олеСкрипт.Run("strGetListBase"));
// Отсортируем список по Представлению баз
Ответ.СортироватьПоПредставлению();
исключение
// Если произошла ошибка. Значит вернем "Error".
Ответ = "Error";
конецпопытки;
возврат Ответ;
конецфункции
Еще примеры! Получение списка баз 1С 7.7 из реестра Категория:
Полезные, Универсальные Функции