Данные из 1С в поле веб-формы: от выгрузки файла до HTTP-сервиса и OData
Содержание
Чтобы передать значение из 1С в элемент веб-формы, нужен канал, по которому сайт получит данные: файл выгрузки, HTTP-сервис 1С, стандартный REST-интерфейс OData или промежуточная таблица в другой СУБД. Сама 1С в поле чужой формы ничего не «вписывает» — значение подставляет страница, получив ответ от 1С. Для живого заполнения (ввели ИНН — подтянулось название клиента) почти всегда выбирают HTTP-сервис плюс JavaScript на странице.
Ручная выгрузка годится, когда данные меняются раз в день и реже. Промежуточная база — когда 1С нельзя открывать наружу. Ниже каждый вариант с порядком действий, кодом и ограничениями.
С чего начать: какой способ подходит под задачу
Прежде чем писать код, ответьте на три вопроса:
- 🕒 Как часто меняются данные? Справочник цен раз в неделю и остаток товара по минутам требуют разных решений.
- 🌐 Доступна ли база 1С из интернета? Если сервер 1С только в локальной сети офиса, прямые запросы с сайта не пройдут без публикации и проброса.
- 🔐 Кто видит данные? Публичный прайс и карточка клиента с долгом — разные уровни защиты.
| Способ | Когда выбирать | Задержка данных | Риски |
|---|---|---|---|
| Выгрузка CSV/XML | Редкие обновления, нет программиста | Часы, сутки | Устаревшие данные, ручная работа |
| HTTP-сервис 1С | Нужен ответ «здесь и сейчас», есть доступ к конфигуратору | Секунды | Требует публикации и доработки конфигурации |
| OData (REST) | Нельзя менять конфигурацию, нужен доступ к объектам | Секунды | Открывает объекты целиком, тяжёлые запросы |
| JavaScript на странице | Последний шаг любого онлайн-способа | — | Утечка пароля, если обращаться к 1С из браузера напрямую |
| Промежуточная база | 1С закрыта снаружи, высокая нагрузка на сайт | Минуты | Ещё один сервер и синхронизация |
Выгрузка из 1С в CSV или XML для загрузки на сайт
Самый простой путь: 1С формирует файл, сайт его разбирает и подставляет значения в поля формы (например, в выпадающий список товаров).
Вручную, без программирования
- Откройте нужный список, например справочник номенклатуры.
- В меню
ЕщёвыберитеВывести список…, отметьте нужные колонки. - В открывшемся табличном документе сохраните результат через главное меню:
Файл → Сохранить как, форматxlsx. - Если сайт ждёт CSV, пересохраните файл из Excel или LibreOffice с разделителем
;и кодировкой UTF-8.
Минус очевиден: человек должен делать это руками, а сайт показывает данные на момент последней выгрузки.
Автоматически, кодом
Небольшая процедура в общем модуле или внешней обработке пишет CSV сама. Её можно повесить на регламентное задание.
Процедура ВыгрузитьЦеныВCSV(ИмяФайла) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И НЕ Номенклатура.ЭтоГруппа";
Выборка = Запрос.Выполнить().Выбрать();
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("code;name");
Пока Выборка.Следующий() Цикл
Наименование = СтрЗаменить(Выборка.Наименование, ";", ",");
Запись.ЗаписатьСтроку(СокрЛП(Выборка.Код) + ";" + Наименование);
КонецЦикла;
Запись.Закрыть();
КонецПроцедуры
Точку с запятой внутри наименования заменяем, иначе строка «Болт М8; оцинк.» развалится на две колонки.
Для обмена с сайтом XML удобнее CSV, когда у записи есть вложенные части (товар и его характеристики). В 1С для этого есть объект ЗаписьXML: открываете файл, пишете элементы через ЗаписатьНачалоЭлемента и ЗаписатьКонецЭлемента.
HTTP-сервис 1С: отдаём значение по запросу
HTTP-сервис — объект конфигурации, который принимает обычный HTTP-запрос и возвращает ответ, например JSON. Это самый точный способ: вы сами решаете, какое поле и в каком виде уйдёт наружу.
Создание сервиса в конфигураторе
- В дереве конфигурации откройте ветку
Общие → HTTP-сервисыи добавьте новый сервис. - Задайте корневой URL, например
forms. - Добавьте шаблон URL
/client/{inn}и методGET. - Для метода создайте обработчик — платформа сгенерирует функцию в модуле сервиса.
Если конфигурация типовая и стоит на поддержке, сервис лучше добавить в расширение конфигурации : тогда обновления не затрут доработку.
Код обработчика
Функция КлиентGET(Запрос)
ИНН = Запрос.ПараметрыURL.Получить("inn");
УстановитьПривилегированныйРежим(Истина);
Запрос1С = Новый Запрос;
Запрос1С.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.КПП КАК КПП
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос1С.УстановитьПараметр("ИНН", ИНН);
Выборка = Запрос1С.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
Возврат Новый HTTPСервисОтвет(404);
КонецЕсли;
Данные = Новый Структура;
Данные.Вставить("name", Выборка.Наименование);
Данные.Вставить("kpp", Выборка.КПП);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
Возврат Ответ;
КонецФункции
Сервис отдаёт только два поля, а не весь справочник. Привилегированный режим включён осознанно: сервис сам ограничивает выдачу, поэтому техническому пользователю не нужны права на чтение всех контрагентов.
Публикация на веб-сервере
Сервис заработает только после публикации базы на Apache или IIS:
- В конфигураторе:
Администрирование → Публикация на веб-сервере. - Укажите имя публикации, например
buh, и отметьте HTTP-сервис на вкладке HTTP-сервисов. - Нажмите
Опубликовать. Конфигуратор нужно запускать от имени администратора Windows.
Адрес сервиса складывается так: https://сервер/buh/hs/forms/client/7700000000. Сегмент hs обязателен — без него будет 404.
Публикация через конфигуратор перезапускает веб-сервер. Открытые веб-клиенты и запросы, которые идут через этот же Apache или IIS, оборвутся. Делайте это вне рабочего времени.
REST-интерфейс OData: доступ без доработки конфигурации
Платформа 8.3 умеет отдавать объекты базы по протоколу OData — это REST с адресами вида /odata/standard.odata/Catalog_Контрагенты. Код писать не нужно, но объекты придётся «включить» в состав интерфейса.
Порядок настройки
- При публикации базы отметьте флажок
Публиковать стандартный интерфейс OData. - Укажите, какие объекты доступны. В типовых конфигурациях на БСП это делается в разделе
Администрирование → Синхронизация данныхпо ссылке настройки стандартного интерфейса OData. Там же создаётся пользователь для доступа. - Проверьте запрос в браузере или Postman:
GET https://сервер/buh/odata/standard.odata/Catalog_Контрагенты?$format=json&$filter=ИНН eq '7700000000'&$select=Description,КПП
Description — это наименование справочника, $select ограничивает набор полей. Без $select вернётся вся запись со всеми реквизитами и ссылками.
Когда OData не подходит
- 🐢 Сложная выборка из нескольких регистров. Через OData её придётся склеивать на стороне сайта несколькими запросами.
- 🔓 Нужно скрыть часть реквизитов. Это решается только тонкой настройкой роли по полям объекта; забудете одно поле — пользователь OData увидит его в ответе.
- 📈 Высокая нагрузка. Каждый запрос формы — обращение к рабочему серверу 1С.
В этих случаях выгоднее один узкий HTTP-сервис из предыдущего раздела.
JavaScript на сайте: подставляем значение в поле формы
Это последнее звено любого «живого» способа. Страница отправляет запрос, получает JSON и записывает значение в элемент формы.
Почему не напрямую из браузера в 1С
Если вызвать HTTP-сервис 1С прямо из браузера, придётся положить логин и пароль пользователя 1С в код страницы. Их увидит любой посетитель через инструменты разработчика. Вторая проблема — CORS: браузер заблокирует ответ с другого домена, пока сервер не вернёт заголовок Access-Control-Allow-Origin.
Правильная схема — прокси на сервере сайта:
- Браузер обращается к адресу своего сайта, например
/api/client?inn=…. - Серверный скрипт сайта (PHP, Node.js, Python) вызывает 1С с логином и паролем, которые хранятся на сервере.
- Скрипт возвращает браузеру только нужные поля.
Код на странице
<input id="inn" name="inn" placeholder="ИНН">
<input id="company" name="company" placeholder="Наименование">
<input id="kpp" name="kpp" placeholder="КПП">
<script>
document.getElementById('inn').addEventListener('change', async (e) => {
const inn = e.target.value.trim();
if (!/^\d{10}(\d{2})?$/.test(inn)) return;
const resp = await fetch('/api/client?inn=' + encodeURIComponent(inn));
if (!resp.ok) return;
const data = await resp.json();
const company = document.getElementById('company');
company.value = data.name;
company.dispatchEvent(new Event('input', { bubbles: true }));
document.getElementById('kpp').value = data.kpp || '';
});
</script>
Строка с dispatchEvent нужна, если форма собрана на React или Vue. Такие фреймворки не замечают значение, записанное в value напрямую, и при отправке уйдёт пустое поле.
Проверка ИНН на 10 или 12 цифр отсекает лишние запросы к 1С, пока пользователь ещё печатает.
Промежуточная база: 1С пишет, сайт читает
Когда сервер 1С закрыт от интернета или сайт получает тысячи обращений в час, 1С не должна отвечать каждому посетителю. Вместо этого она периодически складывает данные в отдельную таблицу, например в PostgreSQL или MySQL на сервере сайта.
Как устроить обмен
- Создайте на стороне сайта таблицу под нужные поля:
inn,name,kpp,updated_at. - В 1С напишите процедуру, которая выбирает изменённые записи и отправляет их в эту таблицу.
- Повесьте процедуру на регламентное задание с интервалом, например, 10 минут.
- Форма на сайте читает только свою таблицу и от 1С не зависит.
Для отправки данных проще всего тот же HTTP: 1С сама вызывает метод сайта через HTTPСоединение и передаёт пакет JSON методом POST. Прямое подключение к чужой СУБД через COM-объект ADODB.Connection тоже работает, но только на сервере 1С под Windows и требует установленного драйвера ODBC.
Отправляйте не весь справочник, а только изменения. Для этого в типовых конфигурациях используют планы обмена: они запоминают, какие объекты изменились с прошлой выгрузки.
Как не потерять данные
- ✅ В таблице сайта храните
updated_atи проверяйте, когда пришёл последний пакет. Если больше часа назад — обмен встал. - ✅ Ключом записи делайте уникальный идентификатор объекта 1С:
Строка(Ссылка.УникальныйИдентификатор()). Наименование и даже код могут поменяться. - ✅ Пишите в журнал регистрации ошибки отправки, иначе сбой регламентного задания пройдёт незаметно.
На чём ломается передача данных из 1С в форму
Список ниже — то, что встречается при запуске и не видно по шагам выше.
- ❌
Тип не может быть сериализованпри вызовеЗаписатьJSON. В структуру положили ссылку на справочник или перечисление. Перед записью превращайте их в строку или идентификатор. - ❌ Числа с пробелами.
Строка(1500000)даёт «1 500 000» с неразрывными пробелами, и JavaScript не разберёт это как число. ИспользуйтеФормат(Сумма, "ЧГ=0; ЧРД=.")или передавайте число в JSON как число. - ❌ 401 Unauthorized. У пользователя 1С нет пароля или не включена аутентификация 1С:Предприятия в его карточке. Проверьте вход этим пользователем в обычном клиенте.
- ❌ 404 при правильном коде. Сервис не отмечен в публикации или в адресе нет
/hs/. После добавления нового сервиса публикацию нужно обновить. - ❌ Кракозябры в поле. Сайт ждёт UTF-8, а файл выгрузки сохранён в Windows-1251, или в CSV-файле лишний маркер BOM в начале, который парсер читает как часть первого заголовка.
- ❌ Форма ждёт по 5–10 секунд. Запрос к 1С выполняется на каждое нажатие клавиши или выбирает весь справочник. Повесьте запрос на событие
change, а в 1С выбирайте только нужные поля по индексированному реквизиту.
Частые вопросы
Можно ли передать значение из 1С в форму сайта без программиста?
Работает ли HTTP-сервис в файловой базе?
Чем OData отличается от HTTP-сервиса?
Нужна ли отдельная лицензия 1С для обращений с сайта?
Как передать значение в элемент формы внутри самой 1С?
Объект.Комментарий = "текст" в модуле формы. Элемент покажет новое значение сам.