powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / On-line изменение схемы таблицы 1С в SQL Server'е
11 сообщений из 11, страница 1 из 1
On-line изменение схемы таблицы 1С в SQL Server'е
    #35058748
Lobion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе всем времени суток!
У меня такой вопрос, хотя лучше сначала немного предыстории…
В конторе есть 1С + SQL Server.
Задача от руководства:
Обеспечить логирование всех изменений в базе, при чем, стандартным mlg-файлом не подходит (была ситуация, когда один шибко умный пассажир просто-напросто потер логи о своих дейвствиях).
Решение:
В 1С заводится справочник «Лог». При вводе нового элемента и редактирования анализируется 1cv7.dds для выяснения какие таблицы и поля использует тот или иной справочник. При записи напрямую в SQL выполняется запрос, который создает триггер у нужной таблицы и создает таблицы куда пишет триггер. Плюс у справчника исть булево значение «Вкл/Выкл» - для включения или выключения триггера. Система работает, но есть одно НО: если при добавлении / включении / выключении / удалении триггера у кого-то открыт справочник (для которого задается параметр триггера), то 1С ругается «Could not complete cursor operation because the table schema changed after the cursor», и вылетает. Но триггер изменяется успешно.
Вот эти скульные запрос:
ИмяТаблицы -> SC1809
ПоляТаблицы-> ID, Descr и т. д.
Для добавления таблицы под логи:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
INTO [СокрЛП(ИмяТаблицы)_log] 
FROM [СокрЛП(ИмяТаблицы)] 
ALTER TABLE СокрЛП(ИмяТаблицы)_log ADD user_log [char]( 50 ) COLLATE Cyrillic_General_CI_AS NULL 
ALTER TABLE СокрЛП(ИмяТаблицы)_log ADD user_date [datetime] NULL
ALTER TABLE СокрЛП(ИмяТаблицы)_log ADD type_action [char]( 250 ) COLLATE Cyrillic_General_CI_AS NULL 
Для добавления триггеров:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TRIGGER [tСокрЛП(ИмяТаблицы)] ON [dbo].[СокрЛП(ИмяТаблицы)]
FOR INSERT, UPDATE, DELETE AS 
IF @@ROWCOUNT >  0  
SET NOCOUNT ON 
--Выполняем запрос если в таблицу добавлена новая запись
 IF NOT EXISTS(SELECT * FROM deleted) 
INSERT СокрЛП(ИмяТаблицы)_log (ПоляТаблицы, user_log, user_date, type_action) 
SELECT  ПоляТаблицы, suser_sname(), getdate(), 'Введен новый' 
FROM inserted 
--Выполняем запрос если запись в таблице удалена
ELSE IF NOT EXISTS(SELECT * FROM inserted) 
INSERT  СокрЛП(ИмяТаблицы)_log ( ПоляТаблицы, user_log, user_date, type_action) 
SELECT ПоляТаблицы, suser_sname(), getdate(), 'Удален' 
FROM deleted 
--Выполняем запрос если запись в таблице изменена
ELSE 
INSERT СокрЛП(ИмяТаблицы)_log (ПоляТаблицы, user_log, user_date, type_action) 
SELECT ПоляТаблицы suser_sname(), getdate(), 'Изменен' 
FROM inserted

Для включения / выключения триггеров:
Код: plaintext
1.
2.
ALTER TABLE [СокрЛП(ИмяТаблицы)] ENABLE TRIGGER [tСокрЛП(ИмяТаблицы)]"
ALTER TABLE [СокрЛП(ИмяТаблицы)] DISABLE TRIGGER [tСокрЛП(ИмяТаблицы)]

Вопрос:
Можно ли с этим как-то бороться и как?
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35058782
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем при каждом изменении анализировать dds?
Ведь он меняется только при изменении структуры метаданных в конфигураторе. Тогда (т.е. после конфигурирования, а не во время работы пользователей) и готовить все триггеры.
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35058888
Lobion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pailА зачем при каждом изменении анализировать dds?
Ведь он меняется только при изменении структуры метаданных в конфигураторе. Тогда (т.е. после конфигурирования, а не во время работы пользователей) и готовить все триггеры.
dds анализировать надо только когда создается новый элемент справочника "Лог", чтобы сопоставить название в метаданных и в таблицах скуля, т. е. чтобы понять, что, например, SC1809 - ни что иное, как Справочник.Кассы.
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35059399
tvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lobion
dds анализировать надо только когда создается новый элемент справочника "Лог", чтобы сопоставить название в метаданных и в таблицах скуля, т. е. чтобы понять, что, например, SC1809 - ни что иное, как Справочник.Кассы.
достаточно сделать сопоставление объектов и скульных таблиц только при запуске в режиме предприятия. закинуть все это в какую-нить таблицузначений например
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35059475
Lobion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tvm
достаточно сделать сопоставление объектов и скульных таблиц только при запуске в режиме предприятия. закинуть все это в какую-нить таблицузначений например
Как парсить ддс - НЕСУЩЕСТВЕННО!!! Важнее сам вопрос!
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35059504
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вопрос в том, как отучить 1С ругаться на изменение схемы базы во время работы пользователей с данными - то следует рассмотреть возможность вообще отказаться от таких изменений, и провести добавление всех необходимых полей и триггеров ДО того, как пустить в базу пользователей. Т.е. провести изменения схемы во время конфигурирования (сразу после закрытия конфигуратора). Или были заданы другие вопросы?
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35059535
tvm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pail...провести добавление всех необходимых полей и триггеров ДО того, как пустить в базу пользователей. Т.е. провести изменения схемы во время конфигурирования (сразу после закрытия конфигуратора). ...
так вот и я почти про тоже. на одной из моих прошлых работ тоже делали логирование. так вот при входе первого пользователя сравнивался dds и таблицы базы. если было отличие то пересоздавались триггеры
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35059549
Lobion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pailЕсли вопрос в том, как отучить 1С ругаться на изменение схемы базы во время работы пользователей с данными - то следует рассмотреть возможность вообще отказаться от таких изменений, и провести добавление всех необходимых полей и триггеров ДО того, как пустить в базу пользователей. Т.е. провести изменения схемы во время конфигурирования (сразу после закрытия конфигуратора). Или были заданы другие вопросы?
Да, вопрос именно в этом. Я совершенно ясно понимаю, что изменять онлайн схему таблицы нельзя... Все-равно, может потребоваться включать или исключать объект метеданных в/из списка логируемых. Вобщем-то и решение нашлось: использовать временную таблицу для переброски изменений в лог, потом очищать ее. А в таблице лога тогда можно будет включать или отключать триггер.

Тут еще один вопрос возник, с Вашего позволения озвучу. Вот такой запрос добавляет триггер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER [ttable_log] ON [dbo].[table_tmp]
|FOR INSERT, UPDATE, DELETE AS 
|IF @@ROWCOUNT >  0  
|SET NOCOUNT ON 
|Declare @Юзер String,
|INSERT "+СокрЛП(ИмяТаблицы)+"_log ("+ПоляТаблицы+"user_log, user_date, type_action) 
|SELECT "+ПоляТаблицы+"suser_sname(), getdate(), type_action 
|FROM inserted 
|DELETE FROM table_tmp

А как бы сделать так, чтобы вместо suser_sname(), было глПользователь, который вносит изменения в справочник?
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35060943
VVVVVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
обрати внимание на статейку

Логирование средствами MS SQL
http://www.1csql.ru/materials/articles/develop.html~49e72144-3910-2323-ade1-bc42f7e4d100
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35076263
Sure
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lobion[quot pail]
Тут еще один вопрос возник, с Вашего позволения озвучу. Вот такой запрос добавляет триггер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER [ttable_log] ON [dbo].[table_tmp]
|FOR INSERT, UPDATE, DELETE AS 
|IF @@ROWCOUNT >  0  
|SET NOCOUNT ON 
|Declare @Юзер String,
|INSERT "+СокрЛП(ИмяТаблицы)+"_log ("+ПоляТаблицы+"user_log, user_date, type_action) 
|SELECT "+ПоляТаблицы+"n.DESCR, getdate(), type_action 
|FROM inserted, "+ТаблицаИмен+" n WHERE n.ROW_ID=@@SPID
|DELETE FROM table_tmp

А как бы сделать так, чтобы вместо suser_sname(), было глПользователь, который вносит изменения в справочник?
Вот, например, в ПроКлубе есть мехнанизм, который связывает номера соединений с именами пользователей 1С:
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=3344

|SELECT "+ПоляТаблицы+"n.DESCR, getdate(), type_action
|FROM inserted, "+ТаблицаИмен+" n WHERE n.ROW_ID=@@SPID
...
Рейтинг: 0 / 0
On-line изменение схемы таблицы 1С в SQL Server'е
    #35076283
Sure
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, продолжаю:
в приведённых выше двух строчках показано, как из таблицы "ТаблицаИмен" взять имя пользователя в 1С (n.DESCR)

Кстати, проверяя подменённую процедуру при входе пользователя в 1С, можно увидеть, что изменилась конфигурация, что на SQL нужно по-новому расставлять триггеры...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / On-line изменение схемы таблицы 1С в SQL Server'е
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]