1С и Microsoft SQL Server: база на СУБД, ODBC, внешние источники и обмен

· 11 мин

Содержание

Связать 1С и SQL Server можно двумя способами, и это разные задачи. Первый: разместить саму информационную базу 1С на Microsoft SQL Server. Для этого нужен сервер 1С:Предприятия 8.3, а базу создают в его кластере с типом СУБД MSSQLServer. Второй: читать из 1С данные чужой SQL-базы. Это делают через ODBC и объект конфигурации «Внешние источники данных» или через ADO из кода.

В файловом режиме 1С с SQL Server не работает : файловая база хранится в одном файле 1Cv8.1CD. Перевести её на SQL можно только через сервер 1С, выгрузкой в .dt и загрузкой в новую серверную базу . Ниже оба сценария по порядку: подготовка, подключение, настройка, защита и разбор ошибок.

Какая версия и редакция SQL Server подойдёт для 1С

Версию сверяйте со списком поддерживаемых СУБД в системных требованиях вашей версии платформы. Правило простое: чем новее платформа, тем свежее список. Ставить СУБД новее, чем указано в требованиях, рискованно: база может не создаться или вести себя непредсказуемо.

Выбор редакции зависит от размера базы и числа пользователей:

РедакцияКогда подходитОграничения
Express1–5 пользователей, небольшая база, тестовый стендБаза не больше 10 ГБ, ограничен объём памяти под кэш и число ядер, нет SQL Server Agent
StandardРабочая база предприятия, 10–100 пользователейОграничение по памяти и ядрам заметно мягче, Agent есть
EnterpriseКрупные базы, сотни пользователей, высокая нагрузкаОграничений по железу практически нет, высокая цена
DeveloperРазработка и тестыФункции как в Enterprise, но использовать в рабочей среде нельзя

💡 Express часто берут «на попробовать», а через год упираются в 10 ГБ. Бухгалтерия на 20 сотрудников с прикреплёнными файлами вырастает до этого порога за 1–2 года. Если база рабочая, сразу закладывайте Standard.

Помимо лицензии на SQL Server нужна лицензия на сервер 1С:Предприятия и клиентские лицензии. Без серверной лицензии кластер не запустит рабочие процессы для базы.

Подготовка сервера до подключения 1С

До создания базы проверьте сам SQL Server. Большая часть ошибок подключения возникает именно здесь, а не в 1С.

Сортировка (collation)

При установке экземпляра выберите сортировку Cyrillic_General_CI_AS. Это стандартный выбор для русских баз 1С. Платформа при создании базы задаёт свою сортировку, но системные базы master и tempdb живут по сортировке экземпляра. Несовпадение даёт странные ошибки при сравнении строк во временных таблицах.

Сетевой протокол и порт

  1. Откройте SQL Server Configuration Manager.
  2. Перейдите в SQL Server Network Configuration → Protocols for <имя экземпляра>.
  3. Включите TCP/IP.
  4. Перезапустите службу SQL Server.

Перезапуск службы обрывает все подключения к этому экземпляру. Если на нём уже работают базы, делайте это вне рабочего времени.

Экземпляр по умолчанию слушает TCP 1433. У именованного экземпляра порт динамический, а клиент находит его через службу SQL Server Browser (UDP 1434). Для 1С проще закрепить статический порт и открыть его в брандмауэре только для сервера 1С.

Учётная запись для 1С

Создайте отдельный логин SQL, например user1c, а не используйте sa. Чтобы 1С могла сама создать базу, логину нужна серверная роль dbcreator. После создания базы он становится её владельцем, и роль можно снять.

CREATE LOGIN user1c WITH PASSWORD = 'Сложный_Пароль_2x9!', CHECK_POLICY = ON;
ALTER SERVER ROLE dbcreator ADD MEMBER user1c;

Клиентские компоненты на сервере 1С

Если 1С и SQL стоят на разных машинах, на сервер 1С нужны клиентские библиотеки доступа к SQL Server. Какой именно драйвер требуется, указано в требованиях платформы: старые версии работают через SQL Server Native Client, новые — через Microsoft OLE DB Driver for SQL Server. Без драйвера база не создастся.

Создание информационной базы 1С на SQL Server

Базу создают через сервер 1С. Есть два равноценных пути.

Через окно запуска 1С

  1. В списке баз нажмите Добавить, выберите создание новой базы.
  2. На шаге выбора расположения укажите На сервере 1С:Предприятия.
  3. Заполните параметры:
    • Кластер серверов 1С — имя сервера 1С (если порт агента не 1540, то имя:порт);
    • Имя информационной базы в кластере — например, buh;
    • Тип СУБД — MS SQL Server;
    • Сервер баз данных — имя SQL-сервера или имя\экземпляр;
    • Имя базы данных — имя базы в SQL, удобно совпадающее с именем в кластере;
    • Пользователь и пароль сервера БД — логин user1c;
    • флажок Создать базу данных в случае ее отсутствия.
  4. Смещение дат оставьте 0, если не переносите базу, где уже было смещение 2000.
  5. Нажмите Далее, затем Готово.

Через консоль кластера

В консоли администрирования серверов 1С откройте кластер, на узле Информационные базы выберите Создать → Информационная база. Поля те же. Консоль удобна, когда базу создаёт администратор, а пользователю нужно только добавить её в список.

Перенос существующей базы

Файловую базу на SQL переводят так:

  1. Откройте старую базу в Конфигураторе: Администрирование → Выгрузить информационную базу, получите .dt.
  2. Создайте пустую серверную базу по шагам выше.
  3. Откройте новую базу в Конфигураторе: Администрирование → Загрузить информационную базу, выберите .dt.

Загрузка .dt полностью заменяет данные в базе-приёмнике и требует монопольного доступа. Убедитесь, что загружаете в новую пустую базу, а не в рабочую.

Перед созданием базы на SQL Server
Выполнено: 0 / 6

Подключение 1С к внешней базе SQL через ODBC

Вторая задача — когда у компании есть своя SQL-база (сайт, склад, CRM), и 1С должна читать или писать в её таблицы. Для этого в платформе есть объект конфигурации «Внешние источники данных». Он работает через ODBC.

Шаг 1. Источник ODBC

Строку соединения можно задать без DSN:

Driver={ODBC Driver 17 for SQL Server};Server=SQL01;Database=Shop;Trusted_Connection=yes;

Либо создать DSN в «Администраторе источников данных ODBC». Здесь главная ловушка — разрядность. DSN должен совпадать по разрядности с процессом, который к нему обращается:

  • 🖥️ 64-битный сервер 1С → 64-битный C:\Windows\System32\odbcad32.exe;
  • 💻 32-битный клиент в файловом режиме → C:\Windows\SysWOW64\odbcad32.exe.

Создайте системный DSN, а не пользовательский. Пользовательский виден только той учётной записи, под которой его создали, и служба сервера 1С его не увидит.

Шаг 2. Внешний источник в конфигурации

  1. В Конфигураторе в дереве найдите ветку Внешние источники данных, добавьте новый.
  2. На вкладке таблиц выберите загрузку таблиц из источника: Конфигуратор подключится по строке соединения и покажет список таблиц.
  3. Отметьте нужные таблицы. Для каждой проверьте ключевые поля: без ключа таблица будет доступна только для чтения запросом.
  4. Обновите конфигурацию базы данных.

На типовых конфигурациях делайте это в расширении, чтобы не снимать конфигурацию с поддержки.

Шаг 3. Параметры соединения в рабочей базе

Строку соединения для рабочей базы задают в режиме 1С:Предприятие: в Все функции → Стандартные → Управление внешними источниками данных. Либо программно:

Параметры = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
Параметры.СтрокаСоединения = "Driver={ODBC Driver 17 for SQL Server};Server=SQL01;Database=Shop;";
Параметры.АутентификацияСтандартная = Ложь;
Параметры.ИмяПользователя = "reader1c";
Параметры.Пароль = ПарольИзХранилища;
ВнешниеИсточникиДанных.Магазин.УстановитьОбщиеПараметрыСоединения(Параметры);
ВнешниеИсточникиДанных.Магазин.УстановитьСоединение();

После этого таблицы источника доступны в языке запросов как ВнешнийИсточникДанных.Магазин.Таблица.Заказы. Их можно соединять с объектами 1С в одном запросе, но это соединение выполняется на стороне сервера 1С, а не в SQL. На больших таблицах сначала отбирайте данные условием, потом соединяйте.

Другие способы связать 1С и SQL Server

ODBC — не единственный путь. Выбор зависит от того, кто инициатор обмена и сколько данных идёт.

СпособКогда подходитРиски и ограничения
Внешние источники данных (ODBC)1С регулярно читает таблицы чужой БДНужна доработка конфигурации или расширение
ADO из кода (ADODB.Connection)Разовая загрузка, обработка без изменения конфигурацииТолько Windows, COM; SQL-текст внутри кода
OData-интерфейс 1СВнешняя система сама забирает данные из 1С по HTTPНужна публикация базы на веб-сервере
HTTP-сервисыСвой API под конкретный обменПишется программистом 1С
Промежуточная (буферная) таблицаДве системы с разным расписаниемНужен контроль «обработано / не обработано»

ADO: чтение таблицы без доработки конфигурации

Подходит для внешней обработки. Код выполняется на сервере, поэтому драйвер нужен на сервере 1С.

Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=MSOLEDBSQL;Server=SQL01;Database=Shop;Trusted_Connection=yes;";
Соединение.Open();
Набор = Соединение.Execute("SELECT Code, Name, Price FROM dbo.Goods");
Пока Не Набор.EOF Цикл
	Код = Набор.Fields("Code").Value;
	Наименование = Набор.Fields("Name").Value;
	Цена = Набор.Fields("Price").Value;
	// здесь найдите номенклатуру по коду и запишите цену
	Набор.MoveNext();
КонецЦикла;
Набор.Close();
Соединение.Close();

💡 При Trusted_Connection=yes серверный код подключается к SQL под учётной записью службы сервера 1С (по умолчанию USR1CV8), а не под вашим логином Windows. Права в SQL выдавайте именно ей. Из-за этого обработка, которая работала у программиста в файловой базе, на сервере падает с ошибкой входа.

Автоматизация обмена

Ручной запуск обработки быстро надоедает. Обмен ставят на расписание:

  • ⏱️ регламентное задание в конфигурации или расширении: процедура общего модуля запускается сервером 1С по расписанию, например каждые 15 минут;
  • 🗂️ буферная таблица в SQL: внешняя система пишет строки с флагом «новая», 1С забирает их и ставит флаг «загружено». Так ни одна строка не потеряется при сбое посреди обмена;
  • 📝 журнал регистрации: пишите в него итог каждого запуска (сколько строк, сколько ошибок), чтобы разбирать сбои без отладчика.

Не пишите напрямую в таблицы самой базы 1С (_Document123, _Reference45) средствами SQL. Лицензионные условия 1С запрещают работу с данными в обход платформы, а такая запись ломает итоги регистров и ссылочную целостность. Данные в 1С загружают только через объекты 1С.

Настройка SQL Server под нагрузку 1С

Стандартные параметры SQL рассчитаны на универсальную нагрузку. Для 1С стоит поменять несколько из них.

Память

Параметр max server memory по умолчанию не ограничен: SQL забирает всю память, и сервер 1С на той же машине начинает свопиться. Оставьте операционной системе и 1С запас. Пример для сервера с 64 ГБ, где стоят и SQL, и 1С: SQL — 40 ГБ, остальные 24 ГБ — системе и рабочим процессам 1С.

EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 40960; RECONFIGURE;

Параллелизм

Для баз 1С обычно ставят max degree of parallelism = 1. Запросы 1С короткие и многочисленные, а параллельные планы на них чаще мешают, чем ускоряют.

EXEC sp_configure 'max degree of parallelism', 1; RECONFIGURE;

tempdb и диски

1С активно использует временные таблицы, поэтому tempdb нагружена сильнее обычного. Вынесите её на быстрый SSD и разбейте на несколько файлов одинакового размера, например 4 файла при 8 ядрах. Журнал транзакций рабочей базы держите на отдельном диске от файла данных.

Модель восстановления

МодельКогда выбиратьЧто делать обязательно
SimpleДостаточно ежедневного полного бэкапаТолько полные и разностные копии
FullНужно восстановление на любой момент дняРезервное копирование журнала, например каждый час

Модель Full без бэкапа журнала — частая причина того, что файл .ldf вырастает до сотен гигабайт и заполняет диск.

Регламентное обслуживание

Через SQL Server Agent (в Standard и выше) настройте план обслуживания:

  1. Ежедневно — обновление статистики.
  2. Раз в неделю — реорганизация или перестроение индексов.
  3. После обновления статистики — очистка процедурного кэша DBCC FREEPROCCACHE, чтобы SQL построил планы по свежей статистике.
  4. Резервные копии по выбранной модели восстановления.

Перестроение индексов и обновление статистики ставьте ночью: они нагружают диск, и пользователи заметят торможение.

Защита связки SQL Server и 1С

Сервер с базой 1С хранит бухгалтерию, зарплату и персональные данные. Минимальный набор мер:

  • 🔐 Не используйте sa для 1С. У базы отдельный владелец, у внешних интеграций — свой логин с ролью db_datareader только на нужной базе.
  • 🧱 Закройте порт SQL. Подключаться к 1433 должен только сервер 1С и машины администраторов. Пользователи работают через 1С и к SQL напрямую не ходят.
  • 🔑 Не храните пароли в коде. Пароль внешнего источника держите в безопасном хранилище конфигурации (в типовых на БСП есть механизм безопасного хранения данных) или в параметрах соединения, а не в тексте обработки.
  • 🔒 Шифрование. Драйвер ODBC 18 по умолчанию требует шифрованное соединение. Если на SQL самоподписанный сертификат, подключение падает с ошибкой цепочки сертификатов. Правильное решение — выпустить SQL-серверу доверенный сертификат. Параметр TrustServerCertificate=yes допустим во внутренней сети как временная мера.
  • 💾 Резервные копии храните отдельно от сервера SQL: на другом диске и в другом месте.

Ошибки подключения 1С к SQL Server

Текст ошибки 1С обычно содержит исходное сообщение драйвера. По нему и ищите причину.

Диагностика: выберите симптом

Если ошибка возникает только у части пользователей, а у других база открывается, дело не в SQL. Клиент 1С с SQL напрямую не соединяется: к СУБД обращается только сервер 1С. Ищите причину на стороне клиента и сети до сервера 1С.

Частые вопросы по связке SQL Server и 1С

Можно ли поставить 1С и SQL Server на один компьютер?
Да, для 10–30 пользователей это обычная схема. Ограничьте память SQL, чтобы рабочим процессам 1С хватало ресурсов.
Нужен ли SQL Server на каждом рабочем месте?
Нет. На рабочих местах стоит только клиент 1С. К SQL обращается сервер 1С.
Можно ли открыть базу 1С в SSMS и посмотреть данные?
Технически таблицы видны, но имена у них служебные, а работа с данными в обход платформы запрещена лицензией. Для отчётов используйте запросы 1С, OData или выгрузку.
Почему база на SQL работает медленнее, чем файловая?
На одном-двух пользователях это нормально: добавляется сетевой обмен с сервером 1С и СУБД. Выигрыш серверного варианта виден при одновременной работе многих людей и на больших объёмах.
Как сделать резервную копию базы 1С на SQL?
Штатными средствами SQL: полный бэкап базы и при модели Full — бэкапы журнала. Выгрузка в .dt подходит для переноса, но для ежедневного копирования она медленнее и требует монопольного доступа.