Работа с распределённой архитектурой в 1С:Предприятие часто требует передачи данных между серверным и клиентским слоями. Эта задача возникает при разработке веб-сервисов, интеграции с внешними системами или оптимизации производительности толстого клиента. Неправильный выбор метода передачи может привести к задержкам, ошибкам синхронизации или даже утечкам памяти.
В этой статье мы разберём все актуальные способы передачи результатов запросов — от классических механизмов платформы до современных подходов с использованием REST API и WebSocket. Особое внимание уделим нюансам работы с большими объёмами данных, безопасности и типичным ошибкам, которые допускают даже опытные разработчики.
1. Классический обмен через возвращаемые значения (тонкий клиент)
Самый простой способ передачи данных — использование возвращаемых значений серверных функций. Этот метод работает в режимах Тонкий клиент и Веб-клиент, но имеет ограничения по объёму передаваемых данных (обычно до 10-15 МБ в зависимости от версии платформы).
Пример кода для передачи результата запроса:
// На сервере
Функция ПолучитьДанныеПоЗапросу(ПараметрыЗапроса) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000
| Номенклатура.Наименование КАК Наименование,
| СУММА(Документ.Количество) КАК Количество
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Документ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО Документ.Номенклатура = Номенклатура.Ссылка
|ГДЕ
| Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", ПараметрыЗапроса.НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", ПараметрыЗапроса.КонецПериода);
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса.Выгрузить();
КонецФункции
На клиенте результат можно получить так:
Результат = ПолучитьДанныеПоЗапросу(Новый Структура("НачалоПериода, КонецПериода", Дата(2026,01,01), Дата(2026,01,31)));
⚠️ Внимание: При передаче больших таблиц значений (>5000 строк) этот метод может вызывать зависания интерфейса. Для таких случаев лучше использовать пакетную обработку или потоковую передачу.
- ✅ Простота реализации — не требует дополнительных настроек
- ✅ Подходит для небольших объёмов данных
- ❌ Ограничение по размеру передаваемых данных
- ❌ Блокирует интерфейс при обработке больших массивов
2. Использование временных таблиц и DirectConnect
Для работы с большими объёмами данных (десятки тысяч строк) оптимально использовать временные таблицы в сочетании с механизмом DirectConnect. Этот подход минимизирует нагрузку на сеть и память клиента.
Алгоритм работы:
- Сервер создаёт временную таблицу с результатами запроса
- Клиент подключается к серверу через
DirectConnect - Данные считываются порциями (пагинация)
- Временная таблица удаляется после обработки
Пример серверного кода:
Процедура СоздатьВременнуюТаблицу(ПараметрыЗапроса) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Товары.Ссылка КАК Ссылка,
| Товары.Артикул КАК Артикул
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| Товары.ЭтоГруппа = ЛОЖЬ";
Запрос.Выполнить();
// Возвращаем имя временной таблицы клиенту
Возврат "ВТ_Товары";
КонецПроцедуры
⚠️ Внимание: Временные таблицы автоматически удаляются при завершении сеанса, но в случае аварийного отключения могут оставаться в базе. Рекомендуется реализовывать механизм принудительной очистки через УдалитьВременныеТаблицы().
| Метод | Макс. объём данных | Скорость передачи | Сложность реализации |
|---|---|---|---|
| Возвращаемые значения | 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-сервиса
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""");
Как ускорить передачу данных между толстым клиентом и сервером?
Для толстого клиента оптимально:
- Использовать
ПрямоеСоединение = Истинав параметрах информационной базы - Минимизировать количество передаваемых колонок в запросе
- Применять
ИНДЕКСИРОВАТЬ ПОдля ускорения выборки - Отключать ненужные свойства объектов (
ПолучитьОбъект().ПолучитьФорму()сильно тормозит)
Также помогает настройка параметра /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 Тогда
// Альтернативная логика
КонецЕсли;