Давайте посмотрим, на что сейчас способны лучшие языковые модели в плане выполнения работы архитектора 1С. В этом обзоре присутствуют все основные игроки (OpenAI, Anthropic, Google). Также я добавил к ним двух отечественных провайдеров (Yandex и Сбер)
Проектирование конфигураций для 1С, это достаточно сложный процесс. Но концепции, лежащие в основе 1С, довольно просты и не требуют много слов для описания. В качестве препромта или системного промта можно использовать нечто подобное:
В учетной системе таблицы четырех видов. Справочники описывают объекты реального мира. Документы описывают события и в них есть дата. Спецификации описывают состав документов. Документы и спецификации связаны отношением один ко многим. Например, в документе мы указываем покупателя, а в спецификации мы указываем список товаров, которые купил покупатель. Регистры обладают способностью вычислять остаток. Если нам нужен остаток тогда дублируем информацию о событии в регистре.
После препромта описываем словами, что за конфигурацию мы хотим получить, а в конце добавляем «хвостик»:
Создай структуру таблиц базы данных для такого учета с названиями таблиц и полей на русском языке. Также надо указать связи между таблицами. Результат представь в виде JSON
Если представить себе, что мы хотим сделать рабочий инструмент для архитектора 1С, тогда препромт и хвост стоит спрятать внутри приложения, а пользователю предоставить одно единственное поле ввода, куда он внесет свое описание конфигурации человеческими словами, в произвольной форме. Мы же отправим большой языковой модели на обработку это пользовательское описание с препромтом впереди и хвостом сзади. Такая конструкция не единственно возможная. Можно было бы и хвост поставить вперед. Языковым моделям в данном случае более или менее все равно. Но я решил остановиться на таком варианте исключительно для наглядности. В окончательном виде то, что мы отправляем большой языковой модели могло бы выглядеть, например, так:
В учетной системе таблицы четырех видов. Справочники описывают объекты реального мира. Документы описывают события и в них есть дата. Спецификации описывают состав документов. Документы и спецификации связаны отношением один ко многим. Например, в документе мы указываем покупателя, а в спецификации мы указываем список товаров, которые купил покупатель. Регистры обладают способностью вычислять остаток. Если нам нужен остаток тогда дублируем информацию о событии в регистре.
У меня мелкооптовая торговля. Я хочу вести учет закупок товаров у поставщиков и продаж товаров покупателям. Хочу видеть остатки товаров на текущий момент. И сколько и на какую сумму я продал товаров.
Создай структуру таблиц базы данных для такого учета с названиями таблиц и полей на русском языке. Также надо указать связи между таблицами. Результат представь в виде JSON
«Отдадим» это GPT-4 (OpenAI). Результат будет следующим:
{
"Таблицы": [
{
"Название": "Справочник_Поставщики",
"Поля": [
{
"Название": "ID_Поставщика",
"Тип": "int"
},
{
"Название": "Название_Поставщика",
"Тип": "string"
}
]
},
{
"Название": "Справочник_Товары",
"Поля": [
{
"Название": "ID_Товара",
"Тип": "int"
},
{
"Название": "Название_Товара",
"Тип": "string"
},
{
"Название": "Цена_Товара",
"Тип": "float"
}
]
},
{
"Название": "Документ_Закупка",
"Поля": [
{
"Название": "ID_Документа",
"Тип": "int"
},
{
"Название": "Дата_Закупки",
"Тип": "date"
},
{
"Название": "ID_Поставщика",
"Тип": "int"
}
],
"Связи": [
{
"Таблица": "Справочник_Поставщики",
"Поле": "ID_Поставщика"
}
]
},
{
"Название": "Спецификация_Закупка",
"Поля": [
{
"Название": "ID_Спецификации",
"Тип": "int"
},
{
"Название": "ID_Документа",
"Тип": "int"
},
{
"Название": "ID_Товара",
"Тип": "int"
},
{
"Название": "Количество",
"Тип": "int"
}
],
"Связи": [
{
"Таблица": "Документ_Закупка",
"Поле": "ID_Документа"
},
{
"Таблица": "Справочник_Товары",
"Поле": "ID_Товара"
}
]
},
{
"Название": "Регистр_Остатки",
"Поля": [
{
"Название": "ID_Товара",
"Тип": "int"
},
{
"Название": "Остаток",
"Тип": "int"
}
],
"Связи": [
{
"Таблица": "Справочник_Товары",
"Поле": "ID_Товара"
}
]
},
{
"Название": "Документ_Продажа",
"Поля": [
{
"Название": "ID_Документа",
"Тип": "int"
},
{
"Название": "Дата_Продажи",
"Тип": "date"
}
]
},
{
"Название": "Спецификация_Продажа",
"Поля": [
{
"Название": "ID_Спецификации",
"Тип": "int"
},
{
"Название": "ID_Документа",
"Тип": "int"
},
{
"Название": "ID_Товара",
"Тип": "int"
},
{
"Название": "Количество",
"Тип": "int"
},
{
"Название": "Сумма",
"Тип": "float"
}
],
"Связи": [
{
"Таблица": "Документ_Продажа",
"Поле": "ID_Документа"
},
{
"Таблица": "Справочник_Товары",
"Поле": "ID_Товара"
}
]
}
]
}
Конечно же этот JSON (впрочем, как и любой другой) не предназначен для того, чтобы выдавать его пользователю как есть. Если у вас имеется некоторый опыт разработчика 1С, тогда вы можете присмотреться внимательнее к результату и убедиться, что относительно простая утилита может превратить этот JSON в файл .cf, т.е. в конфигурацию 1С. А утилита чуть посложнее может даже сделать два файла выгрузки (.dt), как это принято для типовых конфигураций 1С. Первая выгрузка будет пустой базой, а вторая — демонстрационной базой с некоторым количеством данных, сгенерированных той же языковой моделью.
Это был результат флагманской модели OpenAI GPT-4. Модель 3.5 можете не пробовать. Я вам так скажу, результат будет малопригоден для дальнейшей обработки. Давайте посмотрим, что мы можем получить от ближайшего конкурента OpenAI, компании Anthropic с ее флагманской моделью Claude-3-opus. Не так давно Claude сумел на некоторое время сместить GPT-4 с первого места на арене LMSys. Сейчас, правда, последняя модель GPT-4 вернула себе первое место. Арена LMSys это такая площадка, на которой различные модели соревнуются друг с другом в решении одинаковых задач. Соревнуются всегда две модели. Это как партия в шахматах. В результате получается ELO, как у шахматистов. Я считаю, что это более объективная оценка, чем всевозможные бенчмарки.
Результат Клода такой:
{
"справочники": [
{
"название": "Товары",
"поля": [
{
"название": "Код",
"тип": "число"
},
{
"название": "Наименование",
"тип": "строка"
}
]
},
{
"название": "Контрагенты",
"поля": [
{
"название": "Код",
"тип": "число"
},
{
"название": "Наименование",
"тип": "строка"
},
{
"название": "Тип",
"тип": "строка",
"значения": [
"Поставщик",
"Покупатель"
]
}
]
}
],
"документы": [
{
"название": "ПриходнаяНакладная",
"поля": [
{
"название": "Номер",
"тип": "число"
},
{
"название": "Дата",
"тип": "дата"
},
{
"название": "Поставщик",
"тип": "ссылка",
"таблица": "Контрагенты"
}
]
},
{
"название": "РасходнаяНакладная",
"поля": [
{
"название": "Номер",
"тип": "число"
},
{
"название": "Дата",
"тип": "дата"
},
{
"название": "Покупатель",
"тип": "ссылка",
"таблица": "Контрагенты"
}
]
}
],
"спецификации": [
{
"название": "СпецификацияПрихода",
"поля": [
{
"название": "Документ",
"тип": "ссылка",
"таблица": "ПриходнаяНакладная"
},
{
"название": "Товар",
"тип": "ссылка",
"таблица": "Товары"
},
{
"название": "Количество",
"тип": "число"
},
{
"название": "Цена",
"тип": "число"
},
{
"название": "Сумма",
"тип": "число"
}
]
},
{
"название": "СпецификацияРасхода",
"поля": [
{
"название": "Документ",
"тип": "ссылка",
"таблица": "РасходнаяНакладная"
},
{
"название": "Товар",
"тип": "ссылка",
"таблица": "Товары"
},
{
"название": "Количество",
"тип": "число"
},
{
"название": "Цена",
"тип": "число"
},
{
"название": "Сумма",
"тип": "число"
}
]
}
],
"регистры": [
{
"название": "ОстаткиТоваров",
"поля": [
{
"название": "Товар",
"тип": "ссылка",
"таблица": "Товары"
},
{
"название": "Количество",
"тип": "число"
}
]
},
{
"название": "ПродажиТоваров",
"поля": [
{
"название": "Товар",
"тип": "ссылка",
"таблица": "Товары"
},
{
"название": "Количество",
"тип": "число"
},
{
"название": "Сумма",
"тип": "число"
}
]
}
],
"связи": [
{
"таблица1": "ПриходнаяНакладная",
"таблица2": "СпецификацияПрихода",
"тип": "один-ко-многим"
},
{
"таблица1": "РасходнаяНакладная",
"таблица2": "СпецификацияРасхода",
"тип": "один-ко-многим"
}
]
}
На мой взгляд, даже несколько лучше, чем у GPT4, проще разбирать ссылки. А что нам даст Google со своими Близнецами? Прямо сейчас ELO у модели Gemini-1.5-pro 1249. Это на единицу больше, чем у Claude-3-opus. Результат Близнецов:
{
"таблицы": [
{
"название": "Справочник товаров",
"поля": [
"Код товара",
"Наименование товара",
"Цена закупки",
"Цена продажи"
]
},
{
"название": "Справочник поставщиков",
"поля": [
"Код поставщика",
"Наименование поставщика"
]
},
{
"название": "Справочник покупателей",
"поля": [
"Код покупателя",
"Наименование покупателя"
]
},
{
"название": "Документ закупки",
"поля": [
"Номер документа",
"Дата документа",
"Код поставщика",
"Сумма закупки"
]
},
{
"название": "Спецификация закупки",
"поля": [
"Номер документа",
"Код товара",
"Количество",
"Цена закупки"
]
},
{
"название": "Документ продажи",
"поля": [
"Номер документа",
"Дата документа",
"Код покупателя",
"Сумма продажи"
]
},
{
"название": "Спецификация продажи",
"поля": [
"Номер документа",
"Код товара",
"Количество",
"Цена продажи"
]
},
{
"название": "Регистр остатков товаров",
"поля": [
"Код товара",
"Количество на начало периода",
"Количество поступило",
"Количество продано",
"Количество на конец периода"
]
}
],
"связи": [
{
"таблица1": "Документ закупки",
"поле1": "Номер документа",
"таблица2": "Спецификация закупки",
"поле2": "Номер документа"
},
{
"таблица1": "Документ продажи",
"поле1": "Номер документа",
"таблица2": "Спецификация продажи",
"поле2": "Номер документа"
},
{
"таблица1": "Справочник товаров",
"поле1": "Код товара",
"таблица2": "Спецификация закупки",
"поле2": "Код товара"
},
{
"таблица1": "Справочник товаров",
"поле1": "Код товара",
"таблица2": "Спецификация продажи",
"поле2": "Код товара"
},
{
"таблица1": "Справочник поставщиков",
"поле1": "Код поставщика",
"таблица2": "Документ закупки",
"поле2": "Код поставщика"
},
{
"таблица1": "Справочник покупателей",
"поле1": "Код покупателя",
"таблица2": "Документ продажи",
"поле2": "Код покупателя"
},
{
"таблица1": "Справочник товаров",
"поле1": "Код товара",
"таблица2": "Регистр остатков товаров",
"поле2": "Код товара"
}
]
}
Ничуть не хуже, чем у предыдущих участников. Из этого тоже можно собрать конфигурацию в автоматическом режиме.
На этом хорошие результаты заканчиваются. Возможно, что следовало бы попробовать еще и Llama-3 с ее 1208 ELO, но я пока так и не смог преодолеть свой скепсис в отношении этой модели. В языковых моделях размер имеет значение. И 70 миллиардов у Llama сильно проигрывают своим ближайшим конкурентам.
Но у нас есть еще модели, которые вообще не участвуют в рейтинге. Речь идет об отечественных моделях от Yandex и Сбер.
Результат Yandex:
{
"Справочник товаров": {
"id": "Идентификатор товара",
"название": "Название товара",
},
"Документ закупки": {
"id": "Уникальный идентификатор документа закупки",
"дата": "Дата закупки",
"поставщик": "Ссылка на справочник поставщиков",
"количество": "Количество закупленных товаров",
}
"Спецификация закупки": {
"идентификатор_документа": "Ссылка на документ закупки",
"товар": "Ссылка на товары из справочника товаров"
}
"Регистр остатков": {
"идентификатор": "Идентификатор регистра остатков",
"товар": "Товар из справочника товаров",
"количество": "Количество товара на складе",
"сумма": "Стоимость товара на складе"
},
"Документ продажи": {
"id": "Документ продажи",
"дата": "Дата продажи",
"покупатель": "Покупатель из справочника покупателей",
"количество": "Продаваемое количество товаров",
"цена": "Цена продажи товаров"
}
}
Как видите, конфигурацию из этого не собрать. Хотя в целом у Яндекса неплохая модель со 100 миллиардами параметров. И, например, запросы SQL (а значит и запросы для 1С) она генерит достаточно хорошо.
Сберовский GIgaChat с его 39 миллиардами намного слабее. И его результат ожидаемо не лучше, чем у Яндекс:
{
"таблицы": [
{
"название": "Поставщики",
"поля": [
{"имя": "ID", "тип": "integer", "ключевое_поле": true},
{"имя": "Название", "тип": "text"},
{"имя": "Адрес", "тип": "text"}
]
},
{
"название": "Товары",
"поля": [
{"имя": "ID", "тип": "integer", "ключевое_поле": true},
{"имя": "Название", "тип": "text"},
{"имя": "Цена", "тип": "decimal"}
]
},
{
"название": "Закупки",
"поля": [
{"имя": "ID", "тип": "integer", "ключевое_поле": true},
{"имя": "Дата", "тип": "date"},
{"имя": "Поставщик_ID", "тип": "integer", "связь": "многие_ко_многим", "с_таблицей": "Поставщики"},
{"имя": "Товар_ID", "тип": "integer", "связь": "многие_ко_многим", "с_таблицей": "Товары"}
]
},
{
"название": "Продажи",
"поля": [
{"имя": "ID", "тип": "integer", "ключевое_поле": true},
{"имя": "Дата", "тип": "date"},
{"имя": "Покупатель", "тип": "text"},
{"имя": "Товар_ID", "тип": "integer", "связь": "многие_ко_многим", "с_таблицей": "Товары"}
]
}
],
"связи": [
{"откуда": "Закупки", "куда": "Поставщики", "связь": "один_ко_многим"},
{"откуда": "Закупки", "куда": "Товары", "связь": "многие_ко_многим"},
{"откуда": "Продажи", "куда": "Товары", "связь": "многие_ко_многим"}
]
}
Подведем итоги
- Модели из топ-5 арены уже сейчас могут по описанию на человеческом языке создавать работающие конфигурации 1С. Справочники, документы и регистры у вас будут. Отчеты в современных условиях не очень-то и нужны. Пользователь сформулирует, что ему надо на человеческом языке, а модель превратит это в запрос к базе данных.
- Отечественные модели в этом вопросе пока не дотягивают до флагманских моделей. И в целом выдают непригодный для дальнейшего использования результат. Но будем надеяться, что ситуация в будущем исправится.
Если вы хотите развивать свою карьеру в качестве архитектора 1С, следите внимательно за тем, что происходит в области искусственного интеллекта.
Также приходите на открытые уроки, посвящённые архитектуре 1С: 10 июня — «Юнит-тестирование в 1С», 20 июня — «Мониторинг производительности в ЦУП».