Владимир Сердюк
Для начала ответим на вопрос - зачем это нужно? Это нужно для каких-либо изменений в структуре внутренних таблиц 1С и в первую очередь для подключения стандартного механизма репликации MS SQL. При подключении стандартного механизма репликации сервер автоматически добавляет служебные поля к таблицам, поставленным на репликацию. Также добавляются индексы и в некоторых случаях изменяются свойства столбцов, например identity.1С при прохождении процедура верификации анализирует структуру базы данных и в случае расхождения со структурой описанной в dds файле выводит ошибку и заканчивает сеанс.
Анализ в профайлере лога действий 1С по верификации показывает, что для анализа БД используются три хранимые процедуры: sp_columns, sp_tables, sp_statistics.
sp_tables - свойства таблицы
sp_columns – состав и свойства столбцов таблицы
sp_statistics – состав и свойства индексов таблицы
Отключать верификацию можно по-разному. Можно отключать верификацию только служебных полей или же конкретных таблиц. Я предпочитаю отключать верификацию полностью и заменять ее своей проверкой соответствия md – структура. Для того чтобы 1С проходило успешно процедуру верификации независимо от типа и состава изменений в БД, необходимо выполнить следующие действия. До изменений в структуре запоминать результаты, возвращаемые вышеописанными процедурами. Затем после изменений в структуре хранимые процедуры должны возвращать данные из записанного ранее хранилища.
У меня реализация была следующей:
1) Создается БД Verify_1C. В ней будут храниться данные о структуре БД 1С. Также в ней будет храниться таблица Check_Verify_1C в которой будут храниться флаги включения, отключения верификации конкретной базы.
CREATE TABLE [dbo].[Check_Verify_1C] (
[Base] [char] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
[Flag] [int] NOT NULL
) ON [PRIMARY]
где Base – база данных 1С а Flag – флаг включения отключения верификации. Flag принимает следующие значения : 0 – стандартный режим работы БД,1 – включение на запись, 2 – включение на чтение.
2) Создаются таблицы sp_columns_1c, sp_statistics_1c, sp_tables_1c. В этих таблицах будет храниться информация возвращаемая соответствующими хранимыми процедурами а также плюс два дополнительных поля: Table_Name_1C – Таблица 1С , Base_1C – База данных 1С.
3) Меняются текст хранимых процедур sp_columns, sp_tables, s
4) Изменяем текст хранимых процедур. Краткая концепция изменения следующая.
а) Если приложение не 1С или значение флага для конкретной БД равно 0 – процедуры работают как и раньше.
set @flag=0
select @flag=flag from verify_1c.dbo.Check_Verify_1C where base=db_name()
if (app_name()='1CV7') and (@flag<>0)
б) Если значение флага равно 1 то происходит запись в таблицы: sp_columns_1c, sp_statistics_1c, sp_tables_1c и возвращается результат приложению.
if @flag=1
begin
delete from [Verify_1c].[dbo].[sp_tables_1c] where table_name_1c=@table_name and base_1c=db_name()
insert into [Verify_1c].[dbo].[sp_tables_1c] select
…
в) Если значение флага равно 2 то происходит чтение из соответствующих таблиц
SELECT [TABLE_QUALIFIER], [TABLE_OWNER], [TABLE_NAME], [TABLE_TYPE], [REMARKS]
FROM [Verify_1c].[dbo].[sp_tables_1c]
where table_name_1c=@table_name and base_1c=db_name()
order by 4, 1, 2, 3
Собственно говоря и все… Для того чтобы нам отключить верификацию базы Test нам необходимо будет выполнить следующие действия:
1) Первый раз добавить базу Test в таблицу Check_Verify_1C.
2) Включить флаг на запись т.е. в 1-ку.
3) Запустить 1С и убедиться(можно и не убеждаться если вы все правильно сделали?)
что в таблицах sp_columns_1c, sp_statistics_1c, sp_tables_1c появились записи
соответствующие процедурам.
4) Ставим флаг на чтение и можем теперь менять структуру, так как мы того захотим.
1С получит от хранимых процедур именно то,что она ожидает.
У меня все подобные действия оформлены в виде хранимых процедур и отключение включение верификации выполняется буквально нажатием одной кнопки.
P.S. При изменении структуры таблиц мы можем отключать верификацию, но во время работы 1С мы столкнемся с дополнительными трудностями, которые впрочем, решаются. Однако это уже тема следующей статьи.