Запрос к серверной базе 1С изнутри и снаружи: консоль, HTTP, COM, OData

· 9 мин

Содержание

Задать вопрос серверу 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С в составе обработок для разработчиков, ещё больше вариантов есть от сообщества.

  1. Скачайте файл консоли (.epf) под вашу версию платформы.
  2. Запустите 1С:Предприятие под пользователем с правом открывать внешние обработки.
  3. Откройте файл через главное меню: Файл → Открыть.
  4. Если появилось предупреждение о защите от опасных действий, подтвердите открытие. Это предупреждение платформы для файлов из непроверенных источников.
  5. Напишите текст запроса или соберите его конструктором и нажмите кнопку выполнения.

Пример: остатки на 41 счёте по номенклатуре на сегодня.

ВЫБРАТЬ
    Остатки.Субконто1 КАК Номенклатура,
    Остатки.КоличествоОстаток КАК Количество,
    Остатки.СуммаОстатокДт КАК Сумма
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
        &НаДату,
        Счет В ИЕРАРХИИ (&Счет41),
        ,
    ) КАК Остатки
УПОРЯДОЧИТЬ ПО
    Сумма УБЫВ

Параметры &НаДату и &Счет41 задайте в табличной части параметров консоли.

Запросы на изменение данных язык запросов 1С не поддерживает: только выборка. Если консоль умеет «исполнять код», этот код пишет в рабочую базу напрямую. Проверяйте такие вещи на копии.

Серверная процедура в обработке

Когда запрос нужен регулярно, его оборачивают в процедуру с директивой &НаСервереБезКонтекста. Она не тянет на сервер данные формы и выполняется быстрее, чем &НаСервере.

&НаКлиенте
Процедура Выполнить(Команда)
    КоличествоДокументов = ПосчитатьРеализации(НачалоМесяца(ТекущаяДата()));
    Сообщить("Реализаций с начала месяца: " + Формат(КоличествоДокументов, "ЧГ=0"));
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПосчитатьРеализации(ДатаНачала)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    КОЛИЧЕСТВО(Р.Ссылка) КАК Всего
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК Р
    |ГДЕ
    |    Р.Проведен
    |    И Р.Дата >= &ДатаНачала";
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Выборка = Запрос.Выполнить().Выбрать();
    Возврат ?(Выборка.Следующий(), Выборка.Всего, 0);
КонецФункции

HTTP-сервис: ответ сервера по ссылке

HTTP-сервис — объект конфигурации, который принимает обычный HTTP-запрос и возвращает ответ. Его вызывает сайт, телеграм-бот, Power BI, curl. Добавлять его в типовую конфигурацию лучше через расширение, чтобы не снимать её с поддержки.

Шаг 1. Создайте сервис

  1. В Конфигураторе откройте расширение (или конфигурацию) и в дереве найдите Общие → HTTP-сервисы.
  2. Добавьте сервис, задайте корневой URL, например api.
  3. Добавьте шаблон URL /stock/{article} и в нём метод GET.
  4. В свойствах метода создайте обработчик.

Шаг 2. Напишите обработчик

Функция ОстатокGET(Запрос)
    Артикул = Запрос.ПараметрыURL["article"];

    З = Новый Запрос;
    З.Текст =
    "ВЫБРАТЬ
    |    Н.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Н
    |ГДЕ
    |    Н.Артикул = &Артикул";
    З.УстановитьПараметр("Артикул", Артикул);
    Выборка = З.Выполнить().Выбрать();

    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "text/plain; charset=utf-8");
    Если Выборка.Следующий() Тогда
        Ответ.УстановитьТелоИзСтроки(Выборка.Наименование);
    Иначе
        Ответ.КодСостояния = 404;
        Ответ.УстановитьТелоИзСтроки("Не найдено");
    КонецЕсли;
    Возврат Ответ;
КонецФункции

ПараметрыURL берёт значения из шаблона ({article}), а ПараметрыЗапроса — из строки после ?.

Шаг 3. Опубликуйте и проверьте

  1. В Конфигураторе: Администрирование → Публикация на веб-сервере.
  2. Отметьте публикацию HTTP-сервисов и нужный сервис, нажмите «Опубликовать». Конфигуратор должен быть запущен от имени администратора Windows, если публикуете на IIS или Apache на этой же машине.
  3. Проверьте запрос:
curl -u integr:пароль "http://srv1c/buh/hs/api/stock/A-1024"

Здесь buh — имя публикации, hs — фиксированный сегмент HTTP-сервисов, api — корневой URL.

OData: запросы к данным без программирования

Стандартный интерфейс OData отдаёт справочники, документы и регистры по REST без единой строки кода в конфигурации. Это удобный вариант для BI-систем и внешних отчётов.

  1. При публикации на веб-сервере отметьте «Публиковать стандартный интерфейс OData».
  2. Задайте состав интерфейса — какие объекты будут видны. Это делают методом УстановитьСоставСтандартногоИнтерфейсаOData() из обработки или специальной обработкой настройки. Пока состав пуст, сервис возвращает пустой список объектов.
  3. Отправьте запрос:
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

Как это устроено:

  1. Строка после /C попадает в глобальную переменную ПараметрЗапуска. Удобно передавать путь к файлу или дату.
  2. В обработчике ПриОткрытии формы обработки вызовите серверную функцию с запросом и запишите результат в файл.
  3. В конце вызовите ЗавершитьРаботуСистемы(Ложь), чтобы сеанс закрылся сам.
  4. Поставьте 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 или убирайте лишние события.

Если запрос не выполняется

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

Частые вопросы

Можно ли изменить данные запросом 1С, как UPDATE в SQL?
Нет. Язык запросов 1С только читает данные. Изменения делают через объекты: получают объект по ссылке, меняют реквизит и записывают.
Что быстрее для выгрузки большого объёма: OData или HTTP-сервис?
HTTP-сервис, если запрос в нём написан под задачу и отдаёт только нужные поля. OData удобнее, но при больших объёмах передаёт лишнее и требует постраничной выборки через $top и $skip.
Как ограничить, сколько запрос будет выполняться?
В тексте запроса используйте ВЫБРАТЬ ПЕРВЫЕ N и отборы по периоду. На стороне вызывающей программы задайте таймаут HTTP-запроса.
Работает ли COM-соединение на сервере 1С под Linux?
COM — технология Windows. Скрипт с COM-соединением запускается на Windows-машине, а сам сервер 1С может работать на Linux. Если Windows нет, используйте HTTP-сервис или OData.