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

В этой статье мы разберём все актуальные способы передачи результатов запросов — от классических механизмов платформы до современных подходов с использованием REST API и WebSocket. Особое внимание уделим нюансам работы с большими объёмами данных, безопасности и типичным ошибкам, которые допускают даже опытные разработчики.

1. Классический обмен через возвращаемые значения (тонкий клиент)

Самый простой способ передачи данных — использование возвращаемых значений серверных функций. Этот метод работает в режимах Тонкий клиент и Веб-клиент, но имеет ограничения по объёму передаваемых данных (обычно до 10-15 МБ в зависимости от версии платформы).

Пример кода для передачи результата запроса:

// На сервере

Функция ПолучитьДанныеПоЗапросу(ПараметрыЗапроса) Экспорт

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000

| Номенклатура.Наименование КАК Наименование,

| СУММА(Документ.Количество) КАК Количество

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Документ

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

| ПО Документ.Номенклатура = Номенклатура.Ссылка

|ГДЕ

| Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Запрос.УстановитьПараметр("НачалоПериода", ПараметрыЗапроса.НачалоПериода);

Запрос.УстановитьПараметр("КонецПериода", ПараметрыЗапроса.КонецПериода);

РезультатЗапроса = Запрос.Выполнить();

Возврат РезультатЗапроса.Выгрузить();

КонецФункции

На клиенте результат можно получить так:

Результат = ПолучитьДанныеПоЗапросу(Новый Структура("НачалоПериода, КонецПериода", Дата(2026,01,01), Дата(2026,01,31)));
⚠️ Внимание: При передаче больших таблиц значений (>5000 строк) этот метод может вызывать зависания интерфейса. Для таких случаев лучше использовать пакетную обработку или потоковую передачу.
  • ✅ Простота реализации — не требует дополнительных настроек
  • ✅ Подходит для небольших объёмов данных
  • ❌ Ограничение по размеру передаваемых данных
  • ❌ Блокирует интерфейс при обработке больших массивов
📊 Какой режим клиента вы используете чаще?
Тонкий клиент
Толстый клиент
Веб-клиент
Мобильное приложение

2. Использование временных таблиц и DirectConnect

Для работы с большими объёмами данных (десятки тысяч строк) оптимально использовать временные таблицы в сочетании с механизмом DirectConnect. Этот подход минимизирует нагрузку на сеть и память клиента.

Алгоритм работы:

  1. Сервер создаёт временную таблицу с результатами запроса
  2. Клиент подключается к серверу через DirectConnect
  3. Данные считываются порциями (пагинация)
  4. Временная таблица удаляется после обработки

Пример серверного кода:

Процедура СоздатьВременнуюТаблицу(ПараметрыЗапроса) Экспорт

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ

| Товары.Ссылка КАК Ссылка,

| Товары.Артикул КАК Артикул

|ПОМЕСТИТЬ ВТ_Товары

|ИЗ

| Справочник.Номенклатура КАК Товары

|ГДЕ

| Товары.ЭтоГруппа = ЛОЖЬ";

Запрос.Выполнить();

// Возвращаем имя временной таблицы клиенту

Возврат "ВТ_Товары";

КонецПроцедуры

⚠️ Внимание: Временные таблицы автоматически удаляются при завершении сеанса, но в случае аварийного отключения могут оставаться в базе. Рекомендуется реализовывать механизм принудительной очистки через УдалитьВременныеТаблицы().
Метод Макс. объём данных Скорость передачи Сложность реализации
Возвращаемые значения 10-15 МБ Средняя Низкая
Временные таблицы Не ограничено Высокая Средняя
HTTP-сервисы 100+ МБ Низкая Высокая
WebSocket Не ограничено Очень высокая Очень высокая

3. HTTP-сервисы для внешних интеграций

Когда требуется передать данные внешней системе (например, мобильному приложению или другому сервису), оптимально использовать HTTP-сервисы. Этот метод позволяет обмениваться данными в форматах JSON или XML.

Пример создания HTTP-сервиса:

// В модуле управляемого приложения

Процедура ОбработкаЗапроса(Запрос, Ответ) Экспорт

// Получаем параметры из URL или тела запроса

Параметры = JSON.Прочитать(Запрос.ПолучитьТекстПотока());

// Формируем запрос к базе

Результат = ПолучитьДанныеИзБазы(Параметры);

// Преобразуем в JSON

Ответ.УстановитьТекст(JSON.Записать(Результат));

Ответ.УстановитьЗаголовок("Content-Type", "application/json");

КонецПроцедуры

Для работы с большими данными рекомендуется использовать постраничную выдачу:

// Клиентский запрос с пагинацией

Ответ = HTTPСоединение.Получить("/api/data?page=1&limit=100");

  • 🌍 Подходит для кросс-платформенной интеграции
  • 🔒 Требует настройки аутентификации (OAuth, JWT)
  • ⚡ Может быть медленнее DirectConnect при больших объёмах
  • 📦 Поддерживает сжатие данных (gzip)

☑️ Настройка HTTP-сервиса

Выполнено: 0 / 4

4. WebSocket для передачи данных в реальном времени

Для систем, требующих мгновенной синхронизации (например, дашборды, чаты или мониторинговые панели), оптимально использовать протокол WebSocket. В отличие от HTTP, он обеспечивает полнодуплексную связь без постоянных повторных подключений.

Пример реализации на стороне 1С:

// Серверная часть (упрощённо)

Процедура ПриПодключенииWebSocket(Соединение, Параметры) Экспорт

// Регистрируем новое соединение

Соединения.Добавить(Соединение);

// Отправляем приветственное сообщение

Соединение.Отправить(JSON.Записать(Новый Структура("Тип, Данные", "Приветствие", "Соединение установлено")));

КонецПроцедуры

Процедура ОбработатьСообщение(Соединение, ТекстСообщения) Экспорт

Данные = JSON.Прочитать(ТекстСообщения);

Если Данные.Тип = "ЗапросДанных" Тогда

Результат = ПолучитьАктуальныеДанные(Данные.Параметры);

Соединение.Отправить(JSON.Записать(Новый Структура("Тип, Данные", "Ответ", Результат)));

КонецЕсли;

КонецПроцедуры

⚠️ Внимание: WebSocket-соединения потребляют серверные ресурсы даже в режиме ожидания. Для производственных систем необходимо реализовывать механизм автоматического разрыва неактивных соединений (например, через 30 минут бездействия).
Как тестировать WebSocket в 1С?

Для тестирования можно использовать инструменты вроде Postman (с поддержкой WebSocket) или написать простой HTML/JavaScript клиент. В 1С:Предприятии 8.3.20+ появилась встроенная поддержка WebSocket через объект HTTPСервисWebSocket.

5. Оптимизация передачи больших данных

При работе с массивами данных объёмом >100 000 строк стандартные методы становятся неэффективными. В таких случаях применяют:

  • 📊 Потоковая передача — данные отправляются пакетами по 1000-5000 строк
  • 🗜️ Сжатие — использование GZip или Deflate для текстовых данных (JSON/XML)
  • 🗃️ Кэширование — сохранение часто запрашиваемых данных в Redis или файловом хранилище
  • 🔄 Дельта-синхронизация — передача только изменённых записей

Пример потоковой передачи через HTTP:

Процедура ОтправитьДанныеПотоком(Запрос, Ответ) Экспорт

ЗапросДанных = Новый Запрос;

ЗапросДанных.Текст = "ВЫБРАТЬ ...…"; // Ваш большой запрос

Результат = ЗапросДанных.Выполнить();

Выборка = Результат.Выбрать();

// Устанавливаем заголовки для потоковой передачи

Ответ.УстановитьЗаголовок("Content-Type", "application/json");

Ответ.УстановитьЗаголовок("Transfer-Encoding", "chunked");

// Отправляем данные пакетами

Пакет = Новый Массив();

Счётчик = 0;

Пока Выборка.Следующий() Цикл

Пакет.Добавить(Выборка.ПолучитьЭлементы());

Счётчик = Счётчик + 1;

Если Счётчик >= 1000 Тогда

Ответ.ЗаписатьТекст(JSON.Записать(Пакет) + "\n");

Пакет.Очистить();

Счётчик = 0;

КонецЕсли;

КонецЦикла;

// Отправляем остаток

Если Пакет.Количество() > 0 Тогда

Ответ.ЗаписатьТекст(JSON.Записать(Пакет));

КонецЕсли;

КонецПроцедуры

💡

Для ускорения обработки больших выборок используйте метод ВыгрузитьКолонку() вместо ПолучитьЭлементы() — это уменьшает накладные расходы на создание объектов в памяти.

6. Типичные ошибки и их решения

Даже опытные разработчики сталкиваются с проблемами при передаче данных между слоями. Вот наиболее распространённые ошибки:

Ошибка Причина Решение
Таймаут при передаче Слишком большой объём данных или медленное соединение Использовать пагинацию или сжатие
Ошибка сериализации В данных содержатся несериализуемые объекты (например, ДвоичныеДанные) Преобразовывать в Base64 или передавать ссылки
Утечка памяти Не освобождаются временные таблицы или потоки Явно вызывать Закрыть() и Удалить()
Разрыв соединения Длительная обработка на сервере Использовать асинхронные вызовы или фоновые задания

Особое внимание стоит уделить безопасности:

  • 🔐 Всегда проверяйте права доступа при передаче данных
  • 🛡️ Используйте HTTPS для HTTP-сервисов
  • 🔍 Валидируйте входные параметры на сервере
  • 🗑️ Очищайте временные данные после использования
💡

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

FAQ: Частые вопросы по передаче данных в 1С

Можно ли передавать двоичные данные (картинки, файлы) через возвращаемые значения?

Технически можно, но не рекомендуется для файлов >1 МБ. Лучше использовать:

  • Хранение файлов в базе с передачей ссылки
  • HTTP-сервис с потоковой отдачей файла
  • Внешнее файловое хранилище (S3, FTP)

Пример передачи файла через HTTP:

Ответ.УстановитьТекст(ДвоичныеДанные.ПолучитьПоток());

Ответ.УстановитьЗаголовок("Content-Type", "application/octet-stream");

Ответ.УстановитьЗаголовок("Content-Disposition", "attachment; filename=""file.pdf""");

Как ускорить передачу данных между толстым клиентом и сервером?

Для толстого клиента оптимально:

  1. Использовать ПрямоеСоединение = Истина в параметрах информационной базы
  2. Минимизировать количество передаваемых колонок в запросе
  3. Применять ИНДЕКСИРОВАТЬ ПО для ускорения выборки
  4. Отключать ненужные свойства объектов (ПолучитьОбъект().ПолучитьФорму() сильно тормозит)

Также помогает настройка параметра /UC:УправляемоеПриложениеПолное = 1 в командной строке запуска.

Какие форматы данных лучше использовать для HTTP-сервисов?

Сравнение форматов:

ФорматПлюсыМинусыКогда использовать
JSONЛёгкий, поддерживается вездеМедленнее XML при больших объёмахМобильные приложения, веб
XMLСтрогая структура, поддержка XSDИзбыточный синтаксисБанковские системы, гос. интеграции
Protocol BuffersОчень компактный, быстрыйСложнее в реализацииВысоконагруженные системы
CSVПростота, совместимостьНет вложенных структурЭкспорт/импорт табличных данных

Для 1С проще всего реализовать JSON с использованием встроенного парсера:

Данные = JSON.Прочитать(СтрокаJSON);

СтрокаJSON = JSON.Записать(Данные1С);

Как обрабатывать ошибки при передаче данных?

Рекомендуемая схема обработки:

Попытка

Результат = СерверныйМетод(Параметры);

Исключение

Если ТипЗнч(ИнформацияОбОшибке()) = Тип("ОписаниеОшибки") Тогда

ЗаписатьВЛог(ИнформацияОбОшибке().Описание);

// Попытка повторного подключения

Если ИнформацияОбОшибке().Код = ?(..., "Таймаут", ...) Тогда

ПовторитьЧерез(5);

КонецЕсли;

// Альтернативная логика

Результат = ПолучитьДанныеИзКэша();

Иначе

ВызватьИсключение;

КонецЕсли;

КонецПопытки;

Для HTTP-сервисов обязательно возвращайте корректные HTTP-коды:

  • 200 OK — успех
  • 400 Bad Request — неверные параметры
  • 401 Unauthorized — ошибка аутентификации
  • 404 Not Found — ресурс не найден
  • 500 Internal Error — ошибка сервера
Можно ли использовать WebSocket в облачной версии 1С?

В 1С:Fresh и других облачных решениях есть ограничения:

  • ✅ WebSocket поддерживается в тарифах "ПРОФ" и выше
  • ❌ В базовом тарифе доступны только HTTP-сервисы
  • ⚠️ Требуется дополнительная настройка брандмауэра
  • 🔧 Максимальное время соединения — 24 часа

Для проверки доступности используйте:

Если Не ЗначениеЗаполнено(ГлобальныйКонтекст.HTTPСервисы) Или

Не ГлобальныйКонтекст.HTTPСервисы.ПоддерживаютсяWebSocket Тогда

// Альтернативная логика

КонецЕсли;