Чтобы получить счета из 1С для сайта, CRM или отчёта, не всегда нужно разрабатывать отдельный API. В платформе «1С:Предприятие» есть стандартный интерфейс OData: внешняя программа отправляет HTTP-запрос и получает данные документов или справочников. Покажу, как начать с чтения списка счетов.

Что даёт OData

OData задаёт правила обращения к данным: какой объект запросить, какие поля вернуть, как отфильтровать и отсортировать результат. Интерфейс формирует сама платформа 1С на основе конфигурации. Через него можно читать и изменять данные, создавать документы; для этого нужны соответствующие права.

Для первого знакомства достаточно запроса GET. Он позволяет проверить соединение и структуру ответа, не создавая и не изменяя счета.

Где находятся настройки OData

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

Окно публикации относится к конфигуратору. Вкладки «Авторизация» и «Состав» показаны на примере обработки из документации 1С:Фреш; наличие такой обработки в любой локальной конфигурации не предполагается.

Открыть публикацию в конфигураторе

Для описанного способа нужны настроенный Apache или IIS, расширение веб-сервера 1С и конфигуратор на компьютере с веб-сервером. Обычного тонкого клиента на рабочем компьютере недостаточно. Администратор заранее проверяет совместимость версий и разрядность компонентов, доступ веб-сервера к базе и настройку HTTPS. Установка этих компонентов — отдельная задача; флажок OData её не выполняет.

На Windows запускайте конфигуратор на компьютере с веб-сервером от имени администратора ОС. При запуске через список баз выделите нужную базу и нажмите «Конфигуратор». Подключение должно позволять открыть её в этом режиме; одного адреса веб-публикации для этого недостаточно.

Права запуска в ОС и права входа в базу — разные условия. После входа в конфигуратор откройте «Администрирование → Публикация на веб-сервере». Раздел «Администрирование» внутри бухгалтерской программы — другое меню. Для публикации на Linux порядок получения системных прав отличается; здесь описан вариант для Windows.

В открывшемся окне укажите имя публикации, выберите настроенный веб-сервер и каталог публикации. В схеме имя публикации — base; при настроенных домене и HTTPS её адрес может быть https://example.com/base/. Само нажатие «Опубликовать» не настраивает домен и сертификат.

Включите «Публиковать стандартный интерфейс OData» и нажмите «Опубликовать». Если публикация уже существует, используйте её параметры, добавив поддержку OData. После публикации выполните предложенный программой перезапуск веб-сервера, если он требуется.

Схема окна публикации: включён стандартный интерфейс OData.

Путь к публикации: список баз → «Конфигуратор» → «Администрирование» → «Публикация на веб-сервере».

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

Настроить доступ в 1С:Фреш

В 1С:Фреш откройте своё приложение в браузере под пользователем с ролью «Полные права». Обработку настройки запускает администратор приложения; это не требование выдавать полные права пользователю будущей интеграции. Следующие две иллюстрации показывают вкладки обработки «Настройка автоматического REST-сервиса» из документации сервиса.

В документации указаны три варианта пути, в зависимости от прикладного решения:

  • «Администрирование → Синхронизация данных → Настройки стандартного интерфейса OData»;
  • «Администрирование и НСИ → Синхронизация данных → Настройки стандартного интерфейса OData»;
  • «Настройки → Синхронизация данных → Настройки стандартного интерфейса OData».

Это альтернативные маршруты к одной обработке. Команда меню называется «Настройки стандартного интерфейса OData», а заголовок открытого окна — «Настройка автоматического REST-сервиса». Внутри находятся вкладки «Авторизация» и «Состав».

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

Вкладка «Авторизация»: пользователь интеграции

На вкладке «Авторизация» создайте отдельного служебного пользователя с собственным паролем. Именно его учётные данные будут использоваться в HTTP-запросе. В описанной обработке 1С:Фреш права для OData назначаются служебному пользователю автоматически. Доступные операции определяются правами пользователя. Запрос ниже выполняет только чтение.

Схема вкладки «Авторизация»: отдельный пользователь и пароль для OData.

Вкладка «Авторизация» открывается после команды «Настройки стандартного интерфейса OData».

Вкладка «Состав»: доступные документы

В том же окне переключитесь с «Авторизации» на «Состав». Раскройте документы и выберите счёт на оплату покупателю. Ориентируйтесь на название в своей конфигурации: оно может отличаться. Если обработка предложит включить связанные объекты, проверьте, какие из них нужны для запроса. Сохраните изменения.

Схема вкладки «Состав»: выбран документ «Счёт на оплату покупателю».

На вкладке «Состав» выбираются виды документов. Отбор отдельных счетов по датам задаётся в HTTP-запросе.

Состав OData и права пользователя решают разные задачи: первый определяет доступные через интерфейс виды объектов, вторые — допустимые действия с данными. Выбор документа в составе не заменяет выдачу прав.

Проверить публикацию до первого запроса

После любого из двух вариантов настройки нужны три вещи: HTTPS-адрес конкретной базы, учётные данные пользователя интеграции и опубликованный вид документа счёта. Для 1С:Фреш берите адрес приложения с идентификатором своей базы, а не адрес главной страницы сервиса.

К адресу базы добавьте /odata/standard.odata/. Запросы примера используют HTTP Basic с логином и паролем пользователя 1С. Успешный вход в веб-клиент через другую учётную запись или единый вход сам по себе не проверяет эти реквизиты. Сначала запросите описание объектов — $metadata; если браузер запрашивает учётные данные, используйте пользователя интеграции:

https://example.com/base/odata/standard.odata/$metadata

Здесь и далее замените адрес на адрес своей публикации. В XML-ответе найдите EntitySet для счетов, затем связанный с ним EntityType с полями. Пример ниже рассчитан на Document_СчетНаОплатуПокупателю с полями Ref_Key, Number, Date, DeletionMark и СуммаДокумента. Если имена отличаются, замените их в URL, параметрах запроса и выводе PHP. Если нужного объекта нет, проверьте состав OData; одного изменения имени в коде недостаточно.

Если вместо XML открывается страница входа облачного сервиса, проверьте адрес и способ авторизации у провайдера. Получение $metadata ещё не подтверждает право чтения самих счетов — это проверит следующий запрос.

Получить до десяти счетов по дате документа

Понадобится PHP 8 с расширением cURL. Передайте логин и пароль через переменные окружения. В Bash их можно задать так; пароль вводится без отображения:

read -r -p 'Логин 1С: ' ODATA_USER
read -r -s -p 'Пароль: ' ODATA_PASSWORD
export ODATA_USER ODATA_PASSWORD

Сохраните код в invoices.php, замените адрес публикации и запустите php invoices.php:

<?php
$base = 'https://example.com/base/odata/standard.odata/';
$user = getenv('ODATA_USER');
$password = getenv('ODATA_PASSWORD');
if ($user === false || $user === '' || $password === false || $password === '') {
    throw new RuntimeException('Задайте ODATA_USER и ODATA_PASSWORD');
}
$query = http_build_query([
    '$format' => 'json',
    '$select' => 'Ref_Key,Number,Date,СуммаДокумента',
    '$filter' => 'DeletionMark eq false',
    '$orderby' => 'Date desc,Ref_Key asc',
    '$top' => 10,
], '', '&', PHP_QUERY_RFC3986);

$url = $base . rawurlencode('Document_СчетНаОплатуПокупателю') . '?' . $query;
$curl = curl_init($url);
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
    CURLOPT_USERPWD => $user . ':' . $password,
    CURLOPT_FAILONERROR => true,
    CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($curl);
$error = curl_error($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false) {
    throw new RuntimeException($error);
}
if ($status !== 200) {
    throw new RuntimeException('Ожидался HTTP 200, получен ' . $status);
}

$data = json_decode($response, true, 512, JSON_THROW_ON_ERROR);
if (!isset($data['value']) || !is_array($data['value'])) {
    throw new RuntimeException('Ожидался список OData в поле value');
}
foreach ($data['value'] as $invoice) {
    echo $invoice['Number'], ' ', $invoice['Date'], ' ',
        $invoice['СуммаДокумента'], PHP_EOL;
}

$select ограничивает набор полей, $filter исключает документы с пометкой удаления, $orderby сортирует по дате документа от большей к меньшей, а при равных датах — по Ref_Key; $top ограничивает выборку десятью записями. rawurlencode кодирует имя ресурса, а http_build_query — параметры URL. Пример принимает только ответ HTTP 200. Ошибка соединения, другой HTTP-статус, неверный JSON или отсутствие массива value прерывают выполнение. Сортировка по Date не означает порядок фактического создания счетов в базе. Ref_Key — идентификатор документа: его удобно сохранять для последующих обращений к тому же счёту.

Результат — строки с номером, датой и суммой. Формат вывода:

000000042 2026-09-01T00:00:00 15000

Сверьте одну строку с документом в 1С. Пустой массив value означает, что запрос не вернул доступных пользователю счетов по заданному условию. При ошибке авторизации проверьте учётные данные и права, при 403 — права и ограничения веб-сервера, при 404 — адрес публикации и имя объекта, при 400 — поля и параметры по $metadata. Это направления проверки: один HTTP-код не доказывает конкретную причину.

Это первая выборка, а не выгрузка всей базы. Когда чтение заработает, можно добавить отбор по периоду и постраничную загрузку. Для первого шага достаточно увидеть реальные номера и суммы счетов в ответе на один HTTP-запрос.