Запрос к серверной базе 1С изнутри и снаружи: консоль, HTTP, COM, OData
Содержание
Задать вопрос серверу 1С — значит отправить ему запрос на языке запросов 1С и получить выборку. Изнутри базы это делают через консоль запросов или серверную процедуру, снаружи — через HTTP-сервис, стандартный интерфейс OData или COM-соединение. Для разовых выгрузок по расписанию подходит запуск внешней обработки из командной строки.
Выбор простой. Нужно посмотреть данные самому — консоль. Нужно отдать данные сайту или другой программе — HTTP-сервис или OData. Нужен скрипт на Windows-машине рядом с сервером — COM. Прямой SQL к таблицам СУБД оставьте на крайний случай: о нём ниже отдельно.
| Способ | Где выполняется запрос | Когда выбирать | Что нужно |
|---|---|---|---|
| Консоль запросов | Сервер 1С, из клиентского сеанса | Разовая проверка, отладка | Право открывать внешние обработки |
Серверная процедура &НаСервере | Рабочий процесс кластера | Код внутри конфигурации или обработки | Доступ к Конфигуратору |
| HTTP-сервис | Рабочий процесс, через веб-сервер | Интеграция с сайтом, ботом, BI | Публикация на веб-сервере |
| OData | Рабочий процесс, через веб-сервер | Чтение справочников и регистров без кода | Публикация + состав интерфейса |
| COM-соединение | Рабочий процесс, вызов из внешней программы | Скрипты на Windows (Python, PowerShell, VBS) | Зарегистрированный comcntr.dll |
Командная строка /Execute | Клиентский сеанс + сервер | Выгрузка по расписанию | Пользователь 1С и путь к .epf |
Подготовка: права, пользователь и где «живёт» запрос
В клиент-серверном варианте любой запрос к данным выполняет рабочий процесс кластера 1С, а не компьютер пользователя. Клиент только передаёт текст запроса и параметры, а получает готовую выборку. Поэтому скорость зависит от сервера и СУБД, а не от мощности рабочего места.
До начала проверьте три вещи:
- 👤 Пользователь. Заведите отдельного пользователя под интеграцию, а не используйте администратора. Так проще разбирать журнал и ограничивать права.
- 🔐 Права на данные. Запрос видит только то, что разрешено ролями. Если в конфигурации включены ограничения на уровне записей (RLS), часть строк просто не попадёт в выборку, без ошибки.
- 🌐 Сетевой доступ. Клиент 1С и COM-соединение обращаются к агенту сервера (порт 1540), затем к менеджеру кластера (1541) и рабочим процессам из диапазона, заданного в свойствах рабочего сервера. HTTP и OData идут через веб-сервер по 80/443.
Для серверного кода есть привилегированный режим: УстановитьПривилегированныйРежим(Истина). Он снимает проверку прав внутри серверной процедуры. Пользуйтесь им точечно и только там, где сами контролируете, какие данные уходят наружу.
Запрос из самой базы: консоль и серверная процедура
Консоль запросов
Самый быстрый способ задать вопрос серверу — внешняя обработка «Консоль запросов». Её выпускает фирма 1С в составе обработок для разработчиков, ещё больше вариантов есть от сообщества.
- Скачайте файл консоли (
.epf) под вашу версию платформы. - Запустите 1С:Предприятие под пользователем с правом открывать внешние обработки.
- Откройте файл через главное меню:
Файл → Открыть. - Если появилось предупреждение о защите от опасных действий, подтвердите открытие. Это предупреждение платформы для файлов из непроверенных источников.
- Напишите текст запроса или соберите его конструктором и нажмите кнопку выполнения.
Пример: остатки на 41 счёте по номенклатуре на сегодня.
ВЫБРАТЬ
Остатки.Субконто1 КАК Номенклатура,
Остатки.КоличествоОстаток КАК Количество,
Остатки.СуммаОстатокДт КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&НаДату,
Счет В ИЕРАРХИИ (&Счет41),
,
) КАК Остатки
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
Параметры &НаДату и &Счет41 задайте в табличной части параметров консоли.
Запросы на изменение данных язык запросов 1С не поддерживает: только выборка. Если консоль умеет «исполнять код», этот код пишет в рабочую базу напрямую. Проверяйте такие вещи на копии.
Серверная процедура в обработке
Когда запрос нужен регулярно, его оборачивают в процедуру с директивой &НаСервереБезКонтекста. Она не тянет на сервер данные формы и выполняется быстрее, чем &НаСервере.
&НаКлиенте
Процедура Выполнить(Команда)
КоличествоДокументов = ПосчитатьРеализации(НачалоМесяца(ТекущаяДата()));
Сообщить("Реализаций с начала месяца: " + Формат(КоличествоДокументов, "ЧГ=0"));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПосчитатьРеализации(ДатаНачала)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(Р.Ссылка) КАК Всего
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Р
|ГДЕ
| Р.Проведен
| И Р.Дата >= &ДатаНачала";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Выборка = Запрос.Выполнить().Выбрать();
Возврат ?(Выборка.Следующий(), Выборка.Всего, 0);
КонецФункции
HTTP-сервис: ответ сервера по ссылке
HTTP-сервис — объект конфигурации, который принимает обычный HTTP-запрос и возвращает ответ. Его вызывает сайт, телеграм-бот, Power BI, curl. Добавлять его в типовую конфигурацию
лучше через расширение, чтобы не снимать её с поддержки.
Шаг 1. Создайте сервис
- В Конфигураторе откройте расширение (или конфигурацию) и в дереве найдите
Общие → HTTP-сервисы. - Добавьте сервис, задайте корневой URL, например
api. - Добавьте шаблон URL
/stock/{article}и в нём методGET. - В свойствах метода создайте обработчик.
Шаг 2. Напишите обработчик
Функция ОстатокGET(Запрос)
Артикул = Запрос.ПараметрыURL["article"];
З = Новый Запрос;
З.Текст =
"ВЫБРАТЬ
| Н.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Н
|ГДЕ
| Н.Артикул = &Артикул";
З.УстановитьПараметр("Артикул", Артикул);
Выборка = З.Выполнить().Выбрать();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
Если Выборка.Следующий() Тогда
Ответ.УстановитьТелоИзСтроки(Выборка.Наименование);
Иначе
Ответ.КодСостояния = 404;
Ответ.УстановитьТелоИзСтроки("Не найдено");
КонецЕсли;
Возврат Ответ;
КонецФункции
ПараметрыURL берёт значения из шаблона ({article}), а ПараметрыЗапроса — из строки после ?.
Шаг 3. Опубликуйте и проверьте
- В Конфигураторе:
Администрирование → Публикация на веб-сервере. - Отметьте публикацию HTTP-сервисов и нужный сервис, нажмите «Опубликовать». Конфигуратор должен быть запущен от имени администратора Windows, если публикуете на IIS или Apache на этой же машине.
- Проверьте запрос:
curl -u integr:пароль "http://srv1c/buh/hs/api/stock/A-1024"
Здесь buh — имя публикации, hs — фиксированный сегмент HTTP-сервисов, api — корневой URL.
OData: запросы к данным без программирования
Стандартный интерфейс OData отдаёт справочники, документы и регистры по REST без единой строки кода в конфигурации. Это удобный вариант для BI-систем и внешних отчётов.
- При публикации на веб-сервере отметьте «Публиковать стандартный интерфейс OData».
- Задайте состав интерфейса — какие объекты будут видны. Это делают методом
УстановитьСоставСтандартногоИнтерфейсаOData()из обработки или специальной обработкой настройки. Пока состав пуст, сервис возвращает пустой список объектов. - Отправьте запрос:
curl -u integr:пароль \
"http://srv1c/buh/odata/standard.odata/Catalog_Контрагенты?\$format=json&\$select=Description,ИНН&\$top=10"
| Параметр | Что делает | Пример |
|---|---|---|
$filter | Отбор строк | $filter=ИНН eq '7700000000' |
$select | Нужные поля | $select=Description,ИНН |
$top | Ограничение количества | $top=100 |
$format | Формат ответа | $format=json |
Имена сущностей строятся по типу объекта: Catalog_, Document_, AccumulationRegister_, InformationRegister_ плюс имя из конфигурации.
Пользователь OData подчиняется тем же ролям. Дайте ему роль только на чтение нужных объектов, и через интерфейс нельзя будет ничего записать.
COM-соединение: запрос из скрипта на Windows
COM-соединение открывает «внешнее соединение» с базой из любой программы на Windows, которая умеет работать с COM. Запрос выполняется на сервере 1С, а результат приходит в скрипт.
Регистрация компоненты
Компонента comcntr.dll лежит в папке bin установленной платформы. Регистрируют её от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\comcntr.dll"
Номер версии в пути подставьте свой. Разрядность платформы должна совпадать с разрядностью программы, которая вызывает COM: 64-битный Python не увидит 32-битную компоненту.
Пример на Python
import win32com.client
connector = win32com.client.Dispatch("V83.COMConnector")
conn = connector.Connect('Srvr="srv1c";Ref="buh";Usr="integr";Pwd="пароль";')
q = conn.NewObject("Запрос")
q.Текст = """
ВЫБРАТЬ ПЕРВЫЕ 10
К.Наименование КАК Наименование,
К.ИНН КАК ИНН
ИЗ
Справочник.Контрагенты КАК К
"""
sel = q.Выполнить().Выбрать()
while sel.Следующий():
print(sel.Наименование, sel.ИНН)
Строка подключения для файловой базы — File="D:\Bases\buh"; вместо пары Srvr и Ref.
Каждое внешнее соединение — это сеанс на сервере. Скрипт, который открывает соединение в цикле и не закрывает его, быстро плодит висящие сеансы. Открывайте одно соединение на весь прогон.
Запуск обработки из командной строки
Если внешнего API нет, а выгрузка нужна каждую ночь, пригодится запуск 1С:Предприятия с ключом /Execute. Платформа открывает базу и сразу запускает указанную обработку.
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE ^
/S"srv1c\buh" /N"integr" /P"пароль" ^
/Execute"D:\Scripts\Vygruzka.epf" ^
/C"D:\Export\ostatki.csv" ^
/DisableStartupMessages
Как это устроено:
- Строка после
/Cпопадает в глобальную переменнуюПараметрЗапуска. Удобно передавать путь к файлу или дату. - В обработчике
ПриОткрытииформы обработки вызовите серверную функцию с запросом и запишите результат в файл. - В конце вызовите
ЗавершитьРаботуСистемы(Ложь), чтобы сеанс закрылся сам. - Поставьте bat-файл в планировщик заданий Windows на время, когда базой не пользуются.
Если обработка нужна постоянно, надёжнее сделать регламентное задание в расширении. Оно работает в кластере без клиентского сеанса и не зависит от того, залогинен ли кто-то на сервере.
Прямой SQL, ODBC и JDBC
Для платформы 8.3 фирма 1С не выпускает ODBC- или JDBC-драйвер к своим данным. Внешние программы подключаются либо через HTTP и OData из разделов выше, либо напрямую к СУБД (MS SQL Server, PostgreSQL) своим драйвером.
Прямое подключение работает, но с оговорками:
- 🗂 Таблицы называются служебно:
_Reference32,_Document145,_AccumRg1200. Соответствие имён объектам 1С возвращает функцияПолучитьСтруктуруХраненияБазыДанных(). - 🔒 Права ролей и RLS при этом не действуют: SQL видит всё.
- 🔄 После обновления конфигурации номера таблиц и полей могут измениться, и запрос сломается.
- ⛔ Писать в таблицы базы 1С через SQL нельзя: платформа не узнает об изменениях, итоги регистров разойдутся.
Обратное направление ODBC вполне штатное. Объект «Внешние источники данных» позволяет самой 1С обращаться к чужой базе через ODBC и строить по ней запросы на языке 1С.
Проверка результата: журнал регистрации и техжурнал
Запрос не вернул данных или вернул ошибку — первым делом откройте журнал регистрации.
- В БП 3.0 и ЗУП 3.1:
Администрирование → Обслуживание → Журнал регистрации. - В Конфигураторе:
Администрирование → Журнал регистрации.
Отберите записи по пользователю интеграции и периоду. В журнале видны начало и конец сеансов, ошибки выполнения с текстом и строкой модуля, отказы в доступе. Для HTTP и COM в колонке приложения видно, откуда пришло подключение.
Сам текст запроса и время его выполнения журнал регистрации не хранит. Для этого включают технологический журнал: файл logcfg.xml в папке conf платформы на сервере.
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="D:\techlog" history="24">
<event>
<eq property="name" value="SDBL"/>
</event>
<property name="all"/>
</log>
</config>
Событие SDBL пишет запросы на языке 1С, DBMSSQL и DBPOSTGRS — то, что ушло в СУБД. history="24" хранит логи 24 часа.
Техжурнал без отборов пишет очень много и нагружает диск. Включайте его на время проверки, потом удаляйте logcfg.xml или убирайте лишние события.