Персональный сайт Вячеслава и Оксаны
Некоторые полезные настройки при работе с УРИБ
Как перевести периферийную базу в независимую?
Ключи для запуска приложений 1С
Запрет ввода новых документов в архивную базу
Недокументированные возможности функции Шаблон
Служебные поля в файлах 1С:Предприятия (в новом окне)
Структура файлов УРИБ (в новом окне)
Создание внешних компонент (в новом окне)
Цвета проводников при обжиме (заделке) кабеля UTP
Если программа не устанавливается (Win2000, WinXP)
Пользователь и пароль для анонима на FTP-серверах
Лицензирование сервера терминала
Ошибка подключения к серверу терминалов "У вас отсутствует доступ на вход в этот сеанс"
Глоссарий некоторых сетевых терминов, используемых при подключении к Internet (в новом окне)
Как убрать надпись "Windows 2000 Professional, только для тестов"
MS SQL Как переиндексировать все пользовательские таблицы
MS SQL Как перевести 36-ричное число в десятичное (для 1С:7.7)
MS SQL Как сравнить похожие строки (неполное совпадение строк)?
MS SQL Как сохранить поле BLOB ( image ) как файл на диск?
MS SQL Почему не создается объект по sp_OACreate ?
Настройки в системном реестре:
Путь к 1С:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\1Cv7s.exe
Заголовки ИБ:
HKEY_LOCAL_MACHINE\Software\1C\1Cv7\7.7\Titles
Пути к каталогам загрузки/выгрузки:
HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Заголовок ИБ\Config\Upload/Download
directories
Чтобы нормально работало по почте:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Messaging Subsystem\MAPI =
'1'
Если по умолчанию OutlookExpress:
HKEY_LOCAL_MACHINE\Software\Clients\Mail\Outlook Express\DLLPath =
sysRoot+'\OUTLOOK EXPRESS\MSOE.DLL'
Если по умолчанию TheBat!:
HKEY_LOCAL_MACHINE\Software\Clients\Mail\The Bat!\DLLPath
= sysRoot+'\THE BAT!\TBMapi.DLL'
Информация в файле 1SDBSET.DBF
DBSIGN - Код базы (как он отображается в настройках ЦБ/ПБ)
DBDESCR - Наименование базы
DBSTATUS - "M" -
Текущая, "P" - Центральная, "C" -
Перифирийная, "N" -
никакая :) или неинициализированная (т.е. не было
первой выгрузки, статус при создании новой)
DBFNCP - имя файла загрузки из ЦБ в ПБ
DBFNPC - имя файла загрузки из ПБ в ЦБ
DBFAUTO - признак автообмена
EMAILFLGS - признак использования почты
EMAIL - почтовый адрес
Изменить информацию в файле 1SSYSTEM.DBF
DBSETUUID =
"00000000-0000-0000-0000-000000000000"
Можно, для надежности сменить и остальные поля на:
EVENTIDTA = "0"
DBSIGN = ""
SNAPSHPER = "C"
Затем удалить файлы 1SDBSET.DBF, 1SDWNLDS.DBF, 1SUPDTS.DBF и соответствующие индексные файлы (.CDX) .
CONFIG - конфигуратор
DEBUG - отладчик
ENTERPRISE - предприятие
/D<Путь> - каталог информационной базы данных
/U<Путь> - каталог пользователя
/N<Имя> - имя пользователя, как оно указанно в списке пользователей в конфигураторе
/P<Пароль> - пароль пользователя, имя которого указано в параметре /N
/M - монопольный режим.
Конфигуратор запускается с определенными ключами, например:
1cv7.exe config /dC:\Db /nUser /pPwd /@C:\backup
где:
/@ - указание на файл сценария запуска
Если расширение файла не указано, это значит, что используется стандартное для пакетного режима расширение *.prm . Может быть любое расширение, тогда нужно писать имя файла целиком, вместе с расширением. Например, можно использовать расширение .ini, что очень удобно для обработки файла сценария программами, написанными на других языках, например Delphi, который, начиная с 5 версии имеет класс работы с ini-файлами.
В пакетном режиме можно делать: выгрузку и сохранение данных, тестирование/исправление ИБ (в частности - переиндексацию) и автообмен с РБД.
Более сложные действия (загрузка измененной конфигурации или восстановление данных) пока что автоматизации не подлежат.
Структура *.prm копирует структуру обыкновенного *.ini:
[секция]
величина = значение
Перечень секций, параметров и их значений
|
Если запуск Конфигуратора в пакетном режиме оформить в виде *.bat или *.cmd (или скрипта *.vbs или *.js, что гораздо удобнее, т.к. WSH имее более продвинутые файловые функции и функции управления процессами), то с помощью любого планировщика можно организовать полностью автоматическое выполнение некоторых рутинных операций в заданное время. С некоторыми примерами пакетного запуска и использованием WSH можно ознакомиться, скачав ПримерыWSH и Набор Инструментов
Процедура глЗаполнитьШапку(Конт, Скопирован=0) Экспорт
...
//Блокировка ввода
новых документов
СтатусВозврата(0);
...
КонецПроцедуры
Хотя наиболее правильно будет изменять права пользователей, т.к. необходимо будет установить запрет и на изменение как документов, так и справочников.
// Присвоить значение
переменной по ее имени.
// в глоб.модуль:
Функция Присвоить(Чему,Что) Экспорт
Чему = Что;
Возврат "";
КонецФункции
// варианты вызова:
// Шаблон("[Присвоить("+ИмяПеременной+",ПеременнаяСоЗначением)]");
// Шаблон("[Присвоить("+ИмяПеременной+","+ИмяПеременнойСоЗначением+")]");
// Пример: пусть у нас на форме есть 5 числовых реквизитов К1, К2, ... К5
Для н=1 по 5 Цикл
Шаблон("[Присвоить("+("К"+н)+","+(н)+")]");
КонецЦикла;
Если в качестве параметров ф-ии Присвоить() могут передаваться ТаблицаЗначений или СписокЗначений, то нужно её изменить на:
Функция Присвоить(Чему,Что)
Если Найти(ТипЗначенияСтр(Что),"Значений")>0 Тогда
Чему=СоздатьОбъект(ТипЗначенияСтр(Что));
Что.Выгрузить(Чему);
Иначе
Чему = Что;
КонецЕсли;
Возврат "";
КонецФункции
В глобальном модуле доступны все
переменные, функции и реквизиты вызывающей формы! При этом даже не требуется
передавать Контекст формы!
Пример:
// помещаем в глобальный
модуль процедуру
//_____________________________________________________________________________
Процедура глТест() Экспорт
сообщить(Шаблон("[ПеременнаяМодуля]")); // получаем переменную модуля
сообщить(Шаблон("[РеквизитФормы]")); // получаем переменную модуля формы
сообщить(Шаблон("[ФункцияМодуля()]")); // вызываем функцию модуля формы
КонецПроцедуры //глТест()
// создадим внешнюю обработку
// не забудьте добавить на форму реквизит "РеквизитФормы" тип "Строка",30
// текст модуля внешней обработки:
Перем ПеременнаяМодуля;
//_____________________________________________________________________________
Функция ФункцияМодуля()
Сообщить("Сработала функция модуля");
КонецФункции
//_____________________________________________________________________________
Процедура Сформировать()
глТест(); // вызываем глоб процедуру и смотрим ...
КонецПроцедуры
//_____________________________________________________________________________
ПеременнаяМодуля="Это значение ПеременнойМодуля";
РеквизитФормы="Это значение РеквизитаФормы";
UTP
Существует два распространенных стандарта по разводке цветов по парам: T568A компании Siemon и T568B компании AT&T. Оба этих стандарта абсолютно равнозначны.
Сетевая карта <> Коммутатор по стандарту: T568A
При такой раскладке информацию несут проводники: Бело-зелёный, Зелёный, Бело-оранжевый, Оранжевый.
Сетевая карта <> Коммутатор по стандарту: T568B
При такой раскладке информацию несут проводники: Бело-оранжевый, Оранжевый, Бело-зелёный, Зеленый.
Сетевая карта <> Сетевая карта (Кроссовер кабель)
Обжатая таким образом, витая пара может вам понадобиться в 2 случаях: а) для соединения 2 компьютеров без коммутатора; б) для соединения 2 или более Hub/Switch
Иногда бывают случаи, когда, по непонятным причинам, инсталляция программного обеспечения либо не получается, либо в процессе выдаются ошибки, типа:
"Точка входа в процедуру бла-бла-бла не найдена в библиотеке DLL ла-ла.dll"
В большинстве случае помогает войти под пользователем с правами админа и английским именем. Ну не любят МелкоМягкие русских! :)
Некоторые FTP-клиенты не умеют подставлять автоматически данные для анонимного входа на публичные FTP-сервера. В таком случае можно ввести следующие значения:
Так представляется Internet Explorer. Вообще-то, главное, чтобы пароль не был пустым, например, браузер Opera подставляет символ "-"
Официальная процедура активации службы лицензирования терминалов (Terminal Server Licensing) и добавления клиентских лицензий достаточно проста, но требует аккуратного подхода.
Запускаем Terminal Server Licensing (Start -> Control Panel -> Administrative Tools-> Terminal Server Licensing).
Выбираем терминальный сервер, который мы хотим активировать, далее right-click и Properties. На вкладке Installation Method выбираем метод установки Web Browser (в Windows 2000 - WorldWideWeb).
Переходим на вкладку Required Information, заполняем поля различной лабудой и жмем OK
На терминал-сервере, который мы активируем, right-click и Activate Server. Запустится Terminal Server License Server Activation Wizard. Знакомимся с описанием и жмем Next
Выбираем метод активации Web Browser (в Windows 2000 - WorldWideWeb), жмем Next.
На этом шаге нам небходимо обратится на сайт https://activate.microsoft.com/ для получения license server ID.
На веб-сайте Terminal Server Licensing выбираем опцию Activate a license server и жмем Next
На этом шаге нам нужно заполнить поля, помеченные (*). Product ID берем из Terminal Server License Server Activation Wizard (см. шаг 6), остальные поля заполяем той же лабудой, что и на шаге 3. После того жмем Next, далее проверяем введенную информацию и опять жмем Next.
Если все правильно, то мы получим необходимый license server ID. Сайт activate.microsoft.com закрывать не нужно, он нам пригодится в дальнейшем для получения client access licenses (CALs). Вводим полученный license server ID в Terminal Server License Server Activation Wizard (см. шаг 6), а так же желательно распечатать страничку или сохранить где-нибуть license server ID, он может потом потребоваться. Жмем Next. На этом первая часть, активизация сервера лицензирования сервера терминалов, завершена.
Для установки client access licenses (CALs), второй части, нужно проверить, что галочка Start Terminal Server Client Licensing Wizard установлена и нажать Next. Мы увидим приветствие мастера установки клиентских лицензий. Знакомимся с информацией и жмем Next.
Возвращаемся к сайту activate.microsoft.com на ту страницу, которая осталась открытой на шаге 9. На вопрос "Do you wish to install license tokens at this time?" отвечаем Yes.
Заполняем поля, помеченные (*). License Server ID берем из Terminal Server CAL Installation Wizard (см. шаг 10), в качестве License Program выбираем тот вид соглашения, который вы заключили с Microsoft при покупке лицензий. Один мой знакомый в качестве эксперимента выбрал Enterprise agreement. Остальные поля заполяем той же лабудой, что и на шаге 3. После этого жмем Next.
Выбираем:
Product Type - Windows Server 2003 Terminal Server Per Device Client
Access License
(для Windows 2000 - Windows 2000 Server Terminal Services Client Access
License (per-device))
Quantity - количество купленных вами у Microsoft лицензий. Мой знакомый в качестве эксперимента указал здесь число 1000.
Agreement Number - номер вашего соглашения с Microsoft. Мой знакомый сделал в поисковой системе запрос "Enrollment Agreement Number" (пример запроса), и система нашла множество 7-значных номеров, один из которых он и ввел.
Далее жмем Next, проверяем введенную инфу и опять жмем Next.
Если все правильно, то мы получим необходимый license key pack ID (7 групп по 5 символов), который вводим в Terminal Server CAL Installation Wizard (см. шаг 10), жмем Next, а потом Finish.
* "Enrollment Agreement Number": 6565792 5296992 3325596 4965437 4526017 ... или получить по поиску
Оригинал статьи находится здесь
Если Вы активизировали удаленный рабочий стол, то подключаться к вашему серверу могут только члены локальной группы Администраторов. Через Настройку служб Терминалов (из меню Администрирование), можно разрешить остальным учетным записям и группам подключаться в этом режиме к этой службе.
Такое сообщение может появиться после установки WindowsMediaPlayer Beta.
1. Чтобы вывести/запретить показ версии Windows 2000/XP на Рабочем столе, надо отредактировать в разделе HKEY_CURRENT_USER\ControlPanel\Desktop параметр PaintDesktopVersion типа DWORD. Если он равен 1, то версия показывается, 0 - нет. Для Win9x этот параметр должен быть строкового типа.
2. Если п.1 не помог, то в реестре надо убить ключи:
HKLM\SOFTWARE\Microsoft\SystemCertificates\CA\Certificates
\FEE449EE0E3965A5246F000E87FDE2A065FD89D4 HKLM\SOFTWARE\Microsoft\SystemCertificates\ROOT\Certificates \2BD63D28D7BCD0E251195AEB519243C13142EBC3
Как переиндексировать все
пользовательские таблицы
CREATE PROCEDURE sp_DBReindex AS
SET NOCOUNT ON
DECLARE @TableName char(32)
DECLARE SysCur CURSOR FOR SELECT name FROM sysobjects WHERE type='U'
OPEN SysCur
FETCH NEXT FROM SysCur INTO @TableName
WHILE @@FETCH_STATUS=0
BEGIN
DBCC DBREINDEX(@TableName)
FETCH NEXT FROM SysCur INTO @TableName
END
CLOSE SysCur
DEALLOCATE SysCur
Наверх
Как подключить базу обратно к MS SQL
Server 2000 после того, как она подключалась к MS SQL Server 2005?
К сожалению, никак. При подключении базы 2000-го к 2005-му происходит необратимое преобразование ее внутренней структуры, поэтому обратное подключение невозможно.
Наверх
Как
перевести 36-ричное число в десятичное (для 1С:7.7)
create function
base36_to_base10 (@base36 char(6))
returns char(10)
as
begin
if @base36 is null return null
if rtrim(@base36)='0' return ' 0'
declare @base10 char(10)
declare @ch char(1)
declare @int int
declare @bigint bigint
declare @len int
declare @por bigint
declare @c int
set @base36=ltrim(@base36)
set @len=len(@base36)
set @por=1
set @bigint=0
set @c=@len
while @c>0
begin
set @ch=substring(@base36,@c,1)
if (@ch<'A')
set @int=ascii(@ch)-ascii('0')
else
set @int=ascii(@ch)-ascii('A')+10
set @bigint=@bigint+@int*@por
set @c=@c-1
set @por=@por*36
end
set @base10=right(' '+rtrim(cast(@bigint
as char(10))),10)
return (@base10)
end
Наверх
Как сравнить похожие строки (неполное
совпадение строк)?
Ниже привожу пример функции нечеткого
сравнения строк. Возвращаемое значение - от 0 (вообще не совпадает) до 1 (совпадает
полностью)
По опыту, результат сравнения можно считать достоверным при совпадении больше
0.8 (80%)
CREATE FUNCTION
fn_FuzzyCompareString(
@Stri1 varchar(250),
@Stri2 varchar(250),
@MaxLen int)
RETURNS float
AS
BEGIN
DECLARE @Str1 varchar(250), @Str2 varchar(250), @SCountVar int,
@SCountEq int, @LenStr int, @Res float
DECLARE @NumSymbStr2 int
DECLARE @Cnt1 int, @Cnt2 int
DECLARE @SubStr varchar(250)
SELECT
@LenStr=1,
@SCountVar=0 ,
@SCountEq=0,
@res=0
Set @Str1 = replace(LTRIM(RTRIM(upper(@Stri1))),'.',' ')
Set @Str2 = replace(LTRIM(RTRIM(upper(@Stri2))),'.',' ')
if ((@MaxLen <= 0) or (Len(@Str1)=0) or (Len(@Str2)=0))
Begin
Set @Res=0
End
else
begin
While (@LenStr<=@MaxLen)
BEGIN
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str2))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str2,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str1)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @NumSymbStr2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr)<=LEN(@Str1))
BEGIN
Set @SubStr = '%'+SUBSTRING(@Str1,@NumSymbStr2,@LenStr)+'%'
if (PATINDEX(@SubStr, @Str2)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr2=@NumSymbStr2+1
Set @Cnt2 = @Cnt2+1
END
Set @LenStr=@LEnStr+1
END
end
if @SCountVar=0
SET @Res=0
Else
BEGIN
SET @Res=Convert(Numeric (10,5),@SCountEq)/Convert(Numeric (10,5),@SCountVar)
END
RETURN @Res
END
Использование этой функции (на примере прямого запроса к справочнику ФизЛица для
1С:ТиС 7.7): в выборку попадут все физлица, у которых релевантность выше 0.8
DECLARE @FIO varchar(250)
Set @FIO = 'Иванов Петр'
SELECT
Спр.Code as [ФизЛицоКод],
Спр.ID as [ФизЛицо],
Спр.DESCR as [ФИО],
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3) As [Релевантность]
FROM
SC503 as Спр (nolock)
where
ISMARK = 0
and
ISFOLDER = 2
and
dbo.fn_FuzzyCompareString(dbo.fn_FIO(Спр.DESCR),@FIO,3)>=0.8
GO
Наверх
Как сохранить поле BLOB (image) как файл на диск?
Наиболее эффективно это можно сделать с
помощью объектов OLE Automation , работа с которыми осуществляется при помощи:
sp_OACreate, sp_OAGetProperty, sp_OASetProperty,
sp_OAMethod, sp_OAGetErrorInfo, sp_OADestroy (подробное
описание есть в
BOL).
Рабочий пример процедуры (была написана для сохранения zip-архивов, хранящихся в
базе):
CREATE PROCEDURE
dbo.SaveRequestDataAsFile (
@FileName varchar(1024) --имя файла
,@FilePath varchar(1024) --путь файла
,@ReqID --некое условие на таблицу
)
AS
BEGIN
DECLARE
@Stream integer,
@Buffer varbinary(4096),
@Size integer,
@Pos integer,
@BufSize integer,
@FileNameLocal varchar(1024),
@HR integer
if RIGHT(@FilePath, 1)<>'\' begin set @FilePath=@FilePath+'\' end
set @FileNameLocal = @FilePath + @FileName
SET @BufSize = 4096
EXEC @HR = sp_OACreate 'ADODB.Stream',@Stream OUT
if @HR<>0
begin
--обработка ошибки создания объекта
EXEC [dbo].[sp_displayoaerrorinfo] @Stream ,@HR
end
EXEC @HR = sp_OASetProperty @Stream,'Type',1 -- binary
EXEC @HR = sp_OASetProperty @Stream,'Mode',3 -- write|read
EXEC @HR = sp_OAMethod @Stream,'Open'
select
@Size = DATALENGTH(SrvRequests.RequestData)
FROM SrvRequests WHERE SrvRequests.RequestID = @ReqID
Set @Pos=0
WHILE @Pos < @Size BEGIN
SET @BufSize = CASE WHEN @Size - @Pos < 4096 THEN @Size - @Pos ELSE 4096 END
select @Buffer = substring(SrvRequests.RequestData ,@Pos+1, @BufSize)
from SrvRequests where SrvRequests.RequestID = @ReqID
EXEC @HR = sp_OAMethod @Stream, 'Write', NULL, @Buffer
SET @Pos = @Pos + @BufSize
END
EXEC @HR = sp_OAMethod @Stream,'SaveToFile',null, @FileNameLocal,2
EXEC @HR = sp_OAMethod @Stream,'Close'
EXEC @HR = sp_OADestroy @Stream
END
Рекомендуется создать еще пару процедур для внятного описания ошибок в случае их
возникновения
----------------------------------------------------------------------
CREATE PROCEDURE
sp_hexadecimal
@binvalue varbinary(255),
@hexvalue varchar(255) OUTPUT
AS
DECLARE @charvalue varchar(255)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH(@binvalue)
SELECT @hexstring = '0123456789abcdef'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
----------------------------------------------------------------------
CREATE PROCEDURE
sp_displayoaerrorinfo
@object int,
@hresult int
AS
DECLARE @output varchar(255)
DECLARE @hrhex char(10)
DECLARE @hr int
DECLARE @source varchar(255)
DECLARE @description varchar(255)
PRINT 'OLE Automation Error Information'
EXEC sp_hexadecimal @hresult, @hrhex OUT
SELECT @output = ' HRESULT: ' + @hrhex
PRINT @output
EXEC @hr = sp_OAGetErrorInfo @object, @source OUT, @description OUT
IF @hr = 0
BEGIN
SELECT @output = ' Source: ' + @source
PRINT @output
SELECT @output = ' Description: ' + @description
PRINT @output
END
ELSE
BEGIN
PRINT ' sp_OAGetErrorInfo failed.'
RETURN
END
Почему не создается объект по sp_OACreate ?
Причин может быть несколько:
1) библиотека не зарегистрирована. Для исправлениея проблемы используйте
regsvr32
Примеры:
содержимое bat-файла для регистрации библиотеки:
regsvr32 "%CD%\MySuperPuperFunc.DLL"
или
rundll32 "%CD%\MySuperPuperFunc.DLL", DllRegisterServer
2) достаточно экзотическая проблема, которая все же имеет место быть:
библиотека скомпилирована для платформы x86, а вызывается с платформы x64.
В описаниях сказано, что MS SQL Server x64 НЕ УМЕЕТ делать x86 ориентированные
вызовы, ТОЛЬКО x64. Решение проблемы может быть следующим:
а) перекомпилировать DLL под x64 или написать обертку
б) попытаться сконфигурировать DLL при помощи dcomcnfg.exe в
полноценный COM+
в) попытаться изменить соответствующие ветви реестра,
согласующие 32-х и 64-х битные процессы
(HKCR\Wow6432Node\AppID\)
Эта тема активно обсуждалась на www.rsdn.ru
forum.sources.ru
www.sources.ru
(PS Лично мне так и не удалось заставить работать корректно RARUSLIB.DLL под SQL
2005 x64 на Win2003 Server R2)