При работе с 1С:Предприятие на базе MS SQL Server одной из самых коварных проблем является несоответствие параметров сортировки (Collation). Часто возникает ситуация, когда сам сервер установлен с латинской кодировкой (например, SQL_Latin1_General_CP1_CI_AS), а база данных 1С требует кириллическую (Cyrillic_General_CI_AS). В этой статье мы подробно разберем, почему простая команда ALTER DATABASE не решает проблему, как параметры сервера влияют на временные таблицы и какими способами можно привести систему в порядок.
Прежде всего, проанализируем иерархию Collation в MS SQL Server. Параметры сортировки определяют, как сервер будет сравнивать строки и выполнять поиск. В SQL Server существует многоуровневая система наследования:
master и tempdb.Рассмотрим ситуацию автора: при загрузке файла .dt платформа 1С пересоздает структуру таблиц. Если 1С видит несоответствие, она может принудительно установить параметры, которые считает верными для текущего региона, что приводит к ошибкам при запуске. Главная проблема заключается в базе tempdb. 1С активно использует временные таблицы. Если Collation вашей базы — кириллица, а Collation сервера (и, соответственно, tempdb) — латиница, то любой запрос, соединяющий реальную таблицу и временную таблицу, упадет с ошибкой: "Cannot resolve the collation conflict".
Если мы выяснили, что Collation сервера (и tempdb) не совпадает с базой 1С, самым правильным (хотя и радикальным) методом будет изменение Collation всего экземпляра SQL Server. Это можно сделать без полной переустановки программы, используя штатный установщик.
Рассмотрим алгоритм действий по шагам:
master, model и msdb. Вы потеряете все созданные логины, пароли, права доступа и задания (Jobs) SQL Agent. Скриптуйте их заранее.setup.exe).
Setup.exe /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER
/SQLSYSADMINACCOUNTS=Администратор /SAPWD=ВашПароль
/SQLCOLLATION=Cyrillic_General_CI_AS
После выполнения этой команды сервер станет "чистым" с нужным Collation. Вам останется только заново прикрепить (Attach) пользовательские базы и восстановить права доступа.
Существует более "ручной" метод смены параметров через запуск исполняемого файла сервера с определенными флагами. Проанализируем этот процесс:
Binn вашего экземпляра SQL (обычно это C:\Program Files\Microsoft SQL Server\MSSQL... \MSSQL\Binn).
sqlservr -m -T4022 -T3659 -s"MSSQLSERVER" -q"Cyrillic_General_CI_AS"
Важный момент: Параметр -q перекодирует все системные базы и объекты. После завершения работы команды (она может занять время) завершите процесс и запустите службу в обычном режиме. Это позволит tempdb создаваться с нужной кодировкой при каждом старте.
Выясним, почему ручное создание базы в SQL Management Studio (SSMS) и последующая загрузка .dt часто приводят к фиаско. Когда вы создаете базу через SSMS, вы можете выбрать Collation, но 1С при загрузке .dt иногда игнорирует эти настройки, если они конфликтуют с региональными настройками сервера 1С.
Разберем правильный алгоритм создания новой базы:
Cyrillic_General_CI_AS или Cyrillic_General_100_BIN..dt через конфигуратор.Проанализируем типичную ошибку администраторов. Выполнение команды:
ALTER DATABASE [Имя_Базы] COLLATE Cyrillic_General_CI_AS;
Эта команда меняет только значение по умолчанию для базы. Если в базе уже созданы таблицы (а после загрузки .dt их там тысячи), то Collation колонок в этих таблицах не изменится. Данные останутся в старой кодировке. Чтобы изменить кодировку всех данных, пришлось бы выполнить ALTER COLUMN для каждого строкового поля, что для структуры 1С практически невозможно выполнить вручную без риска разрушить логику базы.
Посмотрим на пример: У вас есть таблица _InfoRg123 с колонкой _Fld456. Даже после смены настроек базы, эта колонка сохранит старый Collation. Единственный надежный способ "перекрасить" данные — это выгрузка в .dt и загрузка в пустую базу с правильными настройками.
В современных инсталляциях 1С (начиная с платформы 8.3.x) все чаще рекомендуется использовать бинарную сортировку, например, Cyrillic_General_100_BIN. Разберем преимущества этого подхода:
Однако помните: Collation сервера и базы все равно должны быть согласованы, чтобы избежать конфликтов с tempdb.
Подводя итог нашему анализу, выделим краткую инструкцию:
SELECT SERVERPROPERTY('Collation').Latin1 — измените его через REBUILDDATABASE (Способ №1)..dt.Такой системный подход гарантирует отсутствие ошибок "collation conflict" и стабильную работу информационной базы в будущем.