Подключение 1С к SQL-серверу: от выбора СУБД до первых запросов
Содержание
Чтобы подключить 1С к SQL, нужны три вещи: СУБД (MS SQL Server или PostgreSQL), сервер 1С:Предприятия и информационная база, созданная «На сервере 1С:Предприятия». Клиент 1С никогда не ходит в SQL напрямую: он подключается к кластеру серверов 1С, а уже тот работает с базой данных. Поэтому в окне добавления базы вы указываете и кластер 1С, и сервер СУБД, и логин к ней.
Второй сценарий — когда базе 1С нужно читать данные из чужой SQL-базы: складской программы, сайта, CRM. Для этого в конфигурации есть объект «Внешние источники данных» и запасной вариант через ADO. Оба пути разобраны ниже, с командами и типичными ошибками.
Какую СУБД выбрать для клиент-серверной 1С
Платформа 1С 8.3 официально работает с четырьмя СУБД: Microsoft SQL Server, PostgreSQL, IBM Db2 и Oracle Database. На практике в малом и среднем бизнесе выбирают из первых двух.
| СУБД | Когда подходит | На что смотреть |
|---|---|---|
| Microsoft SQL Server | Инфраструктура на Windows, есть админ с опытом MS SQL | Лицензии на сервер и клиентов; редакция Express ограничена по размеру базы и памяти |
| PostgreSQL | Linux или Windows, нужно сэкономить на лицензиях СУБД | Нужна сборка с патчами для 1С (от фирмы 1С или Postgres Pro), обычная из репозитория не подойдёт |
| IBM Db2, Oracle | Крупные компании, где эти СУБД уже стандарт | Редкие специалисты, мало практики именно с 1С |
Если базы небольшие и пользователей 5–15, честно оцените, нужен ли SQL вообще. Файловый вариант проще в обслуживании. Переход на SQL оправдан, когда пользователей становится больше, база растёт за десятки гигабайт или появляются регулярные блокировки.
Что учесть до выбора:
- 🖥️ Сервер 1С и СУБД можно поставить на одну машину. Для 20–50 пользователей это нормальная схема.
- 🔑 Лицензия на сервер 1С приобретается отдельно от клиентских лицензий, заложите её в бюджет перехода.
- 🧩 Версия СУБД должна поддерживаться вашей версией платформы. Список совместимых версий публикуется в требованиях к платформе — сверьтесь с ним до установки.
Установка СУБД и клиентских компонентов
Сначала ставится СУБД, затем сервер 1С:Предприятия. Порядок важен: сервер 1С при создании базы сразу пытается к ней подключиться.
MS SQL Server
- Установите SQL Server с компонентом Database Engine.
- На шаге настройки сортировки выберите
Cyrillic_General_CI_AS. С другой сортировкой 1С создаст базу, но возможны проблемы с упорядочиванием и поиском. - Включите смешанную проверку подлинности (SQL Server + Windows), задайте пароль
sa. - Откройте
SQL Server Configuration Manager → Сетевая конфигурация SQL Server → Протоколыи включитеTCP/IP. Перезапустите службу SQL Server. - Если сервер 1С стоит на другой машине, откройте на брандмауэре порт
1433.
Для доступа к MS SQL сервер 1С использует клиентскую библиотеку Microsoft: в старых установках это SQL Server Native Client, в новых платформах — Microsoft OLE DB Driver for SQL Server. Если сервер 1С и SQL на разных машинах, драйвер нужен именно на машине сервера 1С.
PostgreSQL
- Установите сборку PostgreSQL для 1С подходящей версии.
- В
postgresql.confпроверьтеlisten_addresses: для доступа по сети нужно'*'или конкретный адрес. - В
pg_hba.confдобавьте строку для адреса сервера 1С, например:
host all all 192.168.1.20/32 scram-sha-256
- Перезапустите службу PostgreSQL и откройте порт
5432.
Отдельный ODBC-драйвер для работы самой 1С с PostgreSQL ставить не нужно: сервер 1С подключается к нему своими средствами.
Сервер 1С:Предприятия
Ставится из дистрибутива технологической платформы, компонент «Сервер 1С:Предприятия». Служба по умолчанию слушает порты 1540 (агент), 1541 (менеджер кластера) и диапазон 1560–1591 (рабочие процессы). Их тоже нужно открыть на брандмауэре, если клиенты ходят по сети.
Подключение информационной базы к SQL в окне запуска 1С
Базу на SQL создают прямо из окна запуска 1С — заходить в Management Studio или pgAdmin не обязательно.
- Запустите 1С, нажмите
Добавить→Создание новой информационной базы. - Выберите пустую базу или базу из шаблона, нажмите
Далее. - Задайте имя для списка и вариант расположения
На сервере 1С:Предприятия. - Заполните параметры подключения:
| Поле | Что вписать |
|---|---|
| Кластер серверов 1С:Предприятия | Имя или IP машины с сервером 1С, например srv1c |
| Имя информационной базы в кластере | Латиницей без пробелов: buh_main |
| Тип СУБД | MS SQL Server или PostgreSQL |
| Сервер баз данных | Имя сервера СУБД; для именованного экземпляра MS SQL — srvsql\SQL2019 |
| Имя базы данных | Имя базы в самой СУБД, удобно совпадает с именем в кластере |
| Пользователь и пароль базы данных | Логин СУБД, от которого сервер 1С будет работать с базой |
| Смещение дат | Для MS SQL — 2000 |
| Создать базу данных в случае ее отсутствия | Отметить, если базы в СУБД ещё нет |
- Нажмите
Далее, выберите вариант аутентификации и язык,Готово.
Флажок блокировки регламентных заданий включайте для копий и тестовых баз. Иначе копия начнёт, например, загружать курсы валют или отправлять обмены параллельно с рабочей базой.
Смещение дат 2000 для MS SQL выбирают, потому что тип даты в SQL Server не хранит годы раньше 1753, а в 1С пустая дата — 01.01.0001. Смещение выставляется один раз при создании, менять его у живой базы нельзя.
Перенос существующей файловой базы на SQL
- Откройте файловую базу
в Конфигураторе:
Администрирование → Выгрузить информационную базу. Сохраните файл.dt. - Создайте пустую серверную базу по шагам выше.
- Откройте её в Конфигураторе:
Администрирование → Загрузить информационную базу, укажите.dt. - Проверьте, что пользователи видят базу, и обновите им список баз.
Выгрузку делайте, когда в файловой базе никто не работает
, и сохраните копию каталога базы до начала переноса. Загрузка .dt полностью заменяет данные в целевой базе.
Запросы к SQL из 1С: язык запросов и внешние источники
Здесь чаще всего путаница. Язык запросов 1С похож на SQL, но это не SQL. Платформа сама переводит его в запрос к нужной СУБД. Поэтому одна и та же конфигурация работает и на MS SQL, и на PostgreSQL без переделок.
Пример запроса на языке 1С:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И Номенклатура.Артикул ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "АБ%");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Товар);
КонецЦикла;
В самой SQL-базе таблицы называются не «Номенклатура», а вида _Reference25, поля — _Fld1234. Соответствие покажет функция ПолучитьСтруктуруХраненияБазыДанных(). Писать в эти таблицы напрямую нельзя: фирма 1С такой доступ не поддерживает, а платформа при реструктуризации пересоздаёт таблицы.
Чтение чужой SQL-базы через «Внешние источники данных»
Если нужно получить данные из сторонней SQL-базы, в Конфигураторе добавьте объект Внешние источники данных:
- В дереве метаданных:
Общие → Внешние источники данных → Добавить. - Нажмите
Загрузить, задайте строку соединения ODBC и выберите таблицы. - Платформа создаст описание таблиц, к которым можно обращаться в запросах как
ВнешнийИсточникДанных.Склад.Таблица.Остатки.
На стороне машины, где выполняется подключение (сервер 1С в клиент-серверном варианте), должен стоять ODBC-драйвер нужной СУБД.
Пример строки соединения для MS SQL через ODBC:
Driver={ODBC Driver 17 for SQL Server};Server=srvsql;Database=Warehouse;Uid=reader;Pwd=***;
Быстрый вариант через ADO (только Windows)
Для разовой выгрузки удобнее ADO через COM, без изменения конфигурации:
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open("Provider=MSOLEDBSQL;Server=srvsql;Database=Warehouse;Uid=reader;Pwd=***;");
Набор = Соединение.Execute("SELECT Code, Qty FROM dbo.Stock WHERE Qty > 0");
Пока Не Набор.EOF Цикл
Сообщить("" + Набор.Fields("Code").Value + ": " + Набор.Fields("Qty").Value);
Набор.MoveNext();
КонецЦикла;
Соединение.Close();
Код выполняется там, где запущен: на клиенте или на сервере 1С. Драйвер (провайдер) должен стоять именно на этой машине. На Linux-сервере 1С COM недоступен — используйте внешние источники данных.
Как ускорить работу 1С на SQL-сервере
Медленная база на SQL почти всегда упирается не в «железо», а в обслуживание СУБД и в код запросов.
На стороне СУБД:
- 🔧 MS SQL: план обслуживания с перестроением индексов и обновлением статистики, раз в сутки ночью. Ограничьте
max server memory, чтобы SQL не отнял память у сервера 1С на той же машине. - 🔧 PostgreSQL: регулярный
VACUUM ANALYZE, разумныеshared_buffersиwork_memпод объём памяти. - 💾 Модель восстановления
Simpleдля MS SQL, если вы не делаете резервные копии журнала транзакций. Иначе журнал разрастается до размера диска.
На стороне конфигурации:
- 🚫 Не выполняйте запрос внутри цикла. Один запрос на 1000 строк быстрее 1000 запросов по одной.
- 📌 Условия по виртуальным таблицам (
Остатки,Обороты) пишите в параметрах таблицы, а не вГДЕ. - 🗂️ Используйте временные таблицы и пакетные запросы для сложных выборок.
- 🔎 У реквизитов, по которым часто ищут и отбирают, включите свойство «Индексировать».
Проблемные запросы находят через технологический журнал и замер производительности в отладчике. Без замера оптимизация превращается в угадывание.
Перестроение индексов на большой базе нагружает диск и может блокировать таблицы. Запускайте его в нерабочее время, когда пользователи не проводят документы.
Хранимые процедуры и триггеры: где можно, а где нельзя
С таблицами самой базы 1С хранимые процедуры и триггеры не используют. Платформа ничего о них не знает: триггер может сломать проведение, а при обновлении конфигурации таблица будет пересоздана вместе с ним или без него. Это неподдерживаемое вмешательство, и при проблемах вам не помогут ни 1С, ни франчайзи.
Со сторонней SQL-базой работать через процедуры можно и нужно:
- 📥 Во внешнем источнике данных есть ветка «Функции» — она описывает хранимые процедуры и функции внешней базы, их вызывают из кода 1С.
- 🧾 Через ADO процедуру вызывают командой
EXECили объектомADODB.Commandс параметрами. - 🔄 Триггеры на стороне внешней базы удобны, чтобы складывать изменения в отдельную таблицу-очередь, а 1С забирает её по регламентному заданию.
Такая схема даёт инкрементальный обмен без полного перечитывания таблиц.
Безопасность связки 1С и SQL
Пароль пользователя СУБД хранится в настройках кластера 1С. Кто получил права администратора кластера, тот фактически получил доступ к базе.
- 👤 Не используйте
saилиpostgresдля рабочих баз. Создайте отдельный логин: для MS SQL с рольюdbcreatorна этапе создания базы, затемdb_ownerтолько на свою базу. - 🔐 Задайте администратора кластера серверов 1С. Без него любой с консолью кластера видит и меняет параметры баз.
- 🌐 Порты
1433,5432и1540–1591открывайте только для нужных адресов, не наружу в интернет. - 📖 Для внешних источников данных заведите логин только на чтение, если запись не нужна.
- 💾 Резервные копии делайте средствами СУБД по расписанию и периодически проверяйте восстановление на тестовом сервере. Выгрузка
.dt— дополнение, а не замена.
Ошибки подключения 1С к SQL и как их снять
Текст ошибки обычно прямо указывает, на каком звене цепочки «клиент → сервер 1С → СУБД» проблема.
Если служба сервера 1С перезапускается для применения настроек, у всех пользователей оборвутся сеансы. Делайте это вечером, предупредив людей.
Частые вопросы
Сколько времени занимает перенос базы на SQL?
.dt и подготовку серверов, а не на сами настройки.Подойдёт ли бесплатная редакция MS SQL Express?
Можно ли поставить сервер 1С и SQL на одну машину?
Как вернуть базу из SQL обратно в файловый вариант?
.dt из серверной базы, создайте пустую файловую и загрузите в неё файл через Конфигуратор.