Работа с SQL в 1С — одна из ключевых компетенций для разработчиков, администрирующих или дорабатывающих базы на платформе 1С:Предприятие. Несмотря на то, что платформа предлагает собственный язык запросов (1С:Запросы), знание языка структурированных запросов остаётся критически важным. Почему? Потому что любае операции с данными — от простых выборок до сложных отчётов — в конечном счёте транслируются в SQL-запросы к серверу баз данных.

Но здесь кроется подвох: не работает с "чистым" SQL. Вместо этого она взаимодействует с диалектами SQL, специфичными для используемой СУБД — будь то Microsoft SQL Server, PostgreSQL или IBM DB2. Более того, платформа накладывает свои ограничения и особенности на формирование запросов. В этой статье разберём, какой именно SQL нужен для эффективной работы с 1С, как его учить и где применять на практике.

Если вы только начинаете осваивать разработку в 1С, эта информация поможет избежать типичных ошибок при работе с базами данных. Опытным программистам статья даст систематизированное понимание нюансов взаимодействия 1С с разными СУБД.

Какой диалект SQL используется в 1С?

Платформа 1С:Предприятие не имеет собственной СУБД — она работает поверх сторонних систем управления базами данных. Это означает, что диалект SQL зависит от выбранной СУБД. На практике чаще всего встречаются три варианта:

  • 🔹 T-SQL (Transact-SQL) — для Microsoft SQL Server (самый распространённый случай в России).
  • 🔹 PL/pgSQL — для PostgreSQL (набирает популярность из-за открытости и бесплатности).
  • 🔹 SQL PL — для IBM DB2 (реже, но используется в крупных корпоративных решениях).

Важно понимать, что не даёт прямого доступа к SQL-коду. Вместо этого она генерирует запросы автоматически на основе встроенного языка запросов 1С (например, при использовании конструктора запросов или метода ВыполнитьЗапрос()). Однако знание SQL позволяет:

  • 🔍 Анализировать планы выполнения запросов для оптимизации производительности.
  • 🛠️ Писать сложные отчёты, которые невозможно реализовать штатными средствами 1С.
  • 🔧 Диагностировать проблемы с базами данных (например, блокировки или медленные выборки).
  • 📊 Интегрировать с внешними системами через прямые SQL-запросы.
⚠️ Внимание: Платформа 1С может модифицировать SQL-запросы перед отправкой на сервер (например, добавлять неявные joins или условия). Это означает, что ручной SQL-код, работающий в SQL Server Management Studio, может не сработать при выполнении через 1С.

Для большинства задач в 1С хватит знания основ T-SQL (если используется MS SQL Server), но есть нюансы. Например, платформа не поддерживает:

  • 🚫 Хранимые процедуры (их нельзя вызывать напрямую из 1С).
  • 🚫 Транзакции с ручным управлением (1С управляет транзакциями автоматически).
  • 🚫 Некоторые функции T-SQL (например, STRING_AGG или JSON_MODIFY могут не работать).
📊 Какую СУБД вы используете с 1С?
Microsoft SQL Server
PostgreSQL
IBM DB2
Другую
Не знаю

Минимальный набор SQL для начинающего 1С-разработчика

Если вы только осваиваете работу с базами данных в 1С, начинать стоит с базовых запросов, которые чаще всего встречаются в типовых конфигурациях. Вот минимальный набор, который пригодится с первых дней:

Тип запроса Пример на T-SQL Аналог в 1С:Запросах
Выборка данных SELECT Наименование, Цена FROM Товары WHERE Склад = 1 ВЫБРАТЬ Наименование, Цена ИЗ Справочник.Товары ГДЕ Склад = &Склад
Группировка SELECT Категория, COUNT(*) FROM Товары GROUP BY Категория ВЫБРАТЬ Категория, КОЛИЧЕСТВО(*) ИЗ Справочник.Товары СГРУППИРОВАТЬ ПО Категория
Объединение таблиц (JOIN) SELECT t.Наименование, d.Количество FROM Товары t INNER JOIN Документ.ПоступлениеТоваров d ON t.ID = d.Товар ВЫБРАТЬ t.Наименование, d.Количество ИЗ Справочник.Товары КАК t ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК d ПО t.Ссылка = d.Товар
Агрегатные функции SELECT AVG(Цена) FROM Товары WHERE Категория = 'Электроника' ВЫБРАТЬ СРЕДНЕЕ(Цена) ИЗ Справочник.Товары ГДЕ Категория = &Категория

Обратите внимание: синтаксис 1С:Запросов внешне похож на SQL, но имеет ключевые различия:

  • 🔹 Вместо SELECT используется ВЫБРАТЬ.
  • 🔹 Вместо FROMИЗ.
  • 🔹 Вместо WHEREГДЕ.
  • 🔹 Вместо JOINСОЕДИНЕНИЕ (с уточнением типа: ВНУТРЕННЕЕ, ЛЕВОЕ и т.д.).

Тем не менее, логика построения запросов остаётся той же. Если вы понимаете, как работает JOIN в SQL, вам будет легко разобраться с СОЕДИНЕНИЕМ в 1С.

Изучить базовый синтаксис SELECT, FROM, WHERE, GROUP BY|Понять разницу между INNER JOIN и LEFT JOIN|Попробовать написать простой запрос в конструкторе 1С|Сравнить план выполнения запроса в 1С и в SQL Server Management Studio-->

Где в 1С используется SQL: ключевые сценарии

Многие разработчики ошибочно полагают, что SQL в 1С нужен только для "низкоуровневых" операций. На самом деле он применяется гораздо шире. Вот основные сценарии, где без знания SQL не обойтись:

1. Оптимизация медленных запросов

Если отчёт или обработка в 1С работает слишком долго, причина часто кроется в неэффективном SQL-коде, который генерирует платформа. Например, запрос с множеством вложенных подзапросов может выполняться минутами. В таких случаях помогает:

  • 🔍 Просмотр плана выполнения запроса в SQL Server Management Studio.
  • 🛠️ Замена подзапросов на JOIN или CTE (Common Table Expressions).
  • 📊 Добавление индексов на часто используемые поля.

2. Прямая работа с базой данных

Иногда требуется выполнить операции, которые невозможно реализовать штатными средствами 1С. Например:

  • 🔄 Массовое обновление данных (например, исправление ошибок в справочниках).
  • 🗑️ Удаление "мусорных" записей (например, некорректно созданных документов).
  • 🔍 Поиск дублей по сложным критериям.

Для этого в 1С есть метод ВыполнитьSQLЗапрос(), но использовать его нужно осторожно:

⚠️ Внимание: Прямые SQL-запросы обходят механизмы контроля ссылочной целостности 1С. Неправильное использование может привести к повреждению базы данных!

3. Интеграция с внешними системами

При обмене данными между 1С и другими программами (например, CRM, ERP или веб-сервисами) часто требуется:

  • 📤 Экспорт данных в формате, понятном внешней системе.
  • 📥 Импорт данных с предварительной обработкой.
  • 🔄 Синхронизация справочников (например, номенклатуры или контрагентов).

В таких случаях SQL помогает:

  • 🔹 Быстро выбрать нужные данные из 1С.
  • 🔹 Преобразовать их в требуемый формат (например, JSON или XML).
  • 🔹 Загрузить ответ от внешней системы обратно в 1С.

4. Администрирование баз данных

Для администрирования кластеров 1С (особенно в клиент-серверном варианте) требуется:

  • 🔧 Мониторинг производительности (например, поиск долгих транзакций).
  • 🗃️ Резервное копирование и восстановление баз.
  • 🔒 Управление правами доступа на уровне SQL-сервера.

Здесь без SQL не обойтись — например, для анализа журналов транзакций или настройки репликации.

Что будет, если выполнить DELETE без WHERE в базе 1С?

Если случайно выполнить запрос DELETE FROM [dbo].[_Document123] без условия WHERE, это приведёт к полному удалению всех записей в таблице документов. Восстановить данные можно будет только из резервной копии! 1С не контролирует такие операции, поэтому они необратимы.

Как учить SQL для 1С: пошаговый план

Если вы решили освоить SQL специально для работы с 1С, вот оптимальный план обучения, который поможет избежать лишней теории и сфокусироваться на практических навыках:

Шаг 1: Изучите базовый синтаксис T-SQL

Начните с основ:

  • 📌 SELECT, FROM, WHERE — выборка данных.
  • 📌 GROUP BY, HAVING — группировка.
  • 📌 JOIN (внутреннее, левое, правое) — соединение таблиц.
  • 📌 UNION, INTERSECT, EXCEPT — операции с наборами данных.

Рекомендуемые ресурсы:

  • 📖 Официальная документация Microsoft по T-SQL.
  • 🎥 Курс "SQL для начинающих" на Stepik или Udemy.
  • 📚 Книга "Изучаем SQL" Алена Беньямина (O’Reilly).

Шаг 2: Установите SQL Server Management Studio (SSMS)

Это бесплатный инструмент от Microsoft, который позволяет:

  • 🔍 Выполнять SQL-запросы к базе 1С.
  • 📊 Анализировать планы выполнения.
  • 🗃️ Управлять объектами базы данных (таблицами, индексами и т.д.).

Скачать SSMS можно с официального сайта Microsoft.

Шаг 3: Практикуйтесь на реальной базе 1С

Теория без практики бесполезна. Возьмите тестовую базу 1С (например, Демо-версию "Управление торговлей") и попробуйте:

  1. 🔍 Найти таблицу с товарами и выбрать из неё данные.
  2. 📊 Составить запрос с группировкой по категориям.
  3. 🔄 Написать запрос с соединением таблиц документов и справочников.

Для этого:

  1. Подключитесь к базе 1С через SSMS.
  2. Найдите таблицы (они обычно имеют префикс _, например _Document123).
  3. Составьте запрос и сравните его с тем, что генерирует 1С.
⚠️ Внимание: Никогда не выполняйте модифицирующие запросы (INSERT, UPDATE, DELETE) на рабочей базе 1С! Используйте только тестовые копии.

Шаг 4: Изучите особенности взаимодействия 1С и SQL

Платформа 1С накладывает ограничения на SQL. Важно понимать:

  • 🔹 Как 1С преобразует запросы на встроенном языке в SQL.
  • 🔹 Какие функции T-SQL не поддерживаются (например, WITH TIES или OFFSET-FETCH).
  • 🔹 Как работать с временными таблицами и CTE.

Полезные материалы:

  • 📖 Документация 1С по языку запросов.
  • 🎥 Вебинары от 1С-Учебного центра по оптимизации запросов.

Шаг 5: Освойте инструменты анализа производительности

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

  • 🔍 План выполнения запроса в SSMS (кнопка Include Actual Execution Plan).
  • 📊 Профайлер SQL Server для мониторинга долгих операций.
  • 🛠️ Консоль запросов 1С (в режиме отладки).
💡

Чтобы увидеть SQL-код, который генерирует 1С, включите режим отладки и поставьте точку останова на выполнении запроса. В окне отладчика будет показан реальный SQL-запрос.

Типичные ошибки при работе с SQL в 1С

Даже опытные разработчики иногда допускают ошибки при работе с SQL в 1С. Вот самые распространённые из них и как их избежать:

1. Игнорирование планов выполнения

Многие разработчики пишут запросы "вслепую", не проверяя, как они выполняются на уровне SQL. Это приводит к:

  • 🐢 Медленной работе отчётов.
  • 🔄 Блокировкам таблиц.
  • 💥 Падениям сервера при большой нагрузке.

Решение: Всегда проверяйте план выполнения в SSMS! Обращайте внимание на:

  • 🔍 Table Scan (полное сканирование таблицы) — признак отсутствия индексов.
  • 🔍 Key Lookup — означает, что индекс не покрывает все нужные поля.
  • 🔍 Сложные вложенные циклы — могут указывать на неоптимальные соединения.

2. Чрезмерное использование подзапросов

Подзапросы (особенно вложенные) удобны, но часто ведут к экспоненциальному росту времени выполнения. Например:

SELECT Наименование

FROM Товары

WHERE Категория IN (

SELECT Категория

FROM КатегорииТоваров

WHERE Регион = 'Москва'

)

Лучше заменить на JOIN:

SELECT t.Наименование

FROM Товары t

INNER JOIN КатегорииТоваров k ON t.Категория = k.Ссылка

WHERE k.Регион = 'Москва'

3. Неправильная работа с транзакциями

1С управляет транзакциями автоматически, но иногда разработчики пытаются вручную открывать/закрывать транзакции в SQL-коде. Это приводит к:

  • 🔒 Блокировкам таблиц.
  • 💥 Потере данных при ошибках.
  • 🐢 Замедлению работы из-за длинных транзакций.
⚠️ Внимание: Если вам нужно выполнить несколько SQL-запросов как единую транзакцию, используйте методы 1С (НачатьТранзакцию(), ЗафиксироватьТранзакцию()), а не ручной BEGIN TRANSACTION в SQL.

4. Прямые модификации данных без контроля

Выполнение UPDATE или DELETE напрямую в базе 1С чревато:

  • 🗑️ Нарушением ссылочной целостности (1С не узнает об изменениях).
  • 🔄 Рассинхронизацией данных (например, остатки не будут пересчитаны).
  • 💥 Падением базы при удалении критичных записей.

Решение: Всегда используйте объекты 1С (например, ДокументОбъект.Записать()) вместо прямого SQL.

5. Игнорирование особенностей СУБД

Код, написанный для MS SQL Server, может не работать в PostgreSQL, и наоборот. Например:

  • 🔹 В PostgreSQL нет TOP — вместо него используется LIMIT.
  • 🔹 В SQL Server строки сравниваются без учёта регистра, а в PostgreSQL — с учётом.
  • 🔹 В DB2 другой синтаксис для работы с датами.

Решение: Всегда тестируйте SQL-код на целевой СУБД!

💡

Перед оптимизацией запроса обязательно проверьте его план выполнения. Часто проблема кроется не в самом запросе, а в отсутствии индексов или неправильной структуре таблиц.

Практические примеры SQL-запросов для 1С

Разберём несколько реальных примеров, которые пригодятся в повседневной работе с 1С.

Пример 1: Поиск дублей в справочнике контрагентов

Задача: найти контрагентов с одинаковыми ИНН.

SELECT

ИНН,

COUNT(*) AS Количество

FROM

_Reference163 AS Контрагенты -- _Reference163 может отличаться в вашей базе!

WHERE

ИНН IS NOT NULL

GROUP BY

ИНН

HAVING

COUNT(*) > 1

ORDER BY

Количество DESC

Этот запрос вернёт список ИНН, которые встречаются более одного раза. Чтобы увидеть самих контрагентов, добавьте JOIN:

WITH ДублиИНН AS (

SELECT ИНН

FROM _Reference163

WHERE ИНН IS NOT NULL

GROUP BY ИНН

HAVING COUNT(*) > 1

)

SELECT

k.Ссылка,

k.Наименование,

k.ИНН

FROM

_Reference163 AS k

INNER JOIN

ДублиИНН AS d ON k.ИНН = d.ИНН

ORDER BY

k.ИНН, k.Наименование

Пример 2: Анализ продаж по категориям товаров

Задача: получить сумму продаж по категориям за последний месяц.

SELECT

k.Наименование AS Категория,

SUM(d.Количество * d.Цена) AS СуммаПродаж,

COUNT(DISTINCT d.Документ) AS КоличествоДокументов

FROM

_Document123 AS d -- Документ "РеализацияТоваровУслуг"

INNER JOIN

_Reference124 AS t ON d.Товар = t.Ссылка -- Справочник "Номенклатура"

INNER JOIN

_Reference125 AS k ON t.Категория = k.Ссылка -- Справочник "КатегорииНоменклатуры"

WHERE

d.Дата >= DATEADD(month, -1, GETDATE())

GROUP BY

k.Наименование

ORDER BY

СуммаПродаж DESC

Обратите внимание: имена таблиц (_Document123, _Reference124) могут отличаться в вашей базе! Чтобы узнать точные имена:

  1. Откройте базу в Конфигураторе.
  2. Найдите нужный документ или справочник.
  3. Посмотрите его идентификатор в свойствах (например, Document.РеализацияТоваровУслуг).
  4. В базе он будет называться _Document{ID} или _Reference{ID}.

Пример 3: Поиск "зависших" документов

Задача: найти документы, которые были созданы, но не проведены.

SELECT

d.Ссылка,

d.Номер,

d.Дата,

d.ПометкаУдаления

FROM

_Document123 AS d -- Замените на ваш документ

WHERE

d.Проведен = 0

AND d.ПометкаУдаления = 0

AND d.Дата >= DATEADD(day, -7, GETDATE()) -- Документы за последнюю неделю

ORDER BY

d.Дата DESC

Этот запрос поможет найти документы, которые требуют ручной обработки.

Пример 4: Оптимизация медленного отчёта

Предположим, у вас есть отчёт, который выполняется 5 минут. Чтобы найти проблему:

  1. Включите профилировщик SQL Server.
  2. Запустите отчёт в 1С.
  3. Найдите самый долгий запрос в профилировщике.
  4. Посмотрите его план выполнения.

Типичные проблемы:

  • 🔍 Отсутствие индексов на полях, используемых в WHERE или JOIN.
  • 🔍 Слишком широкие выборки (например, SELECT * вместо конкретных полей).
  • 🔍 Неоптимальные подзапросы (замените на JOIN или CTE).

Пример оптимизации:

-- Медленный запрос (использует подзапрос)

SELECT Наименование

FROM Товары

WHERE Категория IN (

SELECT Ссылка

FROM Категории

WHERE Регион = 'Москва'

)

-- Оптимизированный запрос (использует JOIN)

SELECT t.Наименование

FROM Товары t

INNER JOIN Категории k ON t.Категория = k.Ссылка

WHERE k.Регион = 'Москва'

💡

Чтобы ускорить запрос, добавьте индекс на поле Категория в таблице товаров и на поле Регион в таблице категорий.

Инструменты для работы с SQL в 1С

Для эффективной работы с SQL в экосистеме 1С понадобятся специализированные инструменты. Вот самые полезные из них:

Инструмент Назначение Где скачать
SQL Server Management Studio (SSMS) Управление базами данных MS SQL Server, выполнение запросов, анализ планов. Официальный сайт Microsoft
pgAdmin Аналог SSMS для PostgreSQL. Официальный сайт pgAdmin
1C:Enterprise Development Tools (EDT) Среда разработки для 1С с встроенными средствами анализа запросов. Сайт 1C EDT
SQL Profiler Мониторинг и анализ выполняемых SQL-запросов. Входит в состав SQL Server (доступен в SSMS)
DBeaver Универсальный инструмент для работы с разными СУБД (включая MS SQL, PostgreSQL, DB2).