Пример легковесной интеграции 1С:Управление торговлей и микросервиса на базе Node.js

01.11.25

Интеграция - WEB-интеграция

Многие компании сталкиваются с необходимостью предоставить внешним пользователям доступ к данным 1С — например, дать возможность поставщику заполнить заказ или согласовать количество и цену товара. Прямое публикация 1С в интернет может быть небезопасна и малоэффективна, создавая дополнительную нагрузку на монолит 1С. Современные подходы опираются на микросервисы, REST API и безопасные промежуточные сервисы. В этой статье я показываю, как реализовать лёгкий и безопасный сервис для взаимодействия с 1С:Управление торговлей 11, используя Node.js и MySQL. С помощью внешней обработки формируется письмо с ссылкой на веб-форму, где поставщик может внести изменения в заказ. 1С при этом остаётся в безопасной внутренней сети, а внешние пользователи работают только с API сервиса.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Архив с исходным кодом приложения на node.js
.zip 4,66Kb
0 1 850 руб. Купить
Внешняя обработки генерации шаблона письма и отправка данных заказа на сервер
.epf 8,82Kb
0 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Да, существуют интеграции EDI и B2B, и 1С действительно умеет работать через Apache HTTPD.
Но насколько безопасно и производительно публиковать саму 1С в интернет? Тем более, когда мы живём в эпоху микросервисов, REST API и GraphQL, где системы взаимодействуют через простые протоколы.

 

Подход

Предположим, нам нужен небольшой специализированный сервис, который выполняет одну задачу — быстро и безопасно.

Например, компания хочет предоставить поставщику возможность заполнить определённые значения позиций в своём заказе, перейдя по ссылке из письма.

Ниже я расскажу, как можно реализовать это с помощью 1С:Управление торговлей 11, Node.js и MySQL.

 

Архитектура предлагаемого решения

 

 

  1. В 1С создаётся заказ поставщику.

  2. При проведении документа обработчик расширения:

    • формирует JSON с данными заказа (GUID, позиции, количество, цена);

    • отправляет POST-запрос на Node.js API;

    • формирует ссылку вида
      https://supplier-app.example.com/edit?orderId={GUID}&key={API_KEY};

    • добавляет ссылку в письмо поставщику.

  3. Поставщик открывает ссылку, редактирует количество и цены.

  4. Node.js сохраняет изменения в MySQL.

  5. Регламентное задание 1С раз в час забирает обновления и синхронизирует документ.

 

1. Настройка 1С

Начнём с кастомизации УТ в части отправки письма со ссылкой на форму для заполнения.
Для таких целей 1С рекомендует создать собственный шаблон электронного письма с формированием через внешнюю обработку.

 

Шаг 1. Создание обработки с видом «Шаблон сообщения»

Для корректной работы обработки необходимо определить функции:

  • СтруктураДанныхДляОтображенияВШаблоне()

  • ПараметрыШаблона()

  • СформироватьСообщениеПоШаблону()

  • СтруктураДанныхПолучатели()

Наибольший интерес представляет функция СтруктураДанныхДляОтображенияВШаблоне(), которая определяет основные параметры входных и выходных данных:

Функция СтруктураДанныхДляОтображенияВШаблоне() Экспорт
	
	// Создаем структуру данных для шаблона
	Структура = Новый Структура;
	
	// Имя типа параметра, на основании которого шаблон создается
	Структура.Вставить("ПолноеИмяТипаПараметраВводаНаОсновании", "Заказ поставщику");
	
	// Для электронного письма
	Структура.Вставить("ТипТекстаПисьма", Перечисления.СпособыРедактированияЭлектронныхПисем.HTML);
	
	// Заполняем тему и тело письма
	Структура.Вставить("ТемаПисьма", "Заказ поставщику");
	Структура.Вставить("ТекстШаблонаПисьмаHTML", "");
	
    // Флаги назначения
    Структура.Вставить("ПредназначенДляЭлектронныхПисем", Истина);
    Структура.Вставить("ПредназначенДляSMS", Ложь);
	
	// Альтернативные тексты (на случай SMS/текста)  
	Структура.Вставить("ТекстШаблонаSMS", "");
	Структура.Вставить("ТекстШаблонаПроизвольный", "");
	
	Возврат Структура;
КонецФункции

 

Шаг 2. Формирование письма

 

Функция СформироватьСообщениеПоШаблону() отправляет заказ на Node.js-сервис.
В нашем примере сервер запущен локально (localhost:3000), а эндпоинт /api/orders принимает POST-запрос с сериализованными данными табличной части заказа.

&НаСервере
Функция СформироватьСообщениеПоШаблону(Значения) Экспорт
	
    Сообщение = Новый Структура;
	Заказ = Значения.ЗаказПоставщику;
	
	Ответ = ОтправитьЗаказНаСервер(Заказ, "/api/orders");
	Если Ответ.HTTP_Response = 200 Тогда
		Ссылка = СФормироватьСтрокуUrl("/form/") + Ответ.GUID;
		Текст = "<html><body>"
		+ "<p>Ссылка на заполнение формы заказа: <a href='" + Ссылка + "'>" + Ссылка + "</a></p>"
		+ "</body></html>";
	Иначе
		ВызватьИсключение("Ошибка отправки заказа на удаленный хост. Ответ: " + Ответ.HTTP_Response);
	КонецЕсли;
	
	Сообщение.Вставить("СтруктураВложений", новый Структура);
	Сообщение.Вставить("ТемаПисьма", "Заказ поставщику №" + Заказ.Номер + " от " + Формат(Заказ.Дата, "ДЛФ='Д'"));
	Сообщение.Вставить("Текст", Текст);
	Сообщение.Вставить("ТекстПисьмаHTML", Текст);
	Сообщение.Вставить("ТипТекста", Перечисления.СпособыРедактированияЭлектронныхПисем.HTML);
	ЗаписатьВРегистрСведенийВGUIDПоставщику(Заказ,Ответ.GUID);
	Возврат Сообщение;
	
КонецФункции

 

Код процедуры формирования HTTP-запроса и отправки на сервер:

Функция ОтправитьЗаказНаСервер(Заказ,Путь)
	// Заказ — объект документа ЗаказПоставщику
	// Результат — переменная, в которую вернётся GUID или Неопределено
	
	МассивТоваров = Новый Массив;
	Для Каждого СтрокаТовара Из Заказ.Товары Цикл
		ДанныеТовара = Новый Структура;
		ДанныеТовара.Вставить("item", СтрокаТовара.Номенклатура.Наименование);
		ДанныеТовара.Вставить("quantity", СтрокаТовара.Количество);
		ДанныеТовара.Вставить("amount", СтрокаТовара.Сумма);
		МассивТоваров.Добавить(ДанныеТовара);
	КонецЦикла;
	
	ТелоЗапроса = Новый Структура;
	ТелоЗапроса.Вставить("doc_number", Заказ.Номер);
	ТелоЗапроса.Вставить("doc_date", Формат(Заказ.Дата, "ДФ=yyyy-MM-dd"));
	ТелоЗапроса.Вставить("supplier", Заказ.Контрагент.Наименование);
	ТелоЗапроса.Вставить("items", МассивТоваров);
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ТелоЗапроса);
	СтрокаJSON = ЗаписьJSON.Закрыть();
	
	Результат = Неопределено;
	Заголовки = Новый Соответствие;    
	Заголовки.Вставить("Content-Type", "application/json"); 
	
	HTTPСоединение = Новый HTTPСоединение(АдресСервера, Порт);
	HTTPЗапрос = Новый HTTPЗапрос(Путь,Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, "UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
	
	СтруктураОтвета = новый Структура("HTTP_Response,GUID");
	Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
	СтруктураОтвета.HTTP_Response = Ответ.КодСостояния; 
	
	Если Ответ.КодСостояния = 200 Тогда
		JSONОтвет = новый ЧтениеJSON();
	    JSONОтвет.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
	    РезультатJSON = ПрочитатьJSON(JSONОтвет);	
		
		Если ТипЗнч(РезультатJSON) = Тип("Структура") И РезультатJSON.Свойство("guid") Тогда
			СтруктураОтвета.GUID = РезультатJSON.guid;
		КонецЕсли;   
	КонецЕсли;	
	Возврат СтруктураОтвета;
КонецФункции

Шаг 3. Создание шаблона письма

Создаём шаблон сообщения с типом «Сообщение формируется через внешнюю обработку»
(панель Ещё → Внешняя обработка) и указываем ранее созданную обработку epf, предварительно сохраненную в "Печатные формы, отчет и обработки"

 

 

Шаг 4. Отправка

 

Создаём заказ поставщику и нажимаем Отправить->Почта.

После успешной отправки заказа на удалённый сервер и получения GUID заказа во внешней для 1с системе,  сама 1С формирует письмо со ссылкой для поставщика

 

 

Шаблон сообщения определен непосредственно в коде обработки

 

 

2. Веб-приложение обработки заказа

Перейдя по ссылке, поставщик в браузере открывает веб-форму, где может изменить поля Количество и Сумма и сохранить изменения (количество изменений не ограничено):

 

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

2.1. Альтернативные принципы обратной связи и организация безопасного обмена

Реализацию обратной связи между внешним приложением и 1С можно выстроить по-разному, в зависимости от инфраструктуры и требований безопасности. Ниже приведу несколько распространённых схем, которые хорошо работают в производственных контурах.

 

Вариант 1. Прямое взаимодействие через NGINX (Reverse Proxy)

 

Наиболее очевидный и управляемый способ — разместить промежуточный слой в виде NGINX с включённым reverse proxy и маршрутизацией запросов к внутреннему сервису 1С.
NGINX принимает внешние запросы по HTTPS, проверяет токены (например, JWT или Basic Auth), а затем передаёт только безопасные запросы во внутренний контур.

Такое решение позволяет централизованно управлять авторизацией, логированием и лимитами запросов, не открывая саму 1С наружу.
При необходимости можно подключить WAF-модуль (например, ModSecurity) для фильтрации вредоносных запросов.


Вариант 2. Организация обмена через DMZ-зону

 

Если корпоративная политика безопасности не допускает прямого доступа к внутренним системам, целесообразно выносить промежуточный API-сервис в DMZ-зону.
В этом случае 1С инициирует исходящее соединение к серверу в DMZ, получая от него новые заказы или статусы обработки.

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

Пример схемы:

  1. Node.js-сервис в DMZ принимает запросы от пользователей и сохраняет данные в MySQL.

  2. Регламентное задание в 1С раз в несколько минут обращается к эндпоинту /api/updates, получает изменения и синхронизирует их.

  3. Подтверждённые статусы возвращаются обратно на DMZ-сервер.

 

3. Node.js и база данных

Для реализации приложения использовались:

  • Node.js 22.19 + Express -   лёгкий, устойчивый к нагрузке и хорошо подходящий для микросервисных интеграций с 1С.
    Frontend построен на ванильном JavaScript и Bootstrap CSS

  • Frontend: ванильный JavaScript и Bootstrap CSS, что позволяет создавать адаптивную форму без тяжёлых фреймворков.

  • База данных: MySQL, поскольку является наиболее употребимой для подобного рода хостингов, но в целом данный DDL совместим и для PostgreSQL

Схема базы данных выглядит следующим образом:

CREATE DATABASE IF NOT EXISTS orders_db;
USE orders_db;

CREATE TABLE orders (
  id INT AUTO_INCREMENT PRIMARY KEY,
  guid CHAR(36) NOT NULL,
  number VARCHAR(50),
  date DATE,
  supplier VARCHAR(255),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE order_items (
  id INT AUTO_INCREMENT PRIMARY KEY,
  order_guid CHAR(36),
  item VARCHAR(255),
  quantity DECIMAL(15,2),
  amount DECIMAL(15,2),
  FOREIGN KEY (order_guid) REFERENCES orders(guid)
);

Данный скрипт необходимо запустить до эксплуатации приложения

Само веб-приложение организовано в виде простого каркаса с разделением на фронтенд, серверный код и вспомогательные модули и наследует паттерн Model-View-Controller

 

Описание установки node выходит за рамки данной статьи, отмечу лишь зависимости, используемые в проекте:

npm install express mysql2 body-parser dotenv uuid

 

3.1. Подключение к MySQL

Для доступа к базе используется пакет mysql2 — он поддерживает промисы и хорошо работает с async/await.

// db.js
import mysql from "mysql2/promise";
import dotenv from "dotenv";
dotenv.config();

export const db = await mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  database: process.env.DB_NAME,
  connectionLimit: 5,
});

 а вот пример того, как работает роутинг котроллеров для реализации паттерна MVC

import express from "express";
import { v4 as uuidv4 } from "uuid";
import { insertOrder,getOrderByGuid,updateOrderByGuid } from "./db.js";
import path from "path";
import { __dirname, __filename } from "./utils.js";

const router = express.Router();

router.post("/api/orders/create", async (req, res) => {
  try {
    const data = req.body;

    // Generate GUID
    const guid = uuidv4();

    const order = {
      guid,
      number: data.doc_number,
      date: data.doc_date,
      supplier: data.supplier,
      items: data.items || [],
    };

    await insertOrder(order);

    res.status(200).json({
      status: "ok",
      guid,
      message: "Order successfully registered",
    });
  } catch (err) {
    console.error("Error processing order:", err);
    res.status(500).json({
      status: "error",
      message: err.message,
    });
  }
});


// Получение заказа по guid
router.get("/api/orders/:guid", async (req, res) => {
  try {
    const { guid } = req.params;
    const order = await getOrderByGuid(guid);
    if (!order || order.length === 0)
      return res.status(404).json({ error: "Order not found" });
    res.status(200).json({ guid, items: order });
  } catch (err) {
    console.error("Ошибка при получении заказа:", err);
    res.status(500).json({ error: err.message });
  }
});

// Обновление заказа по guid
router.post("/api/orders/:guid/save", async (req, res) => {
  try {
    const { guid } = req.params;
    const { items } = req.body;
    await updateOrderByGuid(guid, items);
    res.status(200).json({ status: "ok" });
  } catch (err) {
    console.error("Ошибка при обновлении заказа:", err);
    res.status(500).json({ error: err.message });
  }
});

// === FRONT ===

// Отдача формы по GUID, статика
router.get("/form/:guid", (req, res) => {
  res.sendFile(path.join(__dirname, "../public/index.html"));
});

export default router;

Итог

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

Проверено на следующих конфигурациях и релизах:

  • Управление торговлей, редакция 11, релизы 11.5.23.68, 11.5.23.66

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    22757    33    24    

26

SALE! 15%

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17280 14688 руб.

20.12.2024    4891    23    4    

24

WEB-интеграция Программист Руководитель проекта 1С:Предприятие 8 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки. Основные преимущества: 1. Документация API создаётся автоматически. Удобна для программной обработки. 2. Изменить API столь же просто как настроить отчёт. Можно опубликовать существующий вариант отчёта. 3. Отчёты в API поддерживают параметры (Период, ДатаНачала и др.) 4. При создании простых методов не требуется изменять конфигурацию. 5. Поддерживается работа с планами обмена.<br/> 6. Возможно настроить отправку из 1С данных корреспондирующей системе, для случаев когда 1С сама "знает" какие данные нужно отправить. 7. После записи в 1С Ле Мурр может возвращать соответствие полученных идентификаторов созданным в 1С объектам данных.

36000 руб.

27.09.2024    11235    7    6    

12

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разработана для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

12000 руб.

02.02.2021    21419    61    52    

39

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    40424    74    45    

31

WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена по API между конфигурацией 1С:Альфа-Авто 6 и порталом LogicStar. Позволяет работать с несколькими обменами LogicStar разных брендов (CHERY, OMODA, JAECOO, EXEED, TENET) в одной информационной базе в ручном и автоматическом режиме. Поддерживается выгрузка заказ-нарядов, реализаций товаров и товарных остатков.

20400 руб.

13.05.2025    1367    1    0    

4
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user-z99999 77 01.11.25 16:33 Сейчас в теме
Прямое публикация 1С в интернет — небезопасна и малоэффективна. Современные подходы опираются на микросервисы, REST API и безопасные промежуточные сервисы.

Почему публикация 1С в интернет малоэффективна, очень медленно работает?
Для программы 1С небезопасна публикация в интернет, можно ссылки на источник? (какие обнаружены уязвимости 1с)
Для отправки сообщения требуется регистрация/авторизация