В практике администрирования старых систем 1С:Предприятие 7.7 часто возникает вопрос оптимизации производительности или обновления серверного парка. Одним из вариантов является схема, при которой SQL Server находится на одном физическом или виртуальном сервере, а каталог с базой данных (файлы конфигурации .md, внешние отчеты .ert и таблицы базы) — на другом. Рассмотрим подробнее, насколько жизнеспособна такая схема, какие подводные камни нас ожидают и как правильно настроить систему для стабильной работы.
Схема с разнесением исполняемых файлов/метаданных и сервера базы данных является технически допустимой и даже штатной для платформы 1С 7.7. В стародавние времена, когда аппаратные ресурсы серверов были сильно ограничены, разделение дисковой нагрузки между «файловой помойкой» и расчетным сервером SQL позволяло выиграть в производительности. Проанализируем ситуацию: платформа 1С 7.7 при запуске в режиме SQL все равно требует наличия общего сетевого каталога. В этом каталоге хранятся не только файлы метаданных 1cv7.md, но и служебные файлы блокировок, журналы регистрации и временные файлы пользователей.
Разберем, почему при такой схеме могут возникнуть задержки. Основная проблема кроется в протоколе SMB. 1С 7.7 крайне чувствительна к скорости доступа к файлу конфигурации и другим мелким файлам в каталоге базы. Если сеть имеет высокую латентность (задержки), работа пользователей станет невыносимой. Для минимизации проблем выполним следующие шаги:
SMB Signing и Opportunistic Locking (Oplocks). Это предотвратит ложные блокировки файлов и «вылеты» программы при кратковременных сетевых миганиях..md, .dbf, .cdx (если есть), .ert в исключения антивирусной проверки на обоих серверах.Рассмотрим ситуацию, когда мы хотим уйти от древнего SQL 2000 на более современные версии, такие как SQL 2008, 2012 или даже 2019. Штатно 1С 7.7 «умеет» работать только с SQL 6.5 и 2000. При попытке подключения к более новым версиям возникнет ошибка проверки версии.
Для решения этой проблемы используем так называемый «секретный релиз». Это набор патченных библиотек, в частности BkEnd.dll. Проанализируем, что именно делает этот патч: он подменяет алгоритм проверки версии SQL-сервера, заставляя 1С думать, что она работает с привычным SQL 2000. Найти данный патч можно на специализированных ресурсах, таких как Инфостарт (ищите по запросу «секретный релиз 7.7.27.7»).
При использовании новых версий SQL Server (начиная с 2005) вы почти наверняка столкнетесь с ошибкой: «Порядок сортировки, установленный для базы данных, отличается от системного». Выясним причину: современные SQL-серверы иначе обрабатывают сопоставления (collations). Чтобы не пересоздавать базу с экзотическими настройками, мы можем заставить 1С игнорировать эту проверку.
Для этого выполним простое действие: создадим в каталоге установленной программы 1С (там, где лежит 1cv7s.exe) пустой текстовый файл и переименуем его в OrdNoChk.res. Это «магический» флаг, который отключает проверку соответствия кодовых страниц и позволяет запустить базу.
Посмотрим на особенности настройки подключения. 1С 7.7 — это 32-битное приложение. Оно использует драйвер SQL Server (SQLSRV32.DLL). На 64-битных версиях Windows Server настройка источников данных ODBC через стандартную панель управления может не сработать для 1С.
Разберем по шагам правильную настройку:
C:\Windows\SysWOW64\odbcad32.exe.Проанализируем вопрос производительности штатных запросов 1С 7.7. Они генерируют крайне тяжелый и неоптимальный T-SQL код. Если ваша база велика, разделение серверов может усугубить ситуацию. В этом случае спасением станет внешняя компонента 1C++.
Она позволяет писать прямые SQL-запросы к таблицам базы. Посмотрим на пример инициализации объекта для работы с SQL:
// Пример инициализации прямого запроса в 1С++
Запрос = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = "
|SELECT
| Жур.IDDOC as [Док $Документ],
| Жур.IDDOCDEF as Док_вид
|FROM
| _1SJOURN as Жур
|WHERE
| Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~
|";
Запрос.УстановитьТекстовыйПараметр("НачДата", ВыбНачДата);
Запрос.УстановитьТекстовыйПараметр("КонДата", ВыбКонДата);
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
Использование прямых запросов через 1C++ нивелирует практически все тормоза, связанные с «прослойкой» штатного движка 1С, и позволяет системе летать даже на распределенной инфраструктуре.
Выясним, какие настройки самого SQL-сервера помогут нам при разнесении ролей:
Simple. Это предотвратит бесконтрольный рост лога транзакций (.ldf), который в 7.7 растет очень быстро из-за обилия мелких операций.tempdb на максимально быстром диске (NVMe/SSD) даст существенный прирост скорости.SQL Server 2008 (100) или SQL Server 2012 (110). Это может решить проблемы с планами выполнения некоторых штатных запросов.Подводя итог, можно сказать: схема «SQL на одном сервере, база на другом» вполне рабочая. Главное — обеспечить качественную сеть, использовать «секретный релиз» для обхода ограничений версии SQL и не забыть про OrdNoChk.res для корректной работы с кодировками.