Перевод исторически сложившихся систем на базе 1С:Предприятие 7.7 с формата DBF на MS SQL Server — это ответственный шаг, который часто продиктован ростом объема базы (свыше 10 ГБ) и необходимостью стабильной работы большого количества пользователей (более 40–50 человек). Несмотря на почтенный возраст платформы, правильно настроенная SQL-версия способна стабильно работать без ежегодных сверток. Рассмотрим подробно, как подготовить инфраструктуру, программный код и базу данных к такому переходу.
Для 1С 7.7 на SQL критически важным является не количество ядер процессора, а их тактовая частота. Платформа является однопоточной, поэтому для комфортной работы следует выбирать современные процессоры с частотой от 3.5 ГГц и выше. Разберем ключевые требования к «железу» и ОС:
TempDB.DLL и настройки SQL Native Client.При переходе на SQL многие сталкиваются с тем, что отчеты, которые быстро работали в DBF, начинают медленно выполняться. Это связано с тем, что SQL-сервер иначе обрабатывает запросы 1С 7.7. Выясним причины и рассмотрим методы оптимизации.
1. Кэширование констант и полномочий. В 1С 7.7 при каждом обращении к константе или полномочиям пользователя в SQL-версии происходит отдельный запрос к базе данных. Если таких обращений сотни в цикле проведения, система начинает тормозить. Посмотрим на пример реализации кэширования через глобальный модуль:
// Создадим глобальные объекты-кэши (например, через СписокЗначений)
Перем глКэшКонстант Экспорт;
Перем глКэшПолномочий Экспорт;
// Функция получения константы: если она есть в кэше — берем оттуда
Функция глКонстанта(Имя) Экспорт
Значение = глКэшКонстант.Получить(Имя);
Если ПустоеЗначение(Значение) = 1 Тогда
Значение = Константа.ПолучитьАтрибут(Имя);
глКэшКонстант.Установить(Имя, Значение);
КонецЕсли;
Возврат Значение;
КонецФункции
// Аналогично для полномочий пользователей
Функция глПолномочияПользователей(Имя) Экспорт
Значение = глКэшПолномочий.Получить(Имя);
Если ПустоеЗначение(Значение) = 1 Тогда
Значение = глПолучитьПолномочие(Имя); // Ваша функция получения из справочника
глКэшПолномочий.Установить(Имя, Значение);
КонецЕсли;
Возврат Значение;
КонецФункции
2. Установка времени ожидания захвата таблиц. Для SQL-версии часто рекомендуют устанавливать время ожидания захвата базы в 0. Это позволяет избежать длительных блокировок. Проанализируем код для автоматической настройки файла 1Cv7.CFG пользователя:
Функция УстановитьВ0ВремяОжидания()
Попытка
МойТекст1С = СоздатьОбъект("Текст");
МойТекст1С.Открыть(КаталогПользователя() + "1Cv7.CFG");
Для НомерСтроки = 1 По МойТекст1С.КоличествоСтрок() Цикл
СтрокаТекста = МойТекст1С.ПолучитьСтроку(НомерСтроки);
Если Найти(СтрокаТекста, "LockWaitTime") > 0 Тогда
// Заменяем на значение 0
МойТекст1С.ЗаменитьСтроку(НомерСтроки, " {""LockWaitTime"",""0""}}");
МойТекст1С.Записать(КаталогПользователя() + "1Cv7.CFG");
Возврат 1;
КонецЕсли;
КонецЦикла;
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Стандартный язык запросов 1С 7.7 в SQL-версии генерирует неоптимальный код, особенно при использовании условий типа Условие(Номенклатура в СЗ). Если в списке значений (СЗ) много элементов, SQL создает гигантское количество вложенных процедур. Разберем, как это обойти:
1С++ позволяет писать запросы на чистом T-SQL. Это ускоряет получение отчетов в 10–100 раз. Прямой запрос обращается непосредственно к таблицам SQL (например, _1SENTRY или RG*), минуя тяжеловесный движок платформы.Reindex и Update Statistics средствами MS SQL Management Studio.Если в системе используются периферийные базы (ПБ), можно оставить их на DBF, переведя на SQL только центральную базу (ЦБ). Однако стоит учитывать несколько моментов:
SQL Express Edition на точках, если размер базы превышает 1 ГБ, но не достигает лимитов бесплатной версии SQL. Это повысит надежность хранения данных.Таким образом, «взлет» 1С 7.7 на SQL вполне возможен и оправдан для крупных систем. Главное — обеспечить качественное серверное железо (высокая частота ЦП, SSD), внедрить кэширование часто запрашиваемых данных в коде и постепенно переходить на прямые запросы через 1С++ для критически важных отчетов.