Данные из 1С в поле веб-формы: от выгрузки файла до HTTP-сервиса и OData

· 9 мин

Содержание

Чтобы передать значение из 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С формирует файл, сайт его разбирает и подставляет значения в поля формы (например, в выпадающий список товаров).

Вручную, без программирования

  1. Откройте нужный список, например справочник номенклатуры.
  2. В меню Ещё выберите Вывести список…, отметьте нужные колонки.
  3. В открывшемся табличном документе сохраните результат через главное меню: Файл → Сохранить как, формат xlsx.
  4. Если сайт ждёт CSV, пересохраните файл из Excel или LibreOffice с разделителем ; и кодировкой UTF-8.

Минус очевиден: человек должен делать это руками, а сайт показывает данные на момент последней выгрузки.

Автоматически, кодом

Небольшая процедура в общем модуле или внешней обработке пишет CSV сама. Её можно повесить на регламентное задание.

Процедура ВыгрузитьЦеныВCSV(ИмяФайла) Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   Номенклатура.Код КАК Код,
    |   Номенклатура.Наименование КАК Наименование
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   НЕ Номенклатура.ПометкаУдаления
    |   И НЕ Номенклатура.ЭтоГруппа";

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

    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку("code;name");

    Пока Выборка.Следующий() Цикл
        Наименование = СтрЗаменить(Выборка.Наименование, ";", ",");
        Запись.ЗаписатьСтроку(СокрЛП(Выборка.Код) + ";" + Наименование);
    КонецЦикла;

    Запись.Закрыть();

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

Точку с запятой внутри наименования заменяем, иначе строка «Болт М8; оцинк.» развалится на две колонки.

Для обмена с сайтом XML удобнее CSV, когда у записи есть вложенные части (товар и его характеристики). В 1С для этого есть объект ЗаписьXML: открываете файл, пишете элементы через ЗаписатьНачалоЭлемента и ЗаписатьКонецЭлемента.

HTTP-сервис 1С: отдаём значение по запросу

HTTP-сервис — объект конфигурации, который принимает обычный HTTP-запрос и возвращает ответ, например JSON. Это самый точный способ: вы сами решаете, какое поле и в каком виде уйдёт наружу.

Создание сервиса в конфигураторе

  1. В дереве конфигурации откройте ветку Общие → HTTP-сервисы и добавьте новый сервис.
  2. Задайте корневой URL, например forms.
  3. Добавьте шаблон URL /client/{inn} и метод GET.
  4. Для метода создайте обработчик — платформа сгенерирует функцию в модуле сервиса.

Если конфигурация типовая и стоит на поддержке, сервис лучше добавить в расширение конфигурации : тогда обновления не затрут доработку.

Код обработчика

Функция Клиент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:

  1. В конфигураторе: Администрирование → Публикация на веб-сервере.
  2. Укажите имя публикации, например buh, и отметьте HTTP-сервис на вкладке HTTP-сервисов.
  3. Нажмите Опубликовать. Конфигуратор нужно запускать от имени администратора Windows.

Адрес сервиса складывается так: https://сервер/buh/hs/forms/client/7700000000. Сегмент hs обязателен — без него будет 404.

Публикация через конфигуратор перезапускает веб-сервер. Открытые веб-клиенты и запросы, которые идут через этот же Apache или IIS, оборвутся. Делайте это вне рабочего времени.

REST-интерфейс OData: доступ без доработки конфигурации

Платформа 8.3 умеет отдавать объекты базы по протоколу OData — это REST с адресами вида /odata/standard.odata/Catalog_Контрагенты. Код писать не нужно, но объекты придётся «включить» в состав интерфейса.

Порядок настройки

  1. При публикации базы отметьте флажок Публиковать стандартный интерфейс OData.
  2. Укажите, какие объекты доступны. В типовых конфигурациях на БСП это делается в разделе Администрирование → Синхронизация данных по ссылке настройки стандартного интерфейса OData. Там же создаётся пользователь для доступа.
  3. Проверьте запрос в браузере или 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.

Правильная схема — прокси на сервере сайта:

  1. Браузер обращается к адресу своего сайта, например /api/client?inn=….
  2. Серверный скрипт сайта (PHP, Node.js, Python) вызывает 1С с логином и паролем, которые хранятся на сервере.
  3. Скрипт возвращает браузеру только нужные поля.

Код на странице

<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 на сервере сайта.

Как устроить обмен

  1. Создайте на стороне сайта таблицу под нужные поля: inn, name, kpp, updated_at.
  2. В 1С напишите процедуру, которая выбирает изменённые записи и отправляет их в эту таблицу.
  3. Повесьте процедуру на регламентное задание с интервалом, например, 10 минут.
  4. Форма на сайте читает только свою таблицу и от 1С не зависит.

Для отправки данных проще всего тот же HTTP: 1С сама вызывает метод сайта через HTTPСоединение и передаёт пакет JSON методом POST. Прямое подключение к чужой СУБД через COM-объект ADODB.Connection тоже работает, но только на сервере 1С под Windows и требует установленного драйвера ODBC.

Отправляйте не весь справочник, а только изменения. Для этого в типовых конфигурациях используют планы обмена: они запоминают, какие объекты изменились с прошлой выгрузки.

Как не потерять данные

  • ✅ В таблице сайта храните updated_at и проверяйте, когда пришёл последний пакет. Если больше часа назад — обмен встал.
  • ✅ Ключом записи делайте уникальный идентификатор объекта 1С: Строка(Ссылка.УникальныйИдентификатор()). Наименование и даже код могут поменяться.
  • ✅ Пишите в журнал регистрации ошибки отправки, иначе сбой регламентного задания пройдёт незаметно.
Перед запуском обмена в рабочей базе
Выполнено: 0 / 5

На чём ломается передача данных из 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-сервис в файловой базе?
Да. Файловую базу тоже можно опубликовать на веб-сервере, и HTTP-сервисы будут отвечать. Для нагрузки сайта больше нескольких пользователей лучше клиент-серверный вариант.
Чем OData отличается от HTTP-сервиса?
OData отдаёт объекты базы целиком по готовым адресам без кода. HTTP-сервис вы пишете сами и возвращаете ровно те поля и в том формате, который нужен форме.
Нужна ли отдельная лицензия 1С для обращений с сайта?
Каждое обращение открывает сеанс в базе, поэтому вопрос лицензий надо проверить заранее под вашу схему лицензирования. Промежуточная база снимает вопрос: 1С подключается к сайту одним сеансом регламентного задания.
Как передать значение в элемент формы внутри самой 1С?
В управляемой форме значение присваивают не элементу, а реквизиту, к которому он привязан: Объект.Комментарий = "текст" в модуле формы. Элемент покажет новое значение сам.