
В прошлых публикациях мы разбирали, как использовать MCP-сервера внутри VS Code для генерации кода 1С. Но что делать, если вы хотите использовать мощь локального контекста (ваших метаданных и синтакс-помощника) в привычных веб-интерфейсах ChatGPT, Claude или новых моделях вроде Kimi и DeepSeek, не покупая дорогие подписки? Последние две, кстати, доступны без всяких ухищрений с ВПН.
На помощь приходит MCP SuperAssistant — расширение для браузера, которое превращает любой чат с ИИ в полноценного 1С-агента.
-------------------------------------------------------------------------------
Инструментарий: Соединяем локальное с глобальным.
Главная фишка этого подхода — вам не нужно "светить" свои MCP-сервера в интернет. Всё работает через локальный прокси-сервер на вашем компьютере.
Что понадобится для старта:
1. Node.js: Установленный на вашей машине.
2. MCP SuperAssistant: Расширение для Chrome/Edge.
3. Локальные MCP-сервера: Например, бесплатные, которые мы использовали в VS Code (для метаданных и синтаксиса 1С).
--------------------------------------------------------------------------------
Настройка: Магия прокси-сервера
Чтобы браузерное расширение "увидело" ваши локальные сервера, нужно запустить связующее звено — MCP SuperAssistant Proxy.
1. Конфигурация: Создайте файл config.json с настройками ваших MCP-серверов. Он выглядит практически так же, как конфиг для VS Code или Cursor.
{
"mcpServers": {
"my-1c-mcp-server": { "type": "streamable-http",
"url": "http://192.168.1.13:8001/jsonrpc",
"headers": {
"x-collection-name": "1cservice_rag"
}
},
"_1c-syntax-helper": {
"url": "http://192.168.1.13:8002/mcp",
"timeout": 60,
"disabled": false,
"alwaysAllow": [
"get_syntax_info",
"find_1c_help",
"search_by_context",
"list_object_members"
]
},
"confluence": {
"type": "streamable-http",
"url": "http://192.168.1.3:8003/mcp",
"timeout": 30
}
}
}
2. Запуск прокси: Через командную строку (CMD) запустите мост командой: npx @srbhptl39/mcp-superassistant-proxy@latest --config C:\ПутьКПапке\config.json --outputTransport streamableHttp
Так, по крайней мере с моими mcp, они у меня работают с прокси по streamableHttp


3. Подключение в браузере:
После включения расширения в строке чата c ИИ (например, в deepSeek) должна появиться кнопка MCP

Заходим в "configure" и включаем переключатель MCP, появится правая боковая панель. Заходим в неё и в настройках (кнопка с шестерёнкой) указываем адрес вашего локального прокси (в нашем случаеhttp://localhost:3006/mcp) и протокол (streamableHttp).


После этого в чате на боковой панели должны появиться инструменты наших MCP (search-1s-documentation и 1s-syntax-helper)

Теперь нажимаем на кнопку MCP, далее insert, attach и отправляем в модель (мы отправляем в модель инструкции, основываясь на которых, она будет обращаться за дополнительным контекстом к расширению, а оно, в свою очередь, к нашим MCP через прокси).


Теперь модель знает всё, что вам нужно. Можно это проверить, спросив, например, про ваш нетиповой документ.


--------------------------------------------------------------------------------
Практический тест: коротко Kimi и DeepSeek таже задача с Excel.
Для проверки мы взяли ту же задачу: написать код для обогащения Excel-файла данными из 1С (Заказы покупателей, контактная информация и т.п.).
Как это работает в чате:
промпт как и в прошлый раз
У меня есть файл excel в котором три колонки , первая строка названия колонок, нужно обрабатывать со второй.
Во второй колонке номер документа Заказ клиента , например ТК000000007 а в третей дата в виде 03.02.2007 14:00:00 нужно написать код который добавить колонки в файл и сохранит его добавив к имени "_1" выведет в колонки номер документа Заказ , Дата документа, Ответственного, Контрагента, Телефон контрагента , Дату отгрузки, Дату оплаты.
Не нужно форматирования, никаких шрифтов и выделений и пиши все без функций, просто код так чтобы я мог вставить текст в консоль кода и выполнить, чтобы код был одной простынёй. Обязательно используй MCP.
Для понимания структуры конфигурации, реквизитов объектов обязательно используй my-1c-mcp-server а для понимания синтаксиса языка 1С используй 1c-syntax-helper . Напиши код. Телефон контрагента бери из регистра "Контактная информация ", документ ищи по дате и номеру.
• Модель Kimi2.5 - вышла в конце января и показывает неплохие результаты в бэнчмарках в сравнении с glm4.7
Результат. Одна ошибка отмечена #Ошибка
ПутьКФайлу = "C:\1C_VSCode\NewCodeMCP\Заказы.xls"; // Укажите путь к вашему файлу Excel
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Колонка1");
Таблица.Колонки.Добавить("НомерДокумента");
Таблица.Колонки.Добавить("ДатаДокументаСтрока");
Excel = Новый COMОбъект("Excel.Application");
Excel.Visible = Ложь;
Книга = Excel.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Worksheets(1);
ВсегоСтрок = Лист.UsedRange.Rows.Count;
Для НомерСтроки = 2 По ВсегоСтрок Цикл
НоваяСтрока = Таблица.Добавить();
НоваяСтрока.Колонка1 = Лист.Cells(НомерСтроки, 1).Value;
НоваяСтрока.НомерДокумента = Лист.Cells(НомерСтроки, 2).Value;
НоваяСтрока.ДатаДокументаСтрока = Лист.Cells(НомерСтроки, 3).Value;
КонецЦикла;
Книга.Close(Ложь);
Excel.Quit();
Таблица.Колонки.Добавить("НомерЗаказа");
Таблица.Колонки.Добавить("ДатаДокумента");
Таблица.Колонки.Добавить("Ответственный");
Таблица.Колонки.Добавить("Контрагент");
Таблица.Колонки.Добавить("ТелефонКонтрагента");
Таблица.Колонки.Добавить("ДатаОтгрузки");
Таблица.Колонки.Добавить("ДатаОплаты");
Для Каждого СтрокаТаблицы Из Таблица Цикл
НомерДок = СокрЛП(СтрокаТаблицы.НомерДокумента);
ДатаСтрока = СтрокаТаблицы.ДатаДокументаСтрока;
Попытка
ДатаДок = Дата(Сред(ДатаСтрока, 7, 4), Сред(ДатаСтрока, 4, 2), Сред(ДатаСтрока, 1, 2), Сред(ДатаСтрока, 12, 2), Сред(ДатаСтрока, 15, 2), Сред(ДатаСтрока, 18, 2));
Исключение
Попытка
ДатаДок = Дата(Прав(ДатаСтрока, 4), Сред(ДатаСтрока, 4, 2), Лев(ДатаСтрока, 2));
Исключение
ДатаДок = ТекущаяДата();
КонецПопытки;
КонецПопытки;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Док.Ссылка, Док.Номер, Док.Дата, Док.Ответственный.Представление КАК Ответственный, Док.Контрагент.Представление КАК Контрагент, Док.ДатаОтгрузки, Док.ДатаОплаты, Док.Контрагент КАК КонтрагентСсылка ИЗ Документ.ЗаказПокупателя КАК Док ГДЕ Док.Номер = &Номер И Док.Дата МЕЖДУ &ДатаНач И &ДатаКон";
Запрос.УстановитьПараметр("Номер", НомерДок);
Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаДок));
Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаДок));
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
СтрокаТаблицы.НомерЗаказа = Результат.Номер;
СтрокаТаблицы.ДатаДокумента = Результат.Дата;
СтрокаТаблицы.Ответственный = Результат.Ответственный;
СтрокаТаблицы.Контрагент = Результат.Контрагент;
СтрокаТаблицы.ДатаОтгрузки = Результат.ДатаОтгрузки;
СтрокаТаблицы.ДатаОплаты = Результат.ДатаОплаты;
ЗапросТелефон = Новый Запрос;
ЗапросТелефон.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Рег.Представление ИЗ РегистрСведений.КонтактнаяИнформация КАК Рег ГДЕ Рег.Объект = &Контрагент И Рег.Тип = &ТипТелефон УПОРЯДОЧИТЬ ПО Рег.ЗначениеПоУмолчанию УБЫВ";
ЗапросТелефон.УстановитьПараметр("Контрагент", Результат.КонтрагентСсылка);
ЗапросТелефон.УстановитьПараметр("ТипТелефон", Перечисления.ТипыКонтактнойИнформации.Телефон);
РезультатТелефон = ЗапросТелефон.Выполнить().Выбрать();
Если РезультатТелефон.Следующий() Тогда
СтрокаТаблицы.ТелефонКонтрагента = РезультатТелефон.Представление;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ExcelNew = Новый COMОбъект("Excel.Application");
ExcelNew.Visible = Ложь;
КнигаNew = ExcelNew.Workbooks.Add();
ЛистNew = КнигаNew.Worksheets(1);
ЛистNew.Cells(1, 1).Value = "Колонка1";
ЛистNew.Cells(1, 2).Value = "НомерДокументаИсходный";
ЛистNew.Cells(1, 3).Value = "ДатаДокументаИсходная";
ЛистNew.Cells(1, 4).Value = "НомерЗаказа";
ЛистNew.Cells(1, 5).Value = "ДатаДокумента";
ЛистNew.Cells(1, 6).Value = "Ответственный";
ЛистNew.Cells(1, 7).Value = "Контрагент";
ЛистNew.Cells(1, 8).Value = "ТелефонКонтрагента";
ЛистNew.Cells(1, 9).Value = "ДатаОтгрузки";
ЛистNew.Cells(1, 10).Value = "ДатаОплаты";
НомерСтрокиВыход = 2;
Для Каждого СтрокаТаблицы Из Таблица Цикл
ЛистNew.Cells(НомерСтрокиВыход, 1).Value = СтрокаТаблицы.Колонка1;
ЛистNew.Cells(НомерСтрокиВыход, 2).Value = СтрокаТаблицы.НомерДокумента;
ЛистNew.Cells(НомерСтрокиВыход, 3).Value = СтрокаТаблицы.ДатаДокументаСтрока;
ЛистNew.Cells(НомерСтрокиВыход, 4).Value = СтрокаТаблицы.НомерЗаказа;
ЛистNew.Cells(НомерСтрокиВыход, 5).Value = СтрокаТаблицы.ДатаДокумента;
ЛистNew.Cells(НомерСтрокиВыход, 6).Value = СтрокаТаблицы.Ответственный;
ЛистNew.Cells(НомерСтрокиВыход, 7).Value = СтрокаТаблицы.Контрагент;
ЛистNew.Cells(НомерСтрокиВыход, 8).Value = СтрокаТаблицы.ТелефонКонтрагента;
// ЛистNew.Cells(НомерСтрокиВыход, 9).Value = СтрокаТаблицы.ДатаОтгрузки; #Ошибка
ЛистNew.Cells(НомерСтрокиВыход, 10).Value = СтрокаТаблицы.ДатаОплаты;
НомерСтрокиВыход = НомерСтрокиВыход + 1;
КонецЦикла;
ПозицияТочки = СтрНайти(ПутьКФайлу, ".", НаправлениеПоиска.СКонца);
Если ПозицияТочки > 0 Тогда
ИмяБезРасширения = Лев(ПутьКФайлу, ПозицияТочки - 1);
Расширение = Сред(ПутьКФайлу, ПозицияТочки);
НовыйПуть = ИмяБезРасширения + "_1" + Расширение;
Иначе
НовыйПуть = ПутьКФайлу + "_1";
КонецЕсли;
КнигаNew.SaveAs(НовыйПуть);
КнигаNew.Close(Ложь);
ExcelNew.Quit();
Сообщить("Файл сохранен: " + НовыйПуть);
Тут одна ошибка. Полагаю, что модель перемудрила с получением даты или с типами.
Думаю, что внутри клауд кода может показать результат лучше. Но на мой взгляд менять подписку на GLM за 3$ в месяц с умопомрачительными лимитами на неё, смысла нет.
• DeepSeek: Ну и чтобы два раза не вставать, попробовал ещё одну модель доступную без ВПН.
Результат. две ошибки отмечены #Ошибка
// Открываем Excel файл
ПриложениеExcel = Новый COMОбъект("Excel.Application");
ПриложениеExcel.Visible = Ложь;
ИмяФайла = ""; // Укажите здесь имя файла
Если ПустаяСтрока(ИмяФайла) Тогда
ИмяФайла = "Выберите файл Excel";
КонецЕсли;
Книга = ПриложениеExcel.Workbooks.Open(ИмяФайла);
Лист = Книга.Worksheets(1);
// Определяем последнюю строку
ПоследняяСтрока = Лист.Cells(Лист.Rows.Count, 1).End(-4162).Row; // -4162 = xlUp
// Добавляем новые колонки
Лист.Cells(1, 4).Value = "Номер документа Заказ";
Лист.Cells(1, 5).Value = "Дата документа";
Лист.Cells(1, 6).Value = "Ответственный";
Лист.Cells(1, 7).Value = "Контрагент";
Лист.Cells(1, 8).Value = "Телефон контрагента";
Лист.Cells(1, 9).Value = "Дата отгрузки";
Лист.Cells(1, 10).Value = "Дата оплаты";
// Обрабатываем строки со второй
Для Строка = 2 По ПоследняяСтрока Цикл
НомерДокумента = Лист.Cells(Строка, 2).Value;
ДатаСтрока = Лист.Cells(Строка, 3).Value;
Если Не ПустаяСтрока(НомерДокумента) И Не ПустаяСтрока(ДатаСтрока) Тогда
// Пытаемся преобразовать дату
Попытка
ДатаДокумента = Дата(ДатаСтрока);
Исключение
ДатаДокумента = Неопределено;
КонецПопытки;
Если ДатаДокумента <> Неопределено Тогда
// Ищем документ ЗаказПокупателя по номеру и дате
Док = Документы.ЗаказПокупателя.НайтиПоРеквизиту("Номер", НомерДокумента); #Ошибка1 нужно найтипономеру
// Если не нашли по номеру, ищем среди документов с этой датой
Если Док = Неопределено Тогда
Выборка = Документы.ЗаказПокупателя.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Номер = НомерДокумента И Выборка.Дата = ДатаДокумента Тогда
Док = Выборка.ПолучитьОбъект();
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Док <> Неопределено Тогда
// Заполняем данные из документа
Лист.Cells(Строка, 4).Value = Док.Номер;
Лист.Cells(Строка, 5).Value = Док.Дата;
Лист.Cells(Строка, 6).Value = Док.Ответственный; #Ошибка2 нужно привести тип к строки
Лист.Cells(Строка, 7).Value = Док.Контрагент; #Ошибка2 та же ошибка2
// Получаем телефон контрагента из регистра сведений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОНТАКТНАЯИНФОРМАЦИЯ.ПРЕДСТАВЛЕНИЕ
|ИЗ
| РЕГИСТРСВЕДЕНИЙ.КОНТАКТНАЯИНФОРМАЦИЯ КАК КОНТАКТНАЯИНФОРМАЦИЯ
|ГДЕ
| КОНТАКТНАЯИНФОРМАЦИЯ.ОБЪЕКТ = &Контрагент
| И КОНТАКТНАЯИНФОРМАЦИЯ.ВИД = &ВидКонтактнойИнформации
| И КОНТАКТНАЯИНФОРМАЦИЯ.ТИП = &ТипКонтактнойИнформации";
Запрос.УстановитьПараметр("Контрагент", Док.Контрагент);
Запрос.УстановитьПараметр("ВидКонтактнойИнформации", "Телефон");
Запрос.УстановитьПараметр("ТипКонтактнойИнформации", "Рабочий");
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
// Пробуем найти любой телефон
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| КОНТАКТНАЯИНФОРМАЦИЯ.ПРЕДСТАВЛЕНИЕ
|ИЗ
| РЕГИСТРСВЕДЕНИЙ.КОНТАКТНАЯИНФОРМАЦИЯ КАК КОНТАКТНАЯИНФОРМАЦИЯ
|ГДЕ
| КОНТАКТНАЯИНФОРМАЦИЯ.ОБЪЕКТ = &Контрагент
| И КОНТАКТНАЯИНФОРМАЦИЯ.ВИД = &ВидКонтактнойИнформации";
Запрос.УстановитьПараметр("Контрагент", Док.Контрагент);
Запрос.УстановитьПараметр("ВидКонтактнойИнформации", "Телефон");
Результат = Запрос.Выполнить();
КонецЕсли;
Если Не Результат.Пустой() Тогда
ВыборкаТелефон = Результат.Выбрать();
ВыборкаТелефон.Следующий();
Лист.Cells(Строка, 8).Value = ВыборкаТелефон.ПРЕДСТАВЛЕНИЕ;
КонецЕсли;
// Даты отгрузки и оплаты
Лист.Cells(Строка, 9).Value = Док.ДатаОтгрузки;#Ошибка2
Лист.Cells(Строка, 10).Value = Док.ДатаОплаты;#Ошибка2
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Сохраняем файл с новым именем
НовоеИмяФайла = Лев(ИмяФайла, Найти(ИмяФайла, ".") - 1) + "_1.xlsx";
Книга.SaveAs(НовоеИмяФайла);
// Закрываем Excel
Книга.Close();
ПриложениеExcel.Quit();
// Освобождаем COM объекты
ПриложениеExcel = Неопределено;
Книга = Неопределено;
Лист = Неопределено;
Сообщить("Обработка завершена. Файл сохранен как: " + НовоеИмяФайла);
Тут глобально две ошибки (метод НайтиПоРеквизиту вместо НайтиПоНомеру и приведение типов)
Результаты:
1. Kimi: Написала вполне рабочий код через COM-объекты. Были небольшие нюансы с типами данных при записи в Excel, но логика поиска в 1С отработана нормально.
2. DeepSeek: Допустил пару ошибок (например, пытался использовать метод НайтиПоРеквизиту для номера), но после ручных правок или уточняющих запросов код успешно выполнил задачу.
--------------------------------------------------------------------------------
Итоги: Зачем это нужно?
MCP SuperAssistant — это отличный способ бесплатно тестировать любые современные модели на ваших реальных задачах 1С. Вам не нужно ждать поддержки MCP в конкретной IDE или платить за Pro-аккаунты, чтобы попробовать.
Основные плюсы:
• Универсальность: Работает в ChatGPT, Gemini, Claude.
• Безопасность: Ваши сервера остаются локальными, прокси лишь передает описание инструментов и результаты их работы модели под вашим контролем.
• Скорость: Настройка занимает пару минут, если у вас уже есть готовые MCP-сервера.
Этот метод идеально подходит для быстрой генерации кусков кода или консультаций с ИИ, когда под рукой только браузер.
Ссылка на ютуб (можно скачать, если тут не открывается)
В видео бонус - бесплатный API-ключ NVIDIA для тестов в коде
Предыдущие статьи:
Вайб-кодинг в 1С: как рефакторить код бесплатно с помощью VS Code и Roo Code
Вайб-кодинг в 1С: как заставить ИИ БЕСПЛАТНО писать новый код с помощью MCP-серверов
Следующие статьи:
Вайб-кодинг в 1С: Создаём MCP для 1С 7.7 за вечер и пишем обмен с бухгалтерий 8