1С:Предприятие

Бизнес-процесс в CityScreen Deals может читать записи из базы 1С:Предприятие и создавать или изменять их по стандартному интерфейсу OData, который публикует база. В типичном обмене процесс читает юридические лица («Контрагенты») и их договоры в справочники Deals, создаёт в 1С счета («Счёт на оплату покупателю») из предложений сделки и читает обратно входящие платежи.

Коннектор передаёт запросы и не содержит бухгалтерских правил. Что читает процесс, как он сопоставляет записи и какие суммы и НДС отправляет, описано в скриптовых задачах процесса.

Эта функция лицензируется. Если лицензия вашей организации её не включает, обратитесь в CityScreen.

Перед началом

Администратор 1С публикует стандартный интерфейс OData базы и выбирает, какие объекты опубликовать. Процесс читает и записывает только опубликованные объекты.

Вам нужны адрес публикации и пользователь 1С, который может читать и изменять эти объекты.

Учётные записи подключения

У организации есть одна или несколько учётных записей подключения — по одной для каждой базы 1С, с которой она работает. Скриптовая задача указывает учётную запись, которую использует, а логин и пароль остаются в учётной записи.

  1. Откройте Настройки → 1С.

  2. Нажмите Добавить учётную запись и заполните поля.

  3. Сохраните, затем нажмите Проверить соединение в строке учётной записи.

Поле Значение

Название

Как скриптовая задача ссылается на учётную запись. Название уникально в пределах организации независимо от регистра букв.

Базовый URL

Адрес публикации 1С, например https://1c.example.com/accounting. CityScreen Deals сам добавляет /odata/standard.odata. Хост должен быть доступен из интернета. Если ваша база 1С доступна только внутри вашей сети, обратитесь в поддержку CityScreen.

Логин, Пароль

Пользователь 1С, от имени которого выполняются запросы. Пароль после сохранения больше не показывается. Когда вы редактируете учётную запись и оставляете пароль пустым, сохранённый пароль остаётся.

Таймаут, с

Сколько секунд запрос ждёт ответа 1С, от 1 до 600. По умолчанию 60.

В одной базе 1С часто несколько ваших юридических лиц. Поэтому организация 1С — это поле каждой записи, которую отправляет процесс (Организация_Key). Учётная запись организацию не указывает.

Проверить соединение проверяет соединение и показывает результат:

  • соединение работает;

  • 1С не отвечает: проверьте хост, порт и сеть;

  • 1С отклонила логин или пароль;

  • по этому адресу нет публикации OData;

  • 1С ответила другой ошибкой.

Каждый сбой также показывает текст ответа 1С или сетевой ошибки, если 1С не ответила.

Вкладка 1С показывается сотрудникам, чья роль включает право Учётные записи 1С и чья организация использует эту функцию. Право действует только в области «все» и включает действия «Создание», «Просмотр», «Редактирование» и «Удаление». С «Просмотром» видны учётные записи, «Создание» позволяет добавить учётную запись и проверить соединение, «Редактирование» — изменить её, «Удаление» — удалить. См. Роли и права.

Скриптовая задача, которая указывает удалённую учётную запись, завершается сбоем, поэтому переименовывайте или удаляйте учётную запись только вместе с процессами, которые её используют.

Вызов 1С из скриптовой задачи

Скриптовая задача обращается к 1С через объект oneC. Каждый вызов указывает учётную запись подключения и набор сущностей OData, например Catalog_Контрагенты или Document_СчетНаОплатуПокупателю. Вызов выполняется для организации, которой принадлежит процесс.

Вызов Результат

oneC.list(account, entitySet, query)

Записи, которые выбирает запрос, в пределах его top и skip.

oneC.listAll(account, entitySet, query)

Все записи списка, отсортированные по orderby запроса или по Ref_Key, если в запросе его нет.

oneC.get(account, entitySet, ref)

Одна запись по ссылке (Ref_Key).

oneC.create(account, entitySet, fields)

Создаёт запись и возвращает её так, как её сохранила 1С.

oneC.update(account, entitySet, ref, fields)

Изменяет указанные поля записи и возвращает запись.

query списка — это объект с любыми из ключей filter, select, orderby, top и skip. Они соответствуют параметрам OData $filter, $select, $orderby, $top и $skip. Ключ с другим именем приводит к сбою вызова, и запрос не отправляется. listAll игнорирует top и skip.

Записи возвращаются как объекты, поля которых читаются по их именам в 1С, например record.Ref_Key или record.ИНН, а списки читаются через size() и get(i). Табличная часть записи, например товары счёта, — это массив объектов внутри записи.

Проведение документа и пометка записи на удаление — это изменения полей в 1С: oneC.update с {Posted: true} или {DeletionMark: true}.

Пример: счёт для контрагента, найденного по ИНН

Скрипт находит контрагента по ИНН, создаёт счёт на одну услугу и сохраняет номер и ссылку 1С в переменных процесса для следующих шагов. Учётная запись называется Main base, а переменные процесса inn, organizationRef, contractRef, serviceRef и amount заданы предыдущими шагами. Скрипт записывает переменную процесса через execution.setVariable(name, value).

if (!/^[0-9]+$/.test(inn)) {
    throw new Error("The taxpayer number must hold digits only: " + inn);
}
var found = oneC.list("Main base", "Catalog_Контрагенты", {
    filter: "ИНН eq '" + inn + "'",
    select: "Ref_Key,Description"
});
if (found.size() !== 1) {
    throw new Error("Expected one contractor with the taxpayer number " + inn + ", found " + found.size());
}
var contractor = found.get(0);

var vatRate = 22;
var vat = Math.round(amount * vatRate) / 100;

var invoice = oneC.create("Main base", "Document_СчетНаОплатуПокупателю", {
    Date: "2026-12-01T00:00:00",
    Организация_Key: organizationRef,
    Контрагент_Key: contractor.Ref_Key,
    ДоговорКонтрагента_Key: contractRef,
    СуммаВключаетНДС: false,
    СуммаДокумента: amount + vat,
    Товары: [{
        LineNumber: "1",
        Номенклатура: serviceRef,
        Номенклатура_Type: "StandardODATA.Catalog_Номенклатура",
        Количество: 1,
        Цена: amount,
        Сумма: amount,
        СтавкаНДС: "НДС22",
        СуммаНДС: vat
    }]
});

execution.setVariable("invoiceNumber", invoice.Number);
execution.setVariable("invoiceRef", invoice.Ref_Key);

Поля, которые нужны счёту, и значения вроде ставки НДС НДС22 зависят от конфигурации базы и от даты. Прочитайте один существующий счёт через oneC.get или oneC.list, чтобы увидеть поля и значения, которые использует ваша база.

Журнал запросов

Каждый запрос к 1С и его ответ записываются в журнал организации. Запрос, отправленный повторно, отражается несколькими записями.

Запись содержит учётную запись, метод, URL, статус ответа, длительность, инстанс бизнес-процесса, который сделал вызов, тела запроса и ответа и текст ошибки, если ответа не было.

Журнал доступен через REST API сотрудникам с правом Журнал запросов 1С; право действует только в области «все» и включает только действие «Просмотр». Записи содержат данные, которыми процессы обменивались с 1С, поэтому давайте это право только сотрудникам, которым можно видеть эти данные.

Запрос Результат

GET /one-c/journal

Записи организации, сначала новые, постранично (page, size). Фильтры: accountId, processInstanceId и status со значением success (ответ 2xx) или error (нет ответа или другой статус). Тела запросов и ответов в список не входят.

GET /one-c/journal/{id}

Одна запись с телами запроса и ответа.

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

Если вызов не удался

Вызов не удаётся, когда 1С отвечает статусом ошибки или не отвечает в пределах таймаута учётной записи. Тогда скриптовая задача создаёт инцидент в инстансе процесса с текстом ошибки, который вернула 1С.

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

oneC.create отправляется один раз и не повторяется. В рамках одного вызова чтение или изменение может быть отправлено в 1С больше одного раза, и каждая попытка — отдельная запись в журнале запросов.

Когда oneC.create не удался, проверьте в 1С, не создана ли запись всё же, потому что повторно запущенная скриптовая задача отправляет создание ещё раз. Журнал запросов, отфильтрованный по идентификатору инстанса, показывает отправленный запрос.

Вызов также не удаётся, и запрос не отправляется, когда у организации нет учётной записи с таким названием, когда ссылка не является GUID или когда в запросе есть ключ, который вызов не поддерживает.

Когда причина устранена, восстановите инстанс так, как описывает раздел «Восстановление после сбоя» страницы Инстансы и инциденты.

Как отвечает 1С

Скрипт получает то, что вернула 1С, без изменений. Эти особенности интерфейса 1С влияют на то, как пишется скрипт:

  • Ссылка в шапке документа — это поле с суффиксом _Key, например Контрагент_Key. Ссылка в табличной части — это поле с именем реквизита и второе поле с суффиксом _Type, например Номенклатура и Номенклатура_Type.

  • Табличные части приходят внутри записи, если в запросе нет select. На $expand табличной части 1С отвечает ошибкой (501).

  • Страницы, прочитанные с skip и без orderby, приходят в нестабильном порядке и повторяют или пропускают записи. Всегда указывайте orderby при постраничном чтении через list; listAll возвращает каждую запись один раз без orderby.

  • Поле, которое может содержать ссылки нескольких типов, фильтруется через cast, например cast(ДокументОснование,'Document_СчетНаОплатуПокупателю') eq guid'<reference>'.

  • Запись, созданная через OData, записывается без вычислений, которые выполняет форма 1С. Передавайте суммы и НДС в запросе.