Немного об 1с и MS SQL

Опубликовано Опубликовано в рубрике MS Windows Server 2003

1. Что такое SQL Server Enterorise Manager?

Это приложение с графическим интерфейсом для администрирования и настройки MS SQL Server 2000, а также управления серверами и базами данных MS SQL. Запускается или через меню Пуск:: Программы — Microsoft SQL Server — Enterprise Manager (в случае стандартной установки группы прогамм MS SQL Server 2000). Или же через стандартную консоль Управление компьютером (Computer Management).

2. Что такое QA?

QA — Query Analyzer — приложения для работы с базами данных SQL на языке Transact SQL. Запускается или с пункта меню «Программы — Microsoft SQL Server — Query Analyzer» (в случае стандартной установки группы прогамм MS SQL Server 2000). Другим способом является запуск из SQL Server Enterorise Manager через меню Tools. Также можно запустить через командную строку, выполнив «Пуск — Выполнить — isqlw.exe».

3. Что такое BOL?

BOL — SQL Server Books Online — Справочное руководство по языку Transact-SQL (и не только). Вызвать можно или с Query Analyzer нажав Shift+F1 (или через меню Help — Transact-SQL Help). Или же через меню Пуск: Программы — Microsoft SQL Server — Books Online (в случае стандартной установки группы прогамм MS SQL Server 2000).

4. Какие особенности 1С при доступе к MS SQL Server 2000?

В случае работы 1С с форматом базы MS SQL все данные можно условно разделить на 2 логичные части: 1 — хранящиеся в базе данных MS SQL Server; 2 — хранящиеся в виде файлов, необходимых для работы конфигурации 1С.
С первым типом файлов 1С работает c MS SQL Server посредством ODBC, большая часть запросов, посылаемых 1С к серверу храниться в файле BkEnd.dll. Некоторые хранимые процедуры для работы с таблицами базы данных хранятся в файле 1Cv7.DDS (в каталоге программы).
Со вторым типом данных 1С работает непосредственно как с файлами. Эти файлы, хранятся в каталоге базы данных. Основные с них это: 1Cv7.MD — файл с метаданными, в нем храниться все то что можно посмотреть в Конфигураторе, 1Cv7.DDS — файл описание метаданных, в этом файле хранится описание таблиц базы данных MS SQL Server, а также хранимые процедуры, 1Cv7.DBA — файл с описанием настроек доступа к MS SQL Server-у, имя сервера, логин и пароль, usrdef\users.usr — файл описания пользователей 1С.
Как видно, даже при работе с базой в формате MS SQL Server, для работы с базой данных надо указывать и каталог базы данных как в случае и с dbf-форматом базы данных для хранения файлов, в которых описана конфигурация и в которых храниться описание данных и доступа к базе. Это с одной стороны заводит в заблуждение, что для работы с форматом MS SQL Server вся база храниться на сервере, на самом деле на сервере хранятся только данные, а метаданные хранятся в виде файла, отдельно. Это оплошность 1С исправила в версии 8.0, но в 7.7 приходиться работать с тем что есть.

5. Как установить или конвертировать конфигурацию с dbf версии в SQL версию базы данных?

1. Надо иметь приложение 1С, поддерживающую работу с SQL Server. Рекомендуется использовать релизы 15 или 25 (15 более медленный, и не поддерживает конвертацию данных в 1С 8.0). Основные отлияия SQL версии приложения 1С, это название запускаемого файла 1cv7s.exe и характерное окно выбора формата хранения данных, где можно выбрать форматы: Файлы *.DBF;*CDX или MS SQL Server.
2. Еслу уже имеется база (с какими то заполненными данными), то предварительно надо выгрузить эти данные. Это делается из меню Конфигуратора: Администрирование — Выгрузить данные.
3. Создать базу в SQL Server Enterorise Manager. Закрыть SQL Server Enterorise Manager.
4. Создать базу в 1С в режиме Конфигуратора, выбрать тип хранения данных — MS SQL Server.
5. Создать в Конфигураторе пользователя.
6. Определить параметры доступа к MS SQL Server с Конфигуратора: Меню — Администрирование — Параметры базы данных SQL… .
7. Выполнить загрузку данных, елси есть выгрузка: Меню — Администрирование — Загрузить данные.
8. Если данных нет — создать метаданные конфигурации или загрузить измененую конфигурацию.
Необходимо учитывать, что при стечении некоторых обстоятельств, данные могут не загружаться в MS SQL Sever (например длинные строки в отборах или дубли данных в индексных полях), для таких случаев описание будет отдельное, или же можно поискать в интернете описание подобных ошибок.

6. Как изменить тип авторизации доступа к SQL Server?

Вся проблема в том, что 1С подключается к MS SQL Server только под логином SQL и авторизацией MS SQL Server а Windows. Если при установке был выбран режим авторизации только Windows (Windows only) — то подключиться 1С к базе в таком случае не сможет. Для того чтобы изменить тип авторизации надо открыть SQL Server Enterorise Manager, развернуть в левом углу группу «Concole Root — Microsoft SQL Servers», развернуть SQL Server Group, выбрать необходимый сервер (соответствует или имени компьютера или (local) — для локального сервера). Если серверов нет — надо зарегистрировать новый сервер, выбрав из меню Action — New SQL Server Registration… . После выбора сервера надо через меню Action выбрать пункт меню Properties (или через контекстное меню). В появишемся окне «SQL Server Properties (Configure)» надо перейти на закладку Security, в группе Security изменить Authentication на SQL Server and Windows. Перезапустить сервис (Управление комьютером — сервисы и приложения — сервисы — MSSQLSERVER — перезапустить), или перегрузить компьютер с установленным MS SQL Server.

7. Как создать базу для 1С на SQL Server

Есть как минимум 2 способа создания базы. 1 — посредством графического интерфейса SQL Server Enterorise Manager. Для создания базы, необходимо выбрать сервер, на котором будет создана база. Установить курсор на Databases, выбрать через контекстное меню или через меню Action пункт «New database…». На закладке General ввести имя базы (например base_1c), на закладке Data Files скорректировать путь на файл данных (поле location), точно также на закладке Transaction Log можно скорректировать путь для файла транзакций. Опыт показывает, что если эти 2 файла (данных и транзакций) хранятся на разных физических дисках — то скрость системы повышается (при условии что скорость дисков также сопоставима).
Второй метод — выполнив инструкцию на языке Transact-SQL (например с QA)

Код:
CREATE DATABASE [base_1c] ON (NAME = N’base_1c_Data’,
FILENAME = N’D:\SQLDATA\base_1c_Data.MDF’ , SIZE = 10, FILEGROWTH = 10%)
LOG ON (NAME = N’base_1c_Log’, FILENAME = N’D:\SQLDATA\base_1c_Log.LDF’ ,
SIZE = 2, FILEGROWTH = 10%)
COLLATE Cyrillic_General_CI_AS

где base_1c — имя базы данных, D:\SQLDATA\ — путь к каталогу файлов базы данных и файла тразакций.

8. Как поменять владельца базы SQL

Доступ к базе с 1С возможен только под владельцем базы. для того чтобы поменять влядальце, надо в QA выполнить следующий код:

Код:
use base_1c
EXEC sp_changedbowner ‘user1c’

где base_1c — имя базы данных, user1c — имя пользователя, котороый должен стать владельцем базы.

9. Как переиндексировать базу на MS SQL Server

Данная информация находилась по адресу: [необходимо зарегистрироваться для просмотра ссылки] , сейчас находится по адресу: [необходимо зарегистрироваться для просмотра ссылки]
Чтобы произвести переиндексацию необходимо выполнить такой запрос (например в QA):

Код:
USE base_1c
EXEC _1sp_DBReindex

где base_1c — имя базы данных.

Если хранимой процедуры _1sp_DBReindex нет в базе данных (база не 1С), то можно выполнить такой код (это и есть код хранимой процедуры _1sp_DBReindex):

Код:
USE base_1c
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

где base_1c — имя базы данных.

Соответсвенно код для создания хранимой процедуры:

Код:
if exists (select * from sysobjects where id = object_id(‘dbo._1sp_DBReindex’) and sysstat & 0xf = 4)
drop procedure dbo._1sp_DBReindex
CREATE PROCEDURE _1sp_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

10. Как проверить (восстановить) базу на MS SQL Server средствами сервера

Инофрмация находится по адресу: [необходимо зарегистрироваться для просмотра ссылки]

Проверку логической целостности нужно выполнять штатными средствами 1С:Предприятия (Тестирование и исправление ИБ). В случае, если такую проверку не удается выполнить, следует проверить физическую целостность БД средствами MS SQL. Для проверки целостности средствами MS SQL нужно выполнить следующую команду:
Код:
DBCC CHECKDB (‘<имя базы>’,REPAIR_REBUILD)

Перед выполнением этой команды нужно базу данных перевести в режим «single user»:
Код:
sp_dboption ‘<имя базы>’,’single user’,true

В процессе работы DBCC CHECKDB могут быть обнаружены ошибки и часть может быть сразу же исправлена. Если ошибки остались, то по всей видимости их нельзя восстановить без потери некоторых данных. В этом случае нужно запустить DBCC CHECKDB с параметром REPAIR_ALLOW_DATA_LOSS (перед запуском желательно сделать копию файлов базы данных).
Код:
DBCC CHECKDB (‘<имя базы>’,REPAIR_ALLOW_DATA_LOSS)

После выполнения DBCC CHECKDB нужно не забыть вернуться в нормальный режим (выйти из режима «single user»):
Код:
sp_dboption ‘<имя базы>’,’single user’,false

Переиндексацию базы данных на MS SQL не нужно делать так часто, как в случае с DBF-версией 1С:Предприятия (например, при аварийном завершении работы пользователя). MS SQL автоматически поддерживает индексы в актуальном состоянии. Пересоздавать индексы имеет смысл в одном из следующих случаев:
1) Индекс физически поврежден. Это случается довольно редко и для восстановления нужно использовать вышеупомянутый DBCC CHECKDB.
2) Страницы индекса сильно фрагментированы и требуется их упорядочить.
3) Нужно изменить степень заполнения индексных страниц (fill factor).
4) Требуется изменить тип индекса (кластерный/некластерный). При использовании 1С это обычно неактуально.

Переиндексация была рассмотрена в 9 пункте.

11. Как упаковать (зашринковать) базу на MS SQL Server

Упаковать базу данных можно или с помощью графического интерфейса приложения SQL Server Enterorise Manager, или с помощью выполнения кода (например с QA).
Первый случай выполняется посредством вызова контекстного меню на необходимой базе и выбора All Tasks — Shrink Database… .
Второй случай опишем несколько подробнее. В приведенном коде выполняется 4 строки кода. 1 строка — усечение всей базы. 2 строка — усечение только DATA файла до размера 101 мб. 3 строка — усечение только файла транзакций до размера 0 мб (несколько килобайт). 4 — строка — очистка журнала транзакций (иногда файл транзакций усечь невозможно, по причине заисших открітіх транзакций, выполнение этой команды должно привести до полной очистки журнала транзакций).

Код:
DBCC shrinkdatabase(N’base_1c’, TRUNCATEONLY )
use [base_1c] DBCC SHRINKFILE (N’base_1c_Data’, 101)
use [base_1c] DBCC SHRINKFILE (N’base_1c_Log’, 0)
DUMP TRANSACTION base_1c WITH TRUNCATE_ONLY

где base_1c — имя базы данных.

Если приведенный више код не привел к требуемым результатам, можно попробовать выполнить следующий код:

Код:
use [base_1c]
BACKUP LOG base_1c WITH TRUNCATE_ONLY
GO
DUMP TRANSACTION base_1c WITH no_log
GO
CHECKPOINT
GO
DBCC SHRINKFILE(base_1c_log,2)
GO
DBCC SQLPERF (logspace)

где base_1c — имя базы данных. Последняя строка — получение таблицы с информацией о занимаемом месте и свободном метсе в файле транзакций.

12. Как упаковать (дефрагментировать) индексы базы на MS SQL Server

Данная информация находилась по адресу: [необходимо зарегистрироваться для просмотра ссылки] , сейчас находится по адресу: [необходимо зарегистрироваться для просмотра ссылки]
Хотя SQL Server и следит за скоростью работы индексов, но все же есть часть работы, которую придеться делать вручную для повышения производительности доступа к данным. К этим работам относится и упаковка индексов внутри базы SQL Server. Для выполнения упаковки предусметрена команда DBCC INDEXDEFRAG. Эта команда позволяет дефрагментировать каждый индекс, причем не блокируя данные, что позволяет делать это почти прозрачно для пользователей (почти, так как системные ресурсы для этой операции все равно требуются и возможно, что работа пользователей может значительно замедлиться). Также дефрагментация индексов может привести к уменьшению занимаемого места таким индексом (это будет временным уменьшением, так как при дальнейшей работе SQL Server все равно увеличит место занимаемое индексами).
Чтобы произвести переиндексацию необходимо выполнить такой запрос (например в QA):

Код:
USE base_1c
DECLARE @MyTable varchar(32)
DECLARE @MyIndex varchar(32)
DECLARE MyCursor CURSOR FOR
SELECT o.name, i.name
FROM sysobjects o INNER JOIN sysindexes i ON o.id = i.id
WHERE (o.xtype = ‘U’) AND (INDEXPROPERTY(i.id, i.name, ‘isStatistics’) = 0) AND (i.dpages > 0)
ORDER BY o.name, i.indid
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @MyTable, @MyIndex
WHILE @@FETCH_STATUS=0
BEGIN
PRINT ‘Дефрагментация индекса ‘+@MyIndex+’ из таблицы ‘+@MyTable
DBCC INDEXDEFRAG (0,@MyTable,@MyIndex)
FETCH NEXT FROM MyCursor INTO @MyTable, @MyIndex
END
CLOSE MyCursor
DEALLOCATE MyCursor

где base_1c — имя базы данных. Результатом выполнения будут таблицы для каждого индекса с ифномарцией о количестве просканированных страниц, количестве перемещенных страниц и удаленных страниц.

13. Как уменьшить рост журнала транзакций базы на MS SQL Server

Данная информация находилась по адресу: [необходимо зарегистрироваться для просмотра ссылки] , сейчас находится по адресу: [необходимо зарегистрироваться для просмотра ссылки] .
Для того чтобы файл транзакций не рос очень стремительно, надо в свойствах базы данных установить режим «Simple» поля Recovery закладки Options окна свойств базы данных.

14. Как скопировать базу 1С, работающую с базой БД в формате MS SQL Server?

Есть как минимум 3 способа это сделать.
Сделать выгрузку/загрузку в режиме Конфигуратора. Этот способ наиболее длительный, и в тоже время делать эту процедуру можно делать лишь тогда, когда другие пользователи не работают в 1С с требуемой базой. Методика того как это делается подробно описана в литературе, поставляемой с коробоынми вариантами 1С. Отмечу лишь что технология загрузки почти ничем не отличается от описанной в пункте 5 «Как установить или конвертировать конфигурацию с dbf версии в SQL версию базы данных» методики.
Скопировать каталог базы данных 1С и скопировать файлы базы данных SQL. Этот способ является наименее временизатратным (тратится время только на дисковые операции копирования). Но выполнять его также можно лишь тогда, когда с базой 1С никто не работает. Описание процесса:
скопировать каталог базы данных 1С;
сделать Detach Database. Заходим в Enterprise Manager, выбираем необходимый сервер и базу данных. Вызываем контекстное меню (или меню Action главного меню) — Tools — All Tasks — Detach Database …:

В появившемя окне:

1 — Connections using this database: показывает сколько сейчас подключено пользователей к базе SQL. Если значение 0 — никто не подкючен и можно спокойно отключить базу. Если же подключения есть — то перед тем как нажать кнопку OK, надо будет очистить подключения (отключить пользователей, в 1С в таких случаях 1С закрывается с сообщением о невосстановимой ошибке базы данных). Отключение пользователей производится нажатием на кнопку Clear (этот процес может длиться несколько минут).
скопировать файлы базы SQL (mdf, ldf).
сделать Atach Database для отключенной базы ранее. Заходим в Enterprise Manager, выбираем необходимый сервер и становимся на ветку дерева Databases. Вызываем контекстное меню (или меню Action главного меню) — Tools — All Tasks — Atach Database …:

в появившемся окне в поле «MDF file of database to atach:» надо внести полный путь к файлу MDF базы данных (или выбрать этот файл нажав на кнопку выбора файла слева от этого поля).
сделать Atach Database для новой базы. Заходим в Enterprise Manager, выбираем необходимый сервер и становимся на ветку дерева Databases. Вызываем контекстное меню (или меню Action главного меню) — Tools — All Tasks — Atach Database …:
в появившемся окне:

1 — выбераем место положения скопированного файла MDF; 2 — задаем новое имя для базы данных (обязательно); 3 — при желании указываем кто будет владельцем (db_owner) базы данных (под каким логином будет 1С соединятся с базой данных SQL)
в режиме Конфигуратора подключаемся к скопрированному каталогу БД. Входим в меню Администрирование — Парамтеры базы данных SQL и в появившемся окне в поле «База данных» необходимо внести новое имя базы данных, а при условии изменения владельца базы данных указать и имя нового владельца в поле «Пользователь».
Сделать Backup/Restore Database… средствами SQL. Этот процесс длительне чем второй, но бвстрее чем первый. К тому же делать процедуру Backup можно и тогда, когда с базой работают пользователи. Процедура Backup-а несложная, поэтому информация предствалена вкратце. Заходим в Enterprise Manager, выбираем необходимый сервер и базу данных. Вызываем контекстное меню (или меню Action главного меню) — Tools — All Tasks — Backup Database. В появившемся окне SQL server Backup на вкладке General в группе Destination надо выбрать путь, куда будет сохранена база данных. Если в списке Backup To нет ни одной записи — надо добавить ее с помощmю кнопки Add вызвать окно «Select Backup Destination» и в нем указать файл, куда необходимо сохранить базу. Необходимо учесть, что путь является полным и должен включать и имя файла. После заполнения необходимых полей жмем кнопку OK в окне «SQL Server Backup — …». А вот процедура восстановления требует более детального рассмотрения. На первой закладке выбераем «From Device», а также в поле «Devices» выбираем файл, с которого надо восстановить данные:

На второй закладке «Options» необходимо выбрать «Force restore over existing database» (1). Также необходимо изменить полный путь к фацлу данных (mdf) и к файлу транзакций (ldf), на пути к базе в которую происходит восстановление:

15. Как изменить место размещения файлов базы tempdb MS SQL Server

Данная информация находилась по адресу: [необходимо зарегистрироваться для просмотра ссылки] , сейчас находится по адресу: [необходимо зарегистрироваться для просмотра ссылки] .
Очень часто SQL Server устанавливается по умолчанию и все системные базы (в том числе и база временных таблиц) размещается на системном диске. После установки изменить расположение файлов базы tempdb с помощью графического интерфейса SQL Server Enterorise Manager — не предоставляется возможным, но это можно реализовать с помощью выполнения SQL кода с того же QA.
Код:
USE master
GO
ALTER DATABASE TEMPDB
MODIFY FILE (NAME=’tempdev’, FILENAME=’D:\SQLDATA\tempdb.mdf’)
GO
ALTER DATABASE TEMPDB
MODIFY FILE (NAME=’templog’, FILENAME=’D:\SQLDATA\templog.ldf’)
GO

где D:\SQLDATA\- каталог в котором будут размещаться файлы базы tempdb. После выполнения приведенного выше кода, надо перезапустить SQL Server (процедура описана в пункте 6), или же остановить SQL Server и запустить его заново (что по сути равносильно).

16. Как узнать логин и пароль подключения 1С к MS SQL Server

К сожалению автор этой идеи неизвестен.
Эти данные храняться в файле 1Cv7.DBA. Этот файл привязан к файлу usrdef\users.usr (вот поэтому и надо создать хотя бы одного пользователя в конфигураторе), и если вдруг надо будет изменить этот файл (ну например кто то забыл пароль администратора) и это сделать в другой базе, то привязка потеряется, и информацию о параметрах подключения 1С к SQL Server прочесть уже не удастся. Решение этой проблемы как всегда простое — все данные по доступу к SQL Server хранятся в файле 1Cv7.DBA. Они там не в октрытом виде, но и не зашифрованы 128 битным ключом по методу md5. Вся защита основана на простеньком XOR. Если у кого есть желание, можете сами написать метод шифрования, только вот зачем, если есть уже говотовые решения.
Код:
Function XOR(Val ParA, Val ParB)
Res = 0;
Koef = 1;
For BitNumber = 1 To 8 Do
BitA = ParA % 2;
BitB = ParB % 2;
ParA = Int(ParA / 2);
ParB = Int(ParB / 2);
BitC = (BitA + BitB) % 2;
Res = Res + BitC * Koef;
Koef = Koef * 2;
EndDo;
Return Res;
EndFunction

// индексы значений с списке
// server = 2, db = 4, uid = 6, pwd = 8, checksum = 10
Function ConnectionString() export
Var SQLKeyCode[36], ConnectCode[200];
ConnectFile = IBDir() + «1Cv7.DBA»;
If FS.ExistFile(ConnectFile) = 0 Then
Message(«Это не SQL — база!», «!»);
Return (0);
EndIF;
FSO = CreateObject(«Scripting.FileSystemObject»);
F = FSO.OpenTextFile(ConnectFile, 1);
ConnectLen = 0;
While F.AtEndOfStream = 0 Do
ConnectLen = ConnectLen + 1;
ConnectCode[ConnectLen] = Asc(F.Read(1));
EndDo;
F.Close();
FSO = 0;
SQLKey = «19465912879oiuxc ensdfaiuo3i73798kjl»;
For i = 1 To 36 Do
SQLKeyCode[i] = Asc(Сред(SQLKey, i, 1));
EndDo;
Connect = «»;
For i = 1 To ConnectLen Do
Connect = Connect + Chr(XOR(ConnectCode[i], SQLKeyCode[(i — 1) % 36 + 1]));
EndDo;
vl=createobject(«ValueList»);
Connect=StrReplace(Connect,»{«,»»);
Connect=StrReplace(Connect,»}»,»»);
vl.fromSeparatedString(Connect);
return (vl);
EndFunction

if ExclusiveMode()=0 then
if FS.ExistFile(IbDir()+»1cv7.dds»)=1 then
constr=ConnectionString();
if ConStr<>0 then
server=constr.getValue(2);database=constr.getValue(4);uid=constr.getValue(6); pwd=constr.getValue(8);

Можно воспользоваться и готовой обработкой.

17. При старте 1С, или при попытке открытия конфигурации выдается сообщение «SQL State: 24000 Native: 0 Message: [Microsoft] [ODBC SQL Server Driver] Invalid cursor state»

Такое сообщение в моей практике встречалось при попытке подключиться к базе SQL под логином, отличным от владельца (DB OWNER). Надо или поменять имя пользователя в настройках Параметры базы данных SQL, или поменять владельца базы (8 пункт на этой страничке). Также такое ссобщение может появлятся при некорректном завршении предыдущего монопольного подключения (например в момент реструктуризации базы), в таком случае обычно помогает restart SQL сервера.

18. Резервная копия базы SQL и MD-файла

Для выполнения резервного копирования базы SQL и сохранением файла конфигурации (1Cv7.md) можно создать задание (job) на SQL сервере с примерно такой инструкцией на языке Transact — SQL:

DECLARE @path VARCHAR(1000) — путь бекапа SQL
DECLARE @path2 VARCHAR(1000) — путь архива rar
DECLARE @CMDStr VARCHAR(1000) — строка команды для архивирования

SET @path = ‘E:\SQL_DB\backup\buh_cb_’ + CONVERT(VARCHAR(8),Getdate(),112) + ‘_’ + REPLACE(CONVERT(CHAR(19),Getdate(),108),’:’,’_’)
SET @path2 = @path + ‘.rar’
SELECT @path = @path + ‘.bak’

BACKUP database [buh_cb] TO disk = @path

SET @CMDStr = ‘rar a -y -dh -ep -rr[5] ‘ + @path2 + ‘ ‘ + @path + ‘ E:\1CV77\URBD\CB\1Cv7.MD’
EXEC xp_cmdshell
@CMDStr
— удалим SQL бекап, оставим только rar.
SET @CMDStr = ‘del ‘ + @path
EXEC xp_cmdshell
@CMDStr
GO

19. При попытке монопольно войти в 1С или при записи конфигурации выдается сообщние «База данных не может быть открыта в однопользовательском режиме»

Причиной такого поведения 1С есть невозможность захватить базу данных в монопольном режиме (так называемый режим Single User). Это может произойти по нескольким причинам. 1 — есть другое приложение, которое в данный момент подключено к базе, которая является базой SQL для 1С. в таком случае это приложение надо или закрыть или же открыть в нем другую базу (например в Query Analiser-е использовать команду USE Master). Если таким приложений нет (которые явно могли присоединиться к базе), можно попробовать остановить и снова запустить SQL Server (или перегрузить сервер, на котором находиться SQL база и SQL сервер). 2 — произошел сбой во время работы с базой данных в монопольном редиме с аварийным отключением соединения. При таком стечении обстоятельств, перезапуск SQL сервера не поможет. Необходимо удалять ссылки на зависшые процессы. Чтобы этого не делать, можно отключить базу (сделать Detach) и обратно подключить под другим именем (поле Attach as), после чего надо изменить настройки подключения и в Конфигураторе для текущей базы 1С (в качестве базы SQL указать базу с новым именем).

20. Как создать дополнительные индексы для таблиц

В 1С есть механизм управления индексами — это установка флажка «Сортировка» в свойствах реквизита. Но при этом индекс всегда создается как составной (напрмиер для справочников для каждого реквизита создается индекс с ROW_ID, с регистрами и того хуже, там один составной индекс по всем измерениям). Такие индексы полезны лишь тогда, когда все поля, что входят в индекс задействованы в запросе (напрмиерв условиях или в сортировках). Если же не все поля задействоаваны, тогда индекс не эфективен. Иногда помогает добавление своих индексов, скажем только по одному полю. Но если добавить индекс вручную, то 1С при следующей первой загрузке сделает верификацию и выдаст сообщение о нарушении структуры индексов и предложит запустить программу в монопльном режиме для восстановления. Решить проблему верификации можно несколькими способами, подаправить вручную харнимую процедуру, которую вызывает 1С (это системаня хранимая процедура sys.sp_statistics), но сделать такое изменение в SQL2005 будет не совсем просто. Второе решение — подправить файл, по кторому 1С проводит верификацию, а это файл 1Cv7.dds (1Cv7.dd для dbf версии). Но 1С этот файл каждый раз пересоздает при реструктуризации, и поэтому придется каждый раз вносить такие изменения после руструктуризации. Чтобы не делать такие изменения каждый раз вручную, есть компонента, которая использует OpenConf «Проект OpenConf (Открытый Конфигуратор)» Вот ссылка на первоисточник: Дополнительные индексы на таблицы БД SQL. Скачать файл можо вот по этой сслыке: ddx.zip

21. Как решить проблемы с памьятью. 1 — Windows Server не видит больше 4 GB ОЗУ, 2 SQL Server не может использовать больше 2 GB.

Проблемы с 32 разрядными Windows Server и поддержкой больше 4 GB ОЗУ рассмотрена в этой статье [необходимо зарегистрироваться для просмотра ссылки]. Описание технологии: [необходимо зарегистрироваться для просмотра ссылки]
С этой проблемой сталкиваются те, у которых на сервере более 4 GB ОЗУ.
Вкратце, для работы с памьятью более 4 GB понадобятся такие операционные сситемы:
Microsoft Windows 2000 Advanced Server,
Microsoft Windows 2000 Datacenter Server,
Microsoft Windows Server 2003 Enterprise Edition,
Microsoft Windows Server 2003 Datacenter Edition.
Для работы с памятью более 4 GB в файле c:\boot.ini надо в строке где есть параметр /fastdetect добавить параметр /PAE
Для возможности использования одним процессом более 2 GB в файле c:\boot.ini надо в строке где есть параметр /fastdetect добавить параметр /3GB.
Вот например как может выглядеть отредактированная строка в boot.ini:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=»Windows Server 2003, Enterprise» /PAE /3GB /fastdetect
Необходимо отметить что для того чтобы SQL сервер использовал больше 2 GB ОЗУ указывать ключ /3GB указывать необязательно. Почему, рассмотрено чуть ниже.
Проблема с SQL Server (2000, 7.0) и сипользованием болше 2 GB ОЗУ. В самом SQL Server есть возможность использование расширенной памяти больше 2 GB. Следует отметить что для использования SQL сервером больше 2 GB памяти необходимо использовать или Enterprise Edition или Developer Edition SQL Server. Для поддержки SQL Server памяти свыше 2 GB, он использует технологию Address Windowing Extensions (AWE). Подробное описание находиться в этой статье : [необходимо зарегистрироваться для просмотра ссылки] . А в от в этом топика форума SQL.RU находиться обсуждение целесообразности использования этого параметра:: [необходимо зарегистрироваться для просмотра ссылки] . Отмечу лишь то, что замедления работы системы и SQL сервера я не заметил, включив этот режим. Также надо отметить что для повышения производительности следует отклжючить файл подкачки для Windows. Это приведет к тому, что неисопльзуемая память не будет высвобождаться на диск, а в случае запроса к высвобожденным ресусрам не будут производиться опреации чтени с диска. Но для такой операции необходимо достаточное количество оператвиной памяти на сервере. На вопрос сколько надо пямяти для SQL сервера нет точного ответа, есть лишь рекомендации. Так например, елси работа ведеться только с одной базой, то надо выделить под SQL сервер приблизительно сколько памяти, сколько занимают файли базы данных на диске (но желательно процентов на 10-15%). Также надо отметить что при использовании AWE для SQL сервера сам рпоцесс sqlserver.exe не занимает больше места в памяти, память отводиться под кеш SQL сервера, т.е. фактически под данные базы данных.
Вот пример скрипта на языке Transact-SQL для включения режима AWE:
Код:
sp_configure ‘show advanced options’, 1
RECONFIGURE
GO
sp_configure ‘awe enabled’, 1
RECONFIGURE
GO
sp_configure ‘max server memory’, 6144
RECONFIGURE
GO

где: 6144 — размер памяти в мегабайтах, выделяемых SQL-серверу. Желательно это значение не устанавливать больше чем размер физической памяти, в противном случае при физическом резервированиия памяти под SQL SQL сервер не сможет стартовать.

22. Медленно работает 1С по сети с базой на SQL Server.

Одно из решений — правильно настроить сетевые протоколы для взаимодействия с SQL Server.
[необходимо зарегистрироваться для просмотра ссылки]

Для такой настройки ODBC должен быть версии не ниже 3.5
С помощью утилиты Client Network Utility (CLICONFG.EXE) (Program — Microsoft SQL Server — Client Network Utility) необходимо настроить протокол общения с SQL сервером. По умолчанию «Default network library» установлен в «Named Pipes», надо установить в «TCP/IP» и добавить строку в Server alias configuration. Где, соответственно, указать псевдоним, имя сервера, протокол TCP/IP, порт (можно оставить без изменений, если на сервере порт не был изменен). Вот пример настройки:

1 — пример настройки протоколов, 2 — ставить необходимо когда клиент и SQL Server находятся физически на одном компьютере, в єтом случае обмен идет не по сетвевым ресурсам, а через память.

23. После установки на SQL Server 2000 Service Pack 4 SQL стал медленне работать и меньше загружать память.

По заявлениям фирмы Microsoft есть такая проблема для 32-битной версии SQL Server 2000 SP4, для устранения этой проблемы надо скачать HotFix вот по этой ссылке:
[необходимо зарегистрироваться для просмотра ссылки]

24. После установки на SQL Server 2000 проведение документов замедлилось

Эта проблема описана в этой статье:
[необходимо зарегистрироваться для просмотра ссылки]
Есть комерческое решение этой проблемы: [необходимо зарегистрироваться для просмотра ссылки]
Есть решение и с помощью 1С++ (метод ReconnectNative() класса ODBCRecordSet) но надо быть осторожным и закрывать все открытие окна объектов, а также обнулять глобальные переменные, в которых храняться ссылки на объекты (Справочники, документы, регистры, операции).
Также эта проблема уже решена в SQL Server 2005, но пока официальной поддержки 1С V77 SQL Server 2005 нет (1С не может правильно определить версию драйвера, но эта проблема решается патчингом BkEnd.dll, как это сделать будет рассмотрено в другой статье).

25. Не могу подключиться к SQL серверу

Проблема очень обширная, подробноее ее решение рассмотрено вот в этой статье:
[необходимо зарегистрироваться для просмотра ссылки]

26. По каким то причина SQL Server очень медленно работает

Решение этой проблемы может быть как совсем простое, так и очень сложное и требующее значительных затрат (как по времени, так и по другим ресурсам). Вот статья, рассказывающая как можно протетсировать компоненты сервера на скорость, а также методы устранения узких мест: [необходимо зарегистрироваться для просмотра ссылки]
Со своего опыта добавлю, что для ускорения работы SQL Server необходимо отключить файл подкачки на том компьютере где он работает (но при этом надо минимум 2.5 GB ОЗУ). А при использовании технологии AWE — желательный объем ОЗУ — размер базы, с которой наиболее активно работают. Также, необходимо учесть, что при активной работе пользователей (например ввод за 12 часов от 2000 документов, или от 10000 транзакций (включая количество движений, т.е. записей в таблицы)), желательно чтобы SQL Server работал только с одной пользовательской базой. Также желательным будет использование RAID масивов (5 или 10 уровень) и хорошие RAID контроллеры (от 1000 у.е.). Также надо заметить, что иногда может быть полезным разделить систему и SQL базу на разные физические диски, а также разделение файла данных (mdf) и файла транзакций (ldf) на разные диски (что может быть очень проблематичным при условии использования RAID-10).

27. При попытке подключения к SQL2005 выдается сообщение «Требуется ms sql server версии 6.5 + service pack 5a или более старшая версия»

Проблема существует в версии 7.7 вплоть до 25 релиза включительно. Проблема кроется в способе определения версии MS SQL Server. При попытке подклбчения к SQL 1С проверяет версию SQL Server, причем проверяет по содержимому системной таблици. Подробно описано как вот в этом топике: [необходимо зарегистрироваться для просмотра ссылки]. Приведу текст запроса, по которому 1С определяет версию
Код:
select 504,c.name,c.description,c.definition from master.dbo.syscharsets c
where c.id = convert(tinyint,databasepropertyex ( db_name() ,
‘sqlcharset’))

Вся проблема в том, что master.dbo.syscharsets в SQL2005 это уже не таблица, а View, и изменить его — не такая уж простая задача (у меня так и не получилось, и наверное это правильно, так как изменение системных таблиц может привести к неработоспособности всего SQL Server).
Но решение есть. Дело в том, что почти все запосы, которыми 1С обращается по ODBC к SQL Server хранятся в одной DLL, а именно в BkEnd.dll. При желании, можно изменить эту DLL и дать возможность 1С работать с SQL Server 2005.
Вкратце что надо сделать:
(пример приведен для 25-го релиза 1С V7.7)
патчим bkend.dll
000D9C4A: 83 EB
000D9C4B: E8 15
000DB0B0: 83 EB
000DB0B1: E8 10

(для 26-го и 27-го релизов 1С V7.7)
000D9CCA: 83 EB
000D9CCB: E8 15
000DB130: 83 EB
000DB131: E8 10

в свойствах базы данных на SQL Server ставим Compatibility Level SQL Server 2000(80)

Если кто хочет восспользоваться готовой пропатченной BkEnd.dll — может восспользоваться этой ссылкой: BkEnd.zip

28. Как подключиться к SQL2005 по IP адресу а не по имени сервера

Проблема в том, что при установке по умалочанию во всех редакциях кроме Enterprise Edition включается только протокол SharedMemory, необходимо включить еще и TCP/IP для доступа к серверу по сети. Для этого необходимо запустить приложение Programm — Microsoft SQL Server 2005 — Configuration Tools — SQL Server Configuration Manager и включить протококол TCP/IP:

29. Как получить имя пользователя, который занимает много процессорного времени SQL-Server.

Очень часто приходиться сталкиваться с такой ситуацией, когда SQL-Server полностью или почти полностью занимает (загружает) процессор или дисковую подсистему во время работы. Для того чтобы выяснить кто из пользователей «загрузил» SQL-Server надо войти в SQL-Profiller и посмотреть какой из запросов (после его віполнения, т.е. в момент когда идет выполнение запроса, запрос в Profiler не попадает, а это знгачит что Profiler надо запустить до момента возникновения ситуации, которую надо отследить). Когда будет выявлен запрос, который занимет много процессорного времени (по колонке CPU, а также время его віполнения в милисекундах — колонка Duration), можно узнать его SPID в колонке SPID того же Profiler-а:

В этом окне видно, что выделенный запрос (который нас интересует) выполнен под SPID = 76. Теперь необходимо выполнить запрос для того чтобы получить имя пользователя и имя компьютера, с которого работает пользователь:
Код:
SELECT spid,program_name, hostprocess,hostname, loginame
FROM sysprocesses
WHERE SPID = 76

Казалось бы все просто, смотрим значенеи поля loginame и видим пользователя. Но не все так просто, дело в том, что 1С работае с SQL-Server по SQL-Server аутентификации, а єто значит, что все пользователи 1С работают под одним логином SQL (обычно это sa). Поэтому решение надо искать в результатах других столбцов выборки.
Вот к примеру один из результатов запроса:

Реузльтат этого запроса может дать нам овтет в первом из двух случаев. Есть 2 варианта работы 1С версии 7.7 с SQL-сервером (точнее штатный вариант один, разница лишь в том, где вполняется приложение 1С): 1 — работа в локальной сети, пользователи работают с приложением 1С на своих локальных компьютерах; 2 — работа на терминальном сервере, когда пользователи для работы с приложением 1С сначал подключаются к серверу терминалов, а уже с него работают с 1С.
Так если пользователь с указанным SPID работает по сети (не посредством терминального сервера), то в поле hostname — можно увидеть с какого компьютера был послан запрос, ну и зная компьютер можно легко узнать а кто же там работал в требуемое время.
Если же пользователи работают с терминального сервера — ситуация усложняется, так как в поле hostname — будет имя сервера терминадов. В этом случае может помочь значение поля hostprocess. Именно под этим номером на клиентском компьютере (сервере терминалов) стартовал процесс 1cv7s.exe, и посмотрев в Task Manager-е список процессов на термианльном сервере можно найти от имени какого пользователя стартовал процесс и таким образом выясгить имя пользователя:

30. Как сделать чтобы 1С подключался к SQL не под одним логином (SQL аутентификация), а под логинами Windows (Windows аутотентификация).

Зачем это надо? В предыдущем пунтке этого FAQ-а (как получить имя пользователя, который занимает много проуессорного времени SQL-Server) было описан механизм получения имени пользователя по его SPID, эта довольно тривиальная задача на самом деле не совсем простая, и решить ее средствами самого SQL-Server не так просто. Ситуация меняется когда все пользователи будут подключаться к SQL серверу не по одному логину, а под своими Windows-логинами. Тогда сразу видно кто выполняет интересующий запрос.
Реализовать подобное можно лишь изменив строку подключения 1С к SQL. Строка подключения 1С находится в файле BkEnd.dll. Для изменение строки подключения надо найти строку «SERVER=%s;UID=%s;PWD=%s;» и заменить на строку «SERVER=%s;UID=;PWD=; «. После чего все подключения 1С будет выполнять не под логином и паролем прописанным в полях окна «Параметры базы данных SQL», а под именем и правами Winndows. Эту процедуру следует делать с особой осторожностью, и после исправления BkEnd.dll надо обязательно внести список логинов Windows в в список логинов SQL-Server. Также необхомо пользователям дать права на базы 1С (а возможно и другие, если используются какие то дополнительные базы и обращение к им ведеться по OLE DB или ODBC) (за исключением случая пользователи принадлежат группе даминистраторов на сервере, где находится SQL-Server). Назначитт права можно віполнив ниже указанній скрипт для каждого пользователя и каждой базы:
Код:
use [master]
exec sp_grantlogin N’Domain\User1′
use [master]
exec sp_defaultdb N’Domain\User1′, N’base1′
use [master]
exec sp_addsrvrolemember N’Domain\User1′, sysadmin
use [base1]
exec sp_dbcmptlevel N’base1′
use [base1]
exec sp_grantdbaccess N’Domain\User1′, N’User1′
use [base1]
exec sp_addrolemember N’db_owner’, N’User1′

Где: ‘Domain’-имя домена;
‘User1’- имя пользователя;
‘base1′-имя базы на SQL сервере.
Зачем давать права пользователям System Administrator строкой: exec sp_addsrvrolemember N’Domain\User1’, sysadmin? Без этих прав пользователи также смогут работать с 1С, но вся проблема в том, как 1С работает с таблицей «_1SCONNECT». Так при первой загрузке 1С пытается выбрать строки с таблицы с блокировкой TABLOCKX HOLDLOCK, если блокировки нет — тогда 1С понимает что это первое подключение и удалчет все записи с таблицы, а также и саму таблицу, а потом снова создает. Но поскольку теперь работа ведется не под логином SA, то таблица создается не под dbo, а под именем логина. Для того чтобы устранить эту ошибку надо чтобы таблица создавалась под владельцем dbo, а для этого надо пользователям дать права sysadmin. К тому же если пользователь все таки вошел с отсутствием прав sysadmin, а потом пытается войти пользователь с правами sysadmin — то 1С понимает что это другое подключение и выводит сообщение о том что доступ к базе возможен только из одного каталога. Для решения такой проблемы — надо удалить таблицу «_1SCONNECT» у которой владелей не dbo, а пользователю дать права sysadmin.
Эту проблему можно обойти не давая всем пользователям права sysadmin, а достаточно лишь кому то одному, но главное условие, чтобы этот пользователь подключался к 1С первым (под ним проходила верификация).
Тепрь для просмотра кто сейчас работает с базой можно восспользоваться хранимой процедурой sp_who, но эта процедура не дает возможности отбирать подключения по имени базы и имени приложения, а также нет возможности видеть некоторые поля с информацией, скажем о загрузке процеесора или о количестве операций чтения/записи. Для получения требуемой инмормации можно сделать запрос к таблице sysprocesses, но для того чтобы не писать громоздкие запросы, можно восспользоваться хранимой процедурой, текст которой приведен ниже:
Код:
use master
create procedure sp_who_1c — аналогия sp_who, но с некоторыми рассширенніми возможностями
@dbname varchar(100) = NULL — Имя базы NULL — все базы
,@progname varchar(100) = NULL — имя программы NULL — все программы
,@orderBy varchar(100) = ‘loginame’ — столбцы сортировки

as

declare @textZP VarChar(1000)

select @textZP = ‘select spid,
ecid,
status=rtrim(status),
loginame=rtrim(loginame),
hostname=rtrim(hostname),
program_name=rtrim(program_name),
blk=convert(char(5),blocked),
dbname = case
when dbid = 0 then null
when dbid <> 0 then db_name(dbid)
end
,cmd
,cpu
,physical_io
,memusage
,login_time
from master.dbo.sysprocesses
where (spid >= 0 and spid <= 32767)’

if (@dbname is NOT NULL)
if (@progname is NOT NULL)
select @textZP = @textZP + ‘
and ((db_name(dbid) = »’+isnull(@dbname,»)+»’) and (dbid <> 0))
and upper(rtrim(program_name)) =»’+ upper(@progname)+»»
else
select @textZP = @textZP + ‘
and ((db_name(dbid) = »’+isnull(@dbname,»)+»’) and (dbid <> 0))’
else
if (@progname is NOT NULL)
select @textZP = @textZP + ‘
and upper(rtrim(program_name)) =»’+ upper(@progname)+»»

select @textZP = @textZP + ‘
order by ‘+@orderBy

—print @textZP
EXEC (@textZP)
return (0)

Вызов этой процедуры:
Код:
exec sp_who_1c ‘ruukki’,’1cv77′,’cpu desc’

31. Работа 1С v77 под Vista и MS SQL 2005

Проблемы работы 1С под MS Vista можно разделить на 2 категории:
1 — Работа в файловом варианте базы.
2 — Работа с базой в формате MS SQL.

1. Для решения проблемы работы в файловом варианте необходимо использовать 1С релиза 26 или 27 (но лучше 27). Фирма 1С реализовала механизм отключения проверки кодовой странции с помощью проверки на существование файла OrdNoChk.prm. Соответственно, этот файл должен быть или в каталоге базы данных или же в каталоге программных файлов 1С (BIN). Файл OrdNoChk.prm в каталоге BIN будет действовать на все базы, с которыми работает программа 1С запущенная с этого каталога. Следовательно, для отключения проверки кодировки для всех баз — разместите файл в каталоге BIN программных файлов, а для отключения проверки кодировки выборочно для базы (баз) создайте файл OrdNoChk.prm в каталоге базы.
В некторый случаях, дополнительно надо еще установить кодовую страницу для базы на «+Текущая системная установка». Это делается в режиме Конфигуратора:
«Меню — Администрирование — Кодовая страница таблиц ИБ… — «+Текущая системная установка»».
Надо быть осторожным при изменении кодовой страницы, если с базой работают по сети и у клиентов установлены разные версии ОС.

2. Для работы 1С с базами в формате MS SQL под MS Vista можно использовать как MS SQL 2000 так и MS SQL 2005. Хотя при установке SQL 2000 и выдается сообщение о необходимости установки более новой версии SQL Server, но установка и дальнейшая работа MS SQL Server 2000 проходит без особых проблем (пока не удалось заметить каких либо глюков). Надо только обратить внимание, что при установке SQL Server кодировка на уровне сервера может быть установлена отличная от Cyrillic_General_CI_AS, поэтому, желательно самому вручную поставить необходимую установку Collation в Cyrillic_General_CI_AS (кириллица регистронезависимая по возрастанию).
После установки надо поменять некоторые измененные системные файлы, иначе вы рискуете увидеть приблизительно такое сообщение «Для доступа к базе данных требуется ODBC-драйвер для MS SQL Server версии 3.50.0303 или старше».
Но если вы установили вашу ОС и не делали с ней никаких изменений в плане настройки безопасности, то даже работая под правами администратора или под логином администратора — вам не так просто будет скопировать файлы в папку System32. Итак, для начала надо с предыдущих версий ОС (например Windows XP или MS Server 2003) переписать вот эти 3 файла:
sqlsrv32.dll
sqlsrv32.rll
odbcbcp.dll

После чего надо эти файлы записать в папку «System32» (обычно это C:\Windows\System32\). Для этого надо сделать себя владельцем этих файлов (или папки, или всего диска):

После чего назначаете себе полный доступ на каталог (если такого доступа нет):

Теперь можно смело скопировать 3 ранее подготовленных файла и перезагрузить систему.
Но это еще не все, теперь Вам надо сделать то же самое что вы проделывали с файлом OrdNoChk.prm с 1 пункта, чтобы отключить проверку сортировки в режиме 1С:Предприятие. Выполнив такие изменения можно смело работать с 1С.
Но для режима 1С:Конфигуратор файла OrdNoChk.prm недостаточно, Все дело в том, что в режиме конфигуратора почему то 1С не обращает внимание на наличие этого файла (логично предположить), для того, чтобы вопрос о сортировке не возникал при изменении структуры базы в режиме Конфигуратора надо подправить файл BkEnd.dll (подсмотрено как это делает USP для более ранних релизов):
(для 26-го и 27-го релизов 1С V7.7)
по смещению 0018A6DD поменять значение с 75h на EBh (117 на 235)

И еще одно маленькое замечание по работе с MS Windows Vista, чтобы каждый раз не отвечать на вопросы при установке каких то программ или регистрации DLL-ок лучше сразу отключить контроль учетных записей в панели управления:

32. При подключении 1С возникате ошибка «SQL State 42000. Native 7202. … SQL Server Could not find serve ‘ServerName’ …»

Эта ошибка возникла при переименовании имени компьютера после установки экземпляра SQL Server, и происходит несоответсвии имени SQL сервера и прописанного экземпляра имени сервера в свойствах базы данных.
Вот пример как исправить эту ситуацию для сервера SQL 2005 (хотя в 2000 также эта команда должна работать):sp_dropserver UA00560PCV
GO
sp_addserver dtuaiev0028, local
GO

где:
UA00560PCV — старое имя компьютера,
dtuaiev0028 — новое имя компьютера.