Как правильно перевести 1С 7.7 Торговля и Склад на SQL и обеспечить высокую производительность?

Системный администратор 1С v7.7 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Перевод исторически сложившихся систем на базе 1С:Предприятие 7.7 с формата DBF на MS SQL Server — это ответственный шаг, который часто продиктован ростом объема базы (свыше 10 ГБ) и необходимостью стабильной работы большого количества пользователей (более 40–50 человек). Несмотря на почтенный возраст платформы, правильно настроенная SQL-версия способна стабильно работать без ежегодных сверток. Рассмотрим подробно, как подготовить инфраструктуру, программный код и базу данных к такому переходу.

Подбор серверного оборудования и программной среды

Для 1С 7.7 на SQL критически важным является не количество ядер процессора, а их тактовая частота. Платформа является однопоточной, поэтому для комфортной работы следует выбирать современные процессоры с частотой от 3.5 ГГц и выше. Разберем ключевые требования к «железу» и ОС:

Программная оптимизация: избавляемся от «тормозов»

При переходе на 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С++

Стандартный язык запросов 1С 7.7 в SQL-версии генерирует неоптимальный код, особенно при использовании условий типа Условие(Номенклатура в СЗ). Если в списке значений (СЗ) много элементов, SQL создает гигантское количество вложенных процедур. Разберем, как это обойти:

  1. Отказ от вложенных условий: Вместо фильтрации внутри запроса 1С, попробуем выбирать данные по всей группе или категории, а фильтрацию по списку значений выполнять уже при обходе результата запроса в коде 1С.
  2. Использование прямых запросов: Внедрение внешней компоненты 1С++ позволяет писать запросы на чистом T-SQL. Это ускоряет получение отчетов в 10–100 раз. Прямой запрос обращается непосредственно к таблицам SQL (например, _1SENTRY или RG*), минуя тяжеловесный движок платформы.
  3. Индексация: SQL-версия критична к статистике. Регулярно (раз в неделю) выполняйте Reindex и Update Statistics средствами MS SQL Management Studio.

Переход и работа с УРБД

Если в системе используются периферийные базы (ПБ), можно оставить их на DBF, переведя на SQL только центральную базу (ЦБ). Однако стоит учитывать несколько моментов:

Таким образом, «взлет» 1С 7.7 на SQL вполне возможен и оправдан для крупных систем. Главное — обеспечить качественное серверное железо (высокая частота ЦП, SSD), внедрить кэширование часто запрашиваемых данных в коде и постепенно переходить на прямые запросы через 1С++ для критически важных отчетов.

← На главную