При разработке веб-интерфейсов, которые должны взаимодействовать с данными 1С напрямую, программисты часто сталкиваются с проблемой безопасности и авторизации. Типичная ситуация: вы пишете fetch запрос на JavaScript, передаете корректные логин и пароль, но браузер возвращает ошибку 401 Unauthorized или блокирует запрос из-за политики CORS. Разберем подробно, как правильно настроить обе стороны — и ваш JavaScript-код, и публикацию 1С на веб-сервере.
Рассмотрим исходный вариант кода, который часто приводит к неудаче. Основная проблема здесь заключается в использовании режима mode: 'no-cors'. Многие разработчики включают его, чтобы «заглушить» ошибки кросс-доменных запросов, но это лишает запрос возможности передавать заголовки авторизации.
Выясним причину: режим no-cors превращает запрос в «непрозрачный» (opaque), при котором браузер намеренно ограничивает доступ к заголовкам, включая Authorization. В итоге 1С получает пустой запрос без учетных данных и закономерно возвращает 401 ошибку.
Проанализируем исправленный вариант функции для отправки данных:
async function sendData(url, login, password) {
const data = JSON.stringify({ login: login, password: password });
// Формируем строку Basic авторизации
// Внимание: btoa работает корректно только с латиницей!
const authHeader = 'Basic ' + btoa(login + ':' + password);
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': authHeader
},
body: data,
// credentials: 'omit' или 'include' в зависимости от настроек CORS
credentials: 'omit'
});
if (!response.ok) {
throw new Error('Ошибка сервера: ' + response.status);
}
return await response.json();
} catch (error) {
console.error('Ошибка при запросе:', error);
throw error;
}
}
Разберем важный нюанс, который часто упускают: функция btoa() в JavaScript предназначена для работы со строками в кодировке Latin1. Если имя пользователя в 1С содержит русские буквы (например, "Администратор"), прямой вызов btoa() вызовет ошибку или создаст невалидный заголовок.
Рассмотрим, как правильно закодировать учетные данные с поддержкой UTF-8:
function encodeAuth(login, password) {
const str = login + ':' + password;
// Используем связку encodeURIComponent и unescape для корректного преобразования в Base64
return btoa(unescape(encodeURIComponent(str)));
}
Даже если ваш JS-код идеален, браузер заблокирует ответ, если сервер 1С явно не разрешит вашему сайту обращаться к нему. Выясним, как настроить публикацию 1С. Основным файлом конфигурации здесь является default.vrd, который находится в папке публикации на веб-сервере (IIS или Apache).
Начиная с версии платформы 8.3.17, в 1С появилась встроенная поддержка CORS прямо в файле описания публикации. Нам нужно добавить секцию <cors> внутри тега <point>. Посмотрим на пример настройки:
<point ...>
<httpServices>
<cors>
<allowOrigins>https://mysite.com</allowOrigins>
<allowMethods>POST, GET, OPTIONS</allowMethods>
<allowHeaders>Content-Type, Authorization</allowHeaders>
<allowCredentials>true</allowCredentials>
</cors>
<service name="MyService" rootUrl="hs_root" enable="true"/>
</httpServices>
</point>
Важный момент: если вы используете allowCredentials="true", то в allowOrigins нельзя ставить звездочку *. Необходимо указывать конкретный адрес вашего сайта.
Когда браузер видит запрос с заголовком Authorization, он сначала отправляет «предварительный» запрос методом OPTIONS (так называемый Preflight). Если ваш HTTP-сервис в 1С не знает, как на него отвечать, основной запрос даже не начнется.
Рассмотрим шаги по реализации обработки OPTIONS в 1С:
Пример кода в 1С для метода OPTIONS:
Функция ОбработатьOptions(Запрос)
Ответ = Новый HTTPСервисОтвет(200);
// Эти заголовки должны дублировать настройки веб-сервера для надежности
Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "https://mysite.com");
Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "Content-Type, Authorization");
Возврат Ответ;
КонецФункции
Проанализируем ситуацию, когда ошибка 401 возникает еще до того, как запрос попадает в 1С. Это происходит, если веб-сервер настроен некорректно. Для работы программной авторизации из JavaScript необходимо выполнить следующие условия:
Authorization и выполнить вход. Если включена только "Проверка подлинности Windows", браузер будет пытаться использовать системную учетную запись и выдаст ошибку.web.config (для IIS) не запрещены методы Basic-авторизации.Если решение все еще не найдено, воспользуемся инструментами мониторинга трафика, такими как Fiddler или вкладка Network в инструментах разработчика браузера (F12). Разберем, на что обратить внимание:
Authorization в запросе.Следуя этим шагам и правильно комбинируя настройки JS-запроса с параметрами файла default.vrd, вы сможете реализовать бесшовную и безопасную интеграцию вашего сайта с информационной базой 1С.