Как загрузить данные из 1С в нейросеть и проверить её ответ
Иван Недомолков · Опубликовано:
Загрузить данные из 1С в нейросеть можно только файлом: подключаться к базе модель не умеет, она читает то, что вы положили в чат. Рабочий файл состоит из трёх частей. Сырые записи нужных справочников, документов и регистров. Описание полей этих объектов с синонимами. Сводки с опорными числами, по которым ответ сверяется. Ниже по шагам: кто что делает, как выбрать объём, в каком виде отдавать и чем ловить модель на ошибке.
Инструкция рассчитана на двоих. Руководитель приносит вопрос и потом читает ответ. Программист готовит выгрузку и отвечает за то, чтобы цифру можно было проверить.
Три способа, которые пробуют первыми
Прежде чем идти по шагам, коротко о том, чего делать не стоит. Каждый из этих путей что-то даёт, но на разовый вопрос к своим данным ни один не отвечает.
| Путь | Что получится | Почему |
|---|---|---|
| Сформировать отчёт, сохранить в xlsx, приложить к чату | Пересказ той же таблицы. На вопрос за её пределами модель признается, что данных мало, или додумает | В отчёте уже стоят чужие отборы и итоги. Контрагент там просто текст, связи с договорами и другими документами нет |
| Подключить базу к модели по API через расширение | Рабочая схема для постоянного сценария, но долгий проект | Объём упирается в окно модели. Серверу базы нужен выход в интернет, а это согласование с безопасностью. Плюс ключ и оплата каждого вопроса |
| Отдать модели метаданные и попросить написать запрос | Черновик запроса, который обязан вычитать человек | Модель ставит в запрос поля, которых у объекта нет. Хуже, когда поле есть, но значит другое: дата документа вместо даты проведения, цена с налогом вместо цены без него |
Последний вариант живёт своей жизнью, когда задача про код: как выгрузить структуру конфигурации для нейросети, чтобы она не выдумывала реквизиты, разобрано отдельно. Здесь речь про содержимое базы. Если же нужно, чтобы агент сам ходил в боевую базу и читал её запросами, это другой класс решений, и у него свои меры защиты: доступ ИИ к боевой базе без права записи.
Шаг 1. Руководитель: сформулировать вопрос и период
Нейросеть на файле из 1С полезна для вопросов, которые задают один раз. Отчёт под них писать жалко, а руками собирать цифру час-два. Примеры:
- сколько закупили за прошлый квартал у поставщиков, с которыми работаем меньше года;
- какие контрагенты перестали покупать за последние полгода;
- по каким позициям цена менялась чаще всего;
- сколько документов провёл сотрудник, который уходит.
От руководителя программисту нужны две вещи: сам вопрос словами и период. Период сразу режет объём выгрузки, и это самый дешёвый способ уложиться в окно модели. Формулировка “проанализируй всю базу” не годится: на неё не будет ни файла подходящего размера, ни проверяемого ответа.
Шаг 2. Программист: посмотреть, что в базе заполнено
Первым делом нужен обход метаданных со счётом записей. Этот шаг полезен даже без нейросети: почти всегда оказывается, что большая часть конфигурации пустая. Минимальный вариант по справочникам:
Для Каждого ОписаниеСправочника Из Метаданные.Справочники Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(*) КАК Всего ИЗ Справочник." + ОписаниеСправочника.Имя;
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Если Выборка.Всего > 0 Тогда
Сообщить(ОписаниеСправочника.Имя + ": " + Выборка.Всего);
КонецЕсли;
КонецЦикла;
Документы и регистры дописываются тем же циклом. Конфигурацию код не меняет, но каждый оборот делает отдельный КОЛИЧЕСТВО(*) по таблице. В ERP одних справочников восемьсот с лишним, поэтому запускайте на копии или вне рабочего дня.
Что показал такой обход на небольшой живой базе 1С:ERP для Казахстана 2.4.5.17 (платформа 8.3.27):
| Показатель | Значение |
|---|---|
| Объектов, способных хранить данные, в конфигурации | 2 853 |
| Из них с записями | 456 |
| Записей во всех заполненных объектах | 106 332 |
| Из них в служебных таблицах платформы | 49 316 (54 объекта) |
| Осталось без служебных таблиц | 57 016 записей, 402 объекта |
Служебные таблицы это версии объектов, сведения об обновлениях, настройки пользователей, ключи доступа. На вопрос руководителя они не отвечают, а место в чате занимают. Их выбрасывают первыми.
Шаг 3. Решить, что именно выгружать
После обхода видно, где лежат данные. Теперь состав подбирают под вопрос: для закупок нужны документы поступления, контрагенты, договоры и номенклатура, зарплатные регистры не нужны. Период из шага 1 применяется к документам и регистрам.
Здесь многих подводит интуиция “документов у нас мало, значит и файл будет маленький”. В той же базе ERP было 3 730 документов за два года, 327 контрагентов, 22 сотрудника. А из 57 016 записей без служебных таблиц 42 288 пришлись на регистры: движения документов, графики работы, суммы в валюте, производственный календарь. Документы дали шесть с половиной процентов записей.
Прикинуть размер до выгрузки можно грубо: число знаков текста разделить на 2,5, получится порядок числа токенов для кириллицы. Для той базы в режиме без служебных таблиц вышло 4,9 миллиона знаков Markdown, то есть около 2 миллионов токенов. Целиком в чат такое не кладут. Отсюда правило: в чат идёт срез по одному разделу учёта и по периоду вопроса.
Шаг 4. В каком виде отдавать
Удобнее всего один архив с двумя папками: Markdown для чата и JSON для программы, если те же данные потом забирает код. Так устроен архив, который собирает наша обработка:
markdown/
00-ЧИТАТЬ-ПЕРВЫМ.md что за база, как читать, какие вопросы задавать
01-Структура-базы.md выгруженные объекты и поля с синонимами
02-Сводки.md документы по месяцам, итоги регистров, состав выгрузки
10-<Раздел>.md ... данные по разделам учёта
json/
manifest.json состав, счётчики "в базе / в файле", правила чтения
schema.json поля объектов с типами и табличными частями
<ПолноеИмя>.json сами записи
Почему в файле сырые строки плюс описание полей, и зачем каждая часть.
Сырые записи. Справочник таблицей, документ карточкой с табличными частями, регистр таблицей. Никаких итогов и заранее выбранных группировок. Только так на вопрос “покажи всё по этому контрагенту” у модели есть материал, а у вас есть строка, в которую можно ткнуть пальцем.
Описание полей рядом с данными. Перечень выгруженных объектов и реквизитов с типами и синонимами, как их видит пользователь на форме. Модели есть откуда взять имя поля, а вам есть по чему проверить, что поле с таким смыслом в выгрузке существует.
Сводки. Документы по месяцам, итоги регистров, счётчики по объектам. Это опорные числа для сверки, о них в шаге 6.
Представления вместо идентификаторов. В Markdown контрагент записан наименованием. Строка вида 8a2c4e1f-... модели ничего не говорит и съедает место. Идентификаторы остаются в JSON: там ссылка хранится типом, идентификатором и представлением, перечисление именем значения, даты в ISO.
Собирать это руками под каждый вопрос долго. Мы сделали внешнюю обработку Выгрузка данных 1С для нейросети: она сама обходит метаданные, делит объекты на бизнес-данные, классификаторы и служебные, в кратком режиме служебные отбрасывает, ограничивает документы и регистры периодом и отдаёт один архив. Имена объектов в неё не зашиты, прогоны шли на ERP для Казахстана, Управлении торговлей 11.5 и бухгалтерии Казахстана без правок кода. По той базе ERP краткий прогон дал 428 файлов и архив на 4 МБ, распакованный Markdown весил 7,8 МБ.
Выгрузка ничего не маскирует: фамилии, ИИН, названия контрагентов и суммы едут в файл как есть. Если файл уходит в облачный чат, решение принимает владелец данных. Как заменить чувствительные значения маркерами и потом вернуть их в ответ модели, описано в разборе про обезличивание данных 1С для нейросети.
Шаг 5. Загрузить в чат и задать вопрос
Порядок в чате простой. Первым кладётся файл-инструкция 00-ЧИТАТЬ-ПЕРВЫМ.md, за ним структура и сводки, потом файлы только тех разделов, которые нужны вопросу. Если чат ограничивает число вложений, лишние разделы отрезаются здесь, данные внутри нужного раздела остаются целыми.
Вопрос руководителя стоит дополнить просьбой назвать, из каких записей получена цифра: номера и даты документов, наименования контрагентов. Такой ответ проверяется за минуты. Ответ одной цифрой без опоры приходится либо принимать на веру, либо пересчитывать целиком.
Шаг 6. Проверить ответ по исходным строкам
Здесь программист возвращается в работу. Проверка идёт в три уровня, и каждый ловит свою ошибку.
Сверка со сводкой. Модель говорит, сколько было документов за месяц, в 02-Сводки.md стоит своё число. Совпало - модель прочитала файл правильно. Разошлось - разбираемся, что она пропустила или посчитала дважды. Ограничение у этой проверки есть: сводка собрана из тех же данных, что и файлы разделов. Ошибку чтения моделью она ловит, ошибку самой выгрузки не ловит.
Полнота выгрузки. В manifest.json по каждому объекту записано, сколько строк в базе и сколько ушло в файл. Если числа расходятся, модель считала по неполным данным, и спорить с ней бесполезно. Такое бывает, когда база живая и в ней работают во время выгрузки.
Контрольный запрос в базу. Для цифры, которую понесут дальше руководителю или в решение, одна выборка по записям, которые назвала модель. Если модель перечислила документы, найти их в базе и сложить суммы обычным запросом. Это единственная проверка, независимая и от модели, и от выгрузки.
Роли тут делятся естественно. Руководитель смотрит, отвечает ли ответ на его вопрос по смыслу. Программист проверяет, что цифра сходится со строками.
Где подход перестаёт работать
Большие базы. Миллионы документов в окно модели не поместятся ни в каком режиме. Два года небольшой компании уже дали около двух миллионов токенов. На крупной базе работает только узкий срез: один раздел, один месяц, один участок.
Хранилища значений. Двоичные данные в выгрузку не идут, в поле остаётся пометка.
Регулярные вопросы. Если руководитель задаёт один и тот же вопрос каждую неделю, выгружать файл заново каждый раз дорого, а определения показателей начинают расходиться от раза к разу. Тогда нужен постоянный расчёт с общими определениями, это уже аналитика данных с нейросетями как отдельная работа.
Открытым для нас остаётся вопрос о балансе: сводки занимают место в окне, которое можно отдать под сырые строки. Мы пока держим их в файле, потому что без опорных чисел первую проверку сделать нечем. Если у вас модель ошибалась на данных из 1С уверенно и вы это поймали, интересно, чем именно: сводкой, запросом или глазами.