← Назад к вопросам
Как организовать обмен данными между 1С и другими системами?
2.0 Middle🔥 231 комментариев
#Интеграции и обмены
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Обмен данными между 1С и другими системами
Интеграция 1С с внешними системами — это критически важная задача для большинства предприятий. Существует несколько подходов и технологий.
1. Встроенные механизмы 1С
ОМеXmlОбъект
// Использование встроенного тип для работы с XML
Данные = Новый ОМеXmlОбъект();
Данные.ЭлементОбхват("Товары");
Данные.Элемент("Товар").Атрибут("ID", "123").Элемент("Имя").Текст("Товар 1");
// Преобразование в строку
ХMLСтрока = ОМеXmlОбъект.ВХМл();
Встроенные форматы
- XML — для комплексных структур
- JSON — современный формат для API
- CSV — для простых таблиц
- BASE64 — для бинарных данных
2. Web-сервисы (REST и SOAP)
REST API
Это наиболее популярный подход для интеграции.
// Отправка данных через HTTP
&НаСервере
Процедура ОтправитьДанныеВСистему(ДанныеДляОтправки)
// Подготовка URL
URLАдрес = "https://external-system.com/api/v1/orders";
// Подготовка JSON
JSONДанные = Новый ЗаписьJSON();
JSONДанные.УстановитьСтроку();
Записатель = Новый ЗаписьJSON();
Записатель.ЗаписатьОбъект(ДанныеДляОтправки);
JSONСтрока = Записатель.ПолучитьСтроку();
// Отправка HTTP POST
HTTPЗапрос = Новый HTTPЗапрос(URLАдрес, , "Content-Type: application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(JSONСтрока);
HTTPСоединение = Новый HTTPСоединение("external-system.com", , , , , 30);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ЗаписьЖурнала("Интеграция", ТипСобытияЖурналаРегистрации.Информация, , ,
"Данные успешно отправлены в систему");
Иначе
ВызватьИсключение("Ошибка при отправке данных: " + HTTPОтвет.КодСостояния);
КонецЕсли;
КонецПроцедуры
// Получение данных из внешней системы
&НаСервере
Функция ПолучитьДанныеИзСистемы(ИД) Экспорт
URLАдрес = "https://external-system.com/api/v1/orders/" + ИД;
HTTPЗапрос = Новый HTTPЗапрос(URLАдрес);
HTTPСоединение = Новый HTTPСоединение("external-system.com", , , , , 30);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
ДанныеОтвета = ЧтениеJSON.ПрочитатьОбъект();
Возврат ДанныеОтвета;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
OAuth2 Аутентификация
&НаСервере
Процедура ПолучитьТокенАутентификации()
URLТокен = "https://external-system.com/oauth/token";
ТелоЗапроса = Новый ЗаписьJSON();
ТелоЗапроса.УстановитьСтроку();
Записатель = Новый ЗаписьJSON();
СтруктураДанных = Новый Структура();
СтруктураДанных.Вставить("client_id", "YOUR_CLIENT_ID");
СтруктураДанных.Вставить("client_secret", "YOUR_CLIENT_SECRET");
СтруктураДанных.Вставить("grant_type", "client_credentials");
Записатель.ЗаписатьОбъект(СтруктураДанных);
HTTPЗапрос = Новый HTTPЗапрос(URLТокен, , "Content-Type: application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(Записатель.ПолучитьСтроку());
HTTPСоединение = Новый HTTPСоединение("external-system.com");
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());
ДанныеОтвета = ЧтениеJSON.ПрочитатьОбъект();
Токен = ДанныеОтвета["access_token"];
Возврат Токен;
КонецПроцедуры
3. Файловые обмены
Импорт из Excel/CSV
&НаСервере
Процедура ИмпортДанныхИзЭксель(ПутьКФайлу)
ТаблицаДанных = Новая ТаблицаЗначений();
ТаблицаДанных.Колонки.Добавить("Артикул");
ТаблицаДанных.Колонки.Добавить("Наименование");
ТаблицаДанных.Колонки.Добавить("Цена");
ТаблицаДанных.Колонки.Добавить("Остаток");
ОбработкаЭкселя = Новый СчитыватьЭкселевыйДокумент();
ОбработкаЭкселя.ПрочитатьФайл(ПутьКФайлу, 0);
ДиапазонДанных = ОбработкаЭкселя.ПолучитьОбласть("A1:D");
Для СтрокаДанных = 0 По ДиапазонДанных.Строк - 1 Цикл
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Артикул = ДиапазонДанных[СтрокаДанных][0];
НоваяСтрока.Наименование = ДиапазонДанных[СтрокаДанных][1];
НоваяСтрока.Цена = ДиапазонДанных[СтрокаДанных][2];
НоваяСтрока.Остаток = ДиапазонДанных[СтрокаДанных][3];
КонецЦикла;
// Обработка полученных данных
ОбработатьИмпортированныеДанные(ТаблицаДанных);
КонецПроцедуры
&НаСервере
Процедура ЭкспортДанныхВФайл()
ТаблицаДанных = Новая ТаблицаЗначений();
// Получение данных из БД
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ Наименование, Цена, Остаток ИЗ Справочник.Товары";
ТаблицаДанных = Запрос.Выполнить().Выгрузить();
// Запись в CSV
ФайлCSV = Новый Файл();
ФайлCSV.ПолучитьПредставлениеБезРасширения() = "Товары";
Запись = Новый ЗаписьCSV();
Запись.Открыть("/tmp/Товары.csv", КодировкаСтрок.UTF8);
Запись.ЗаписатьИменаКолонок(ТаблицаДанных);
Для каждого Строка Из ТаблицаДанных Цикл
Запись.ЗаписатьНовуюСтроку();
Запись.ЗаписатьПоле(Строка.Наименование);
Запись.ЗаписатьПоле(Строка.Цена);
Запись.ЗаписатьПоле(Строка.Остаток);
КонецЦикла;
Запись.Закрыть();
КонецПроцедуры
4. Базы данных
ODBCСоединение
&НаСервере
Процедура ПолучитьДанныеИзОДБЦ()
СтрокаСоединения = "Driver={MySQL ODBC 8.0 ANSI Driver};Server=localhost;Database=external_db;";
ОДБЦСоединение = Новый ОДБЦСоединение(СтрокаСоединения);
Если ОДБЦСоединение.Подключено() Тогда
Запрос = Новый ОДБЦЗапрос("SELECT * FROM Orders WHERE Status = Pending");
Результат = ОДБЦСоединение.ВыполнитьЗапрос(Запрос);
Пока Результат.Следующий() Цикл
ИдЗаказа = Результат["OrderID"];
СуммаЗаказа = Результат["Amount"];
// Обработка данных
КонецЦикла;
КонецЕсли;
КонецПроцедуры
5. Очереди сообщений
RabbitMQ / Kafka интеграция
&НаСервере
Процедура ОтправитьСообщениеВОчередь(Сообщение)
// Для RabbitMQ используется HTTP API
URLАмк = "https://rabbitmq-server:15672/api/exchanges/vhost/my-exchange/publish";
СтруктураСообщения = Новый Структура();
СтруктураСообщения.Вставить("properties", Новый Структура());
СтруктураСообщения.Вставить("routing_key", "orders");
СтруктураСообщения.Вставить("payload", Сообщение);
СтруктураСообщения.Вставить("payload_encoding", "string");
JSONЗаписатель = Новый ЗаписьJSON();
JSONЗаписатель.УстановитьСтроку();
Записатель = Новый ЗаписьJSON();
Записатель.ЗаписатьОбъект(СтруктураСообщения);
HTTPЗапрос = Новый HTTPЗапрос(URLАмк, , "Content-Type: application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(Записатель.ПолучитьСтроку());
HTTPЗапрос.УстановитьЗагловок("Authorization", "Basic " + КодировкаBase64("user:password"));
HTTPСоединение = Новый HTTPСоединение("rabbitmq-server", 15672, , , , 30);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
КонецПроцедуры
6. Лучшие практики интеграции
Обработка ошибок:
&НаСервере
Процедура ЗащитаОтОшибок()
Попытка
// Код интеграции
Исключение
// Логирование ошибки
ЗаписьЖурнала("ОшибкаИнтеграции", ТипСобытияЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
// Повторная попытка
Для Попытка = 1 По 3 Цикл
ОжиданиеВСекундах = Мощность(2, Попытка); // Экспоненциальная задержка
Пауза(ОжиданиеВСекундах);
Если ПовторитьОперацию() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПопытки;
КонецПроцедуры
Асинхронная обработка:
&НаСервере
Процедура ОтправитьАсинхронно(Данные)
// Используем фоновые работы для долгих операций
ФоноваяРабота = Новая ФоноваяРабота();
ФоноваяРабота.Описание = "Отправка данных в систему";
ФоноваяРабота.ИмяМетода = "МодульОбработки.ОтправитьДанные";
ФоноваяРабота.ПараметрыМетода = Новый Массив();
ФоноваяРабота.ПараметрыМетода.Добавить(Данные);
ФоноваяРабота.Выполнить();
КонецПроцедуры
Выбор подхода
| Подход | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| REST API | Интеграция с облачными системами | Просто, современно | Синхронно |
| Файлы | Периодические загрузки | Надежно | Медленно |
| ODBC | Доступ к другим БД | Прямой доступ | Безопасность |
| Очереди | Высоконагруженные системы | Асинхронно | Сложнее |
| SOAP | Корпоративные интеграции | Надежно | Тяжело |
Вывод
Выбор подхода зависит от сложности данных, частоты обмена, требований к надежности и наличия документированного API у партнёра.