Что это решает
Данные о деньгах, остатках и контрагентах лежат в учётной системе, а доступ к ним идёт через людей: нужен срез — нужен бухгалтер, который выгрузит, или программист, который допишет отчёт. ИИ-агент для 1С встаёт между вопросом и базой: «сколько должен контрагент и по каким счетам», «какие счета выставлены больше месяца назад и не оплачены», «сходятся ли поступления на расчётный счёт с проведёнными оплатами». Ответ собирается запросом, а не заявкой в очередь доработок. Вторая снимаемая рутина — ввод: типовой документ готовится из письма или строки в чате, а не руками по одному полю. Ответственность за проведение остаётся у человека: агент готовит черновик, утверждает сотрудник.
Как устроено
Связка распадается на три слоя, и путаница между ними — источник большинства провальных внедрений.
Слой доступа к данным
1С не отдаёт данные модели напрямую. Наружу торчит один из штатных механизмов.
| Механизм | Что умеет | Где жмёт |
|---|---|---|
| Стандартный интерфейс OData | чтение и запись объектов: справочники, документы, регистры сведений | не отдаёт виртуальные таблицы регистров (остатки, обороты), тяжёлые выборки медленные |
| HTTP-сервис в расширении | любой запрос на встроенном языке, включая остатки и обороты, плюс своя бизнес-логика | нужно писать и сопровождать код |
| Web-сервис (SOAP) | то же, что HTTP-сервис, с формальным описанием контракта | многословный формат, лишний разбор XML |
| Внешнее соединение (COM) | полный доступ к прикладным объектам | только Windows, сеансы и состояние плохо переживают работу сервисом |
| Репликация в аналитическую базу | произвольные быстрые SQL-срезы без нагрузки на рабочую базу | данные с задержкой, запись невозможна |
Прямые запросы к таблицам рабочей базы 1С в этот список не входят. Имена таблиц служебные, итоги регистров пересчитывает платформа, блокировки свои — вмешательство извне ломает данные тихо и надолго. Если очень хочется SQL, делают выгрузку в отдельную базу и работают с ней.
Слой инструментов
Модель не ходит по URL наугад. Ей дают набор именованных операций с описанием и параметрами: долг_контрагента(инн, на_дату), неоплаченные_счета(период), создать_счёт(контрагент, позиции, комментарий). Технически это функции tool-calling или MCP-сервер, внутри — те самые запросы к OData и вызовы HTTP-сервиса. Каждая операция закрывает один вопрос бизнеса целиком и возвращает готовые цифры, а не сырую таблицу на разбор модели.
Слой правил
Чтение открыто, запись — по списку. Каждая пишущая операция принимает ключ идемпотентности и создаёт документ непроведённым. Повторный вызов с тем же ключом возвращает уже созданный документ вместо второго такого же.
Порядок работы: вопрос → модель выбирает операцию → прослойка выполняет запрос под служебным пользователем → результат возвращается в контекст → модель отвечает либо делает следующий шаг. Всё, что агент сделал, остаётся в журнале регистрации под именем этого пользователя.
Как подключить
1. Опубликовать базу на веб-сервере. Конфигуратор → Администрирование → Публикация на веб-сервере. Отметить «Публиковать стандартный интерфейс OData» и, если планируются свои методы, публикацию HTTP-сервисов. В каталоге публикации появляется default.vrd — там же видно имя базы, которое попадёт в URL.
2. Открыть нужные объекты в OData. Стандартный интерфейс отдаёт только то, что явно включено в состав: Конфигуратор → Администрирование → Настройка состава стандартного интерфейса OData. Пустой состав — пустой ответ, и это первая причина «ничего не работает». Отмечать точечно, не «выбрать всё»: состав определяет площадь доступа.
3. Завести служебного пользователя. Отдельный пользователь с аутентификацией 1С:Предприятия, отдельная роль, права только на объекты из пункта 2. Права администратора здесь не нужны. Ограничения на уровне записей настраиваются той же ролью.
4. Проверить доступ снаружи.
curl -u 'ai_agent:PASSWORD' 'http://1c.local/base/odata/standard.odata/$metadata?$format=json'
Описание сущностей в ответе означает, что публикация и права в порядке. Пустой список — возврат к шагу 2. Ответ 401 — к шагу 3.
5. Снять первую выборку.
curl -u 'ai_agent:PASSWORD' 'http://1c.local/base/odata/standard.odata/Document_СчетНаОплатуПокупателю?$format=json&$top=5&$select=Number,Date,СуммаДокумента,Проведен'
$select обязателен на боевых объёмах: без него платформа отдаёт все реквизиты вместе с табличными частями. $top тоже, иначе первый запрос по документам вытянет всю историю. Отбор по периоду пишется как $filter=Date gt datetime'2026-01-01T00:00:00', пробелы в URL кодируются.
6. Добавить расширение для того, что OData не умеет. Остатки, обороты, расчёты по регистрам накопления — HTTP-сервис в расширении конфигурации: один метод равен одной операции, внутри запрос к виртуальной таблице, наружу JSON. Расширение вместо правки конфигурации, чтобы типовая осталась на поддержке и обновлялась штатно.
7. Обернуть операции в инструменты. Каждая функция получает описание для модели: что возвращает, какие параметры обязательны, что делать при ошибке. Текст ошибки пишется тоже для модели — «контрагент по ИНН не найден, уточните наименование» работает, «Ошибка 500» не работает.
8. Развести чтение и запись. Читающие операции выполняются свободно. Пишущие — только через подтверждение человеком, с ключом идемпотентности, без автопроведения.
Полезные сценарии
- Дебиторка по конкретному контрагенту с расшифровкой по счетам, датам и частичным оплатам.
- Сверка банковской выписки с проведёнными оплатами и список расхождений на разбор.
- Черновик счёта или заказа по письму клиента с подстановкой реквизитов из справочника.
- Поиск дублей контрагентов и номенклатуры по нечёткому совпадению — то, что плохо ловится штатным поиском.
- Утренняя сводка в мессенджер: остатки на счетах, просроченные оплаты, документы, зависшие без проведения.
- Раскладка прайсов поставщиков по группам номенклатуры при загрузке.
- Расшифровка цифры в отчёте: агент находит документы, из которых она сложилась, и объясняет состав.
Ограничения
Сеансы и лицензии. Каждое соединение по OData или HTTP-сервису поднимает сеанс, а сеансы упираются в схему лицензирования конкретной установки. Агент, дёргающий базу в цикле, конкурирует за них с людьми, поэтому пул соединений и ограничение частоты обязательны.
Скорость. OData на документах с табличными частями медленный, а модель склонна запросить всё и фильтровать потом. Лечится тем, что фильтрация зашита внутрь операции и модели недоступна.
Аналитика по регистрам. Через стандартный интерфейс остатки и обороты не получить. Попытка посчитать остаток сложением документов даёт неверные числа на любой нетривиальной схеме учёта — резервы, партии, характеристики, склады.
Запись. Проведение затрагивает движения по регистрам, взаиморасчёты и закрытый период. Проведение по решению модели — прямой путь к разбору полётов в закрытом квартале.
Персональные данные. Справочники контрагентов и физлиц содержат ПД, и они уезжают в контекст модели вместе с ответом. Либо провайдер и режим обработки согласованы с политикой компании, либо поля маскируются на уровне операции.
Типовые на поддержке. Вся логика живёт в расширении. Правка конфигурации ради агента удорожает каждое последующее обновление.
Как проверить результат
Начать с метаданных: $metadata отвечает, состав непустой, в нём ровно те объекты, которые открывали. Лишние объекты в составе — тоже дефект, их убирают.
Взять три вопроса с заранее известным ответом и сверить с 1С руками: остаток по одному складу на дату, долг одного контрагента, сумма одного документа. Расхождение на копейку обычно про округление и валюту, расхождение в разы — про то, что агент сложил документы вместо запроса к регистру.
Прогнать пишущую операцию дважды с одним ключом идемпотентности. Второй вызов обязан вернуть тот же документ, а не создать новый. Заодно проверить, что документ создан непроведённым.
Открыть журнал регистрации и отфильтровать по служебному пользователю: видно каждый доступ, время и объект. Густой однообразный поток означает, что операция дёргает базу в цикле и её надо переписать одним запросом.
Проверить отказ: спросить данные по объекту, которого нет в составе OData. Правильное поведение — внятное сообщение о недоступности, а не правдоподобный выдуманный ответ.
Правило одной строкой: читать из 1С можно чем угодно, писать — только именованной операцией в расширении, с ключом идемпотентности и без автопроведения.
