В каком случае имеет смысл прямая запись в SQL-таблицу?
Когда может понадобиться прямая запись в SQL-таблицу на платформе 1С 8.1?
В нашем случае таблица регистра 1С8.1 использовалась как источник для перекачки данных в другую учетную базу. Некоторое время все работало средствами 1С. Но настал момент, когда процесс записи регистра стал занимать неприлично много времени. При этом все данные в регистре «остро необходимы».
Как ускорить процесс записи в SQL-таблицу
После некоторых мытарств (превзойти 1С в плане оптимизации работы с SQL мне не удалось), встал вопрос об индексации таблицы. В итоге было решено скопировать таблицу регистра в отдельную таблицу и убить все индексы, что в разы ускорило процесс прямой записи.
Далее описана реализация процесса записи в SQL-таблицу без индексов.
Пример ТЗ
Разберем на конкретном примере.
Допустим, что перед нами стоят задачи:
- Собирать по определенным счетам проводки за период в разрезе организаций (Орг) и сценариев (Сцен), обрабатывать эти данные по известным правилам и записывать данные в таблицу отдельной базы
- Записи за период по организациям и сценариям должны перезаписываться
- Необходимо архивировать таблицу в виде копий на дату
- Using Connection Pooling with SQL server
- Understanding ADO Transactions with MS SQL Server
- Использование библиотеки ADO
- Руководство по производительности загрузки данных (SQL server 2005 и SQL server 2008)
- Справочник по Transact-SQL (компонент Database Engine)
- ADO CreateParameter Metod
Реализация
Создание базы
Для создания базы нам потребуется "Enterprise Manager" (рис.1)
Рис 1.
Открыв "Enterprise Manager". позиционируемся на папке "Databases" и щелчком правой кнопки мыши создаем новую базу (рис.2).
Рис 2.
Создаем базу (рис.3).
Рис 3.
Настройка базы изображена на рис.4 и 5
Рис 4.
Рис 5.
(T-SQL:
Create DataBase MyBase
Alter DataBase MyBase SET Recovery Simple
Alter DataBase MyBase SET Auto_Shrink ON)
Создание таблицы
Откроем нашу базу, спозициониремся на "Tables" и правой кнопкой мыши - создать новую таблицу (рис. 6)
Рис 6.
Следуя ТЗ, мы имеем "ключевые" поля:
- Период
- Организация (Орг)
- Сценарий (Сцен)
Остальные поля представим в виде основных типов данных (рис. 7). Типы значений и их длина взяты на примере регистра 1С.
Рис 7.
Таким образом, мы имеем таблицу "MyTable" (рис. 8):
Рис 8.
Для корректной работы пишем Организацию и Сценарий в виде ссылок (рис. 8). Это нам понадобиться в дальнейшем.
(T-SQL:
Create Table MyBase.dbo.MyTable (ПолеПериод DateTime, ПолеОргСсылка binary(16), ПолеСценСсылка binary(16), ПолеСтрока nvarchar(100), ПолеБулево binary(1), ПолеСумма decimal(15,2))
)
Форма обработки
Рис 9.
Не претендую на то, что обработка должна выглядеть именно так. Хотелось бы отметить, что процессы обработки данных и их запись в регистр разделены.
Сбор и обработка данных
В данном случае этот процесс не представляет интереса. В конечном итоге имеем таблицу значений "таблицаДанных"
Очистка таблицы, запись в регистр
Будем использовать следующую схему:
--> НачатьТранзакцию
----> ОчиститьРегистр
----> ЗаписатьРегистр
--> ЗафиксироватьТранзакцию
Не буду приводить весь код обработки, остановлюсь лишь на основных моментах.
СтрокаКоннекта = "Provider=SQLOLEDB;Password=sdR$543Qr;Persist Security Info=True;User ID= userSQL;Initial Catalog=MyBase;Data Source=serverSQL";
//Источник получения GUID: Mista.ru
// конец источника
Далее собственные изыскания:
Фрагмент кода очистки и записи в регистр:
Необходимо отметить, что в приведенном выше фрагменте кода "FIRM" - Организация, "BASE" - Сценарий, "Entity_Name" - пример строкового значения, "InRep" - булево и "SUMM" - сумма.
Архивирование таблиц
Сразу хочу оговориться, что архивирование происходит путем копирования таблицы на определенную дату.