Публикация 1С на IIS: настройка, права, ошибки 500 и 404

Дата: 07.10.2026 22:16:18
IIS
Публикация базы
Веб-сервер
Администрирование 1С
Windows Server
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

Публикация 1С на IIS подключает информационную базу к Microsoft IIS через модуль wsisapi.dll: после неё работают веб-клиент, тонкий клиент по http, HTTP- и web-сервисы, OData. Здесь только IIS: компоненты, разрядность пула, права, ручная публикация, обновление платформы и ошибки 500.0, 404.3, 405. Устройство default.vrd, Apache и HTTPS через nginx — в статье «Публикация 1С на веб-сервере».

Основа — инструкция автора сайта для Windows Server 2012 R2, IIS 8.5 и платформы 8.3.4, сверенная с 8.3.27 и обновлённая под IIS 10 (Windows Server 2016–2025, Windows 10/11). Имена в примерах условные: база trade, файловая база в D:\1C\trade.

Когда выбирают IIS и что делает публикация

IIS берут, когда он уже стоит на Windows Server, нужен вход в 1С по доменной учётке (флажок аутентификации ОС при публикации есть только для IIS) или на одном сервере живут базы разных версий платформы. Конфигуратор и webinst публикуют на IIS 7–10 командами appcmd.exe — они видны в модуле публикации vrscore.dll 8.3.27:

Что создаётсяГде хранится
приложение с именем публикации в сайте «Default Web Site»applicationHost.config
обработчик «1C Web-service Extension»: path="*", модуль IsapiModule, путь к wsisapi.dllweb.config в каталоге публикации
разрешение модуля в «Ограничениях ISAPI и CGI»applicationHost.config
анонимная или Windows-проверка подлинности, accessPolicy, errorMode="Detailed"applicationHost.config, блок <location> приложения

Пул и его разрядность, права NTFS (для файловой базы платформа их только проверяет) и другие сайты публикация не трогает — это и есть настройка IIS для 1С, которая остаётся вам.

Шаг 1. Установка IIS для 1С: компоненты

Обязательны «Расширения ISAPI», «Фильтры ISAPI» и консоль управления IIS — так в инструкции 1С по настройке IIS. Совместимость с IIS 6 не нужна: конфигуратор находит IIS по разделу реестра HKLM\SOFTWARE\Microsoft\InetStp и настраивает через appcmd. Остальное в листинге — для удобства: журнал HTTP, вход по Windows и модуль WebAdministration для скриптов ниже.

# Компоненты IIS для публикации 1С. Windows PowerShell от имени администратора.

# Windows Server 2012 R2 - 2025: роль «Веб-сервер (IIS)» и нужные службы роли
Install-WindowsFeature -Name Web-Server, Web-WebServer, Web-Default-Doc, Web-Static-Content,
    Web-Http-Errors, Web-Http-Logging, Web-Filtering, Web-ISAPI-Ext, Web-ISAPI-Filter,
    Web-Windows-Auth, Web-Mgmt-Console, Web-Scripting-Tools
Get-WindowsFeature -Name Web-ISAPI-Ext, Web-ISAPI-Filter | Format-Table Name, InstallState

# Windows 10/11 - для тестов и небольшой файловой базы
Enable-WindowsOptionalFeature -Online -All -FeatureName IIS-WebServerRole, IIS-WebServer,
    IIS-DefaultDocument, IIS-StaticContent, IIS-HttpErrors, IIS-HttpLogging, IIS-RequestFiltering,
    IIS-ISAPIExtensions, IIS-ISAPIFilter, IIS-WindowsAuthentication, IIS-ManagementConsole,
    IIS-ManagementScriptingTools
Get-WindowsOptionalFeature -Online | Where-Object FeatureName -like 'IIS-ISAPI*' |
    Format-Table FeatureName, State

# По этому разделу реестра конфигуратор находит IIS; MajorVersion = 10 - это IIS 10
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\InetStp' |
    Select-Object MajorVersion, MinorVersion, PathWWWRoot

Вручную: «Диспетчер серверов → Добавить роли и компоненты → Веб-сервер (IIS) → Разработка приложений», в Windows 10/11 — «Компоненты Windows → Службы IIS → Службы Интернета → Компоненты разработки приложений».

Шаг 2. Разрядность: 32- или 64-битный пул

wsisapi.dll загружается в рабочий процесс пула w3wp.exe, поэтому разрядность модуля и пула должна совпадать:

  • 64-битная платформа (C:\Program Files\1cv8) — пул с enable32BitAppOnWin64="false", как по умолчанию;
  • 32-битная (C:\Program Files (x86)\1cv8) — в «Дополнительных параметрах» пула «Разрешены 32-разрядные приложения» = True, как у автора с 32-битной 8.3.4.

Для Apache конфигуратор при разной разрядности откажет в публикации, для IIS такой проверки нет: публикация пройдёт, а запросы получат 500.0 с кодом 0x800700c1. Заводите отдельный пул на каждую разрядность и версию платформы, а после перехода на 64-битную платформу верните флаг в False.

Шаг 3. Права IIS_IUSRS на bin и каталог файловой базы

По инструкции автора группе IIS_IUSRS нужны «Чтение и выполнение» на bin версии платформы и «Изменение» на каталог файловой базы. В IIS 10 анонимные запросы по умолчанию идут от IUSR, а пул — от своего удостоверения из IIS_IUSRS, поэтому каталог базы откройте обоим. Если для анонимного входа выбрано «Удостоверение пула приложений», хватит IIS_IUSRS или IIS AppPool\1C-trade.

:: Права NTFS для публикации 1С на IIS. Командная строка от имени администратора.
:: Сначала копия текущих ACL. Откат: icacls для родительского каталога с ключом /restore,
:: например: icacls "D:\1C" /restore C:\Backup\acl-trade.txt
mkdir C:\Backup 2>nul
mkdir C:\inetpub\1c\trade 2>nul
icacls "C:\Program Files\1cv8\8.3.27.1786\bin" /save C:\Backup\acl-bin.txt
icacls "C:\inetpub\1c\trade" /save C:\Backup\acl-publication.txt /t
icacls "D:\1C\trade" /save C:\Backup\acl-trade.txt /t

:: 1. bin платформы (wsisapi.dll и его библиотеки): чтение и выполнение для пулов IIS
icacls "C:\Program Files\1cv8\8.3.27.1786\bin" /grant "IIS_IUSRS:(OI)(CI)RX"

:: 2. Каталог публикации (default.vrd, web.config): чтение
icacls "C:\inetpub\1c\trade" /grant "IIS_IUSRS:(OI)(CI)RX"
icacls "C:\inetpub\1c\trade" /grant "IUSR:(OI)(CI)RX"

:: 3. Каталог файловой базы: изменение для пула и для анонимного пользователя
icacls "D:\1C\trade" /grant "IIS_IUSRS:(OI)(CI)M"
icacls "D:\1C\trade" /grant "IUSR:(OI)(CI)M"

:: Проверка: в выводе должны появиться строки IIS_IUSRS и IUSR
icacls "D:\1C\trade"

Шаг 4. Публикация 1С на IIS из конфигуратора

  1. Конфигуратор нужной версии запустите от имени администратора.
  2. «Администрирование → Публикация на веб-сервере…», веб-сервер Internet Information Services. Имя латиницей, каталог отдельный: сам %SystemDrive%\Inetpub\wwwroot платформа не примет.
  3. Отметьте нужные сервисы; флажок аутентификации ОС — только для входа по доменной учётке.
  4. «Опубликовать». Для файловой базы платформа проверит права анонимного пользователя и при нехватке предупредит: «У пользователя (группы) "…" отсутствуют права на доступ к каталогу информационной базы…».
  5. Переведите приложение в свой пул: «Дополнительные параметры» приложения → «Пул приложений» или appcmd set app из листинга ниже.
  6. Откройте http://localhost/trade/ на самом сервере: локальному запросу IIS покажет подробную ошибку с подкодом.

Из практики автора: анонимная проверка подлинности должна быть включена и на сервере, и на сайте, иначе не работает. Настройки наследуются «сервер → сайт → приложение»; публикация 8.3.2x включает анонимный вход для приложения явно, но учётную запись (IUSR или удостоверение пула) берёт с уровня выше. Ответ 401.2 — признак, что где-то вход выключен.

Ручная публикация: другой сайт и свой пул

Конфигуратор и webinst работают только с «Default Web Site» — имя сайта зашито в их командах. Для другого сайта, своего пула или сервера без конфигуратора публикацию собирают вручную. Это шаги автора («Преобразовать в приложение», «Сопоставления обработчиков», «Изменение разрешений функции», «Ограничения ISAPI и CGI»), только командами appcmd, как у платформы.

:: Ручная публикация базы 1С на IIS: любой сайт, свой пул. Командная строка от имени администратора.
:: Заранее: каталог C:\inetpub\1c\trade с default.vrd (кнопка «Сохранить» в окне публикации)
:: и права из шага 3. Для 32-битной платформы: путь Program Files (x86) и enable32BitAppOnWin64:true
set APPCMD=%windir%\system32\inetsrv\appcmd.exe
set DLL=C:\Program Files\1cv8\8.3.27.1786\bin\wsisapi.dll
set SITE=Default Web Site
set APP=trade
set POOL=1C-trade

:: 0. Резервная копия конфигурации IIS. Откат: appcmd restore backup before-1c-trade
%APPCMD% add backup before-1c-trade

:: 1. Пул без .NET (модуль 1С нативный); перезапуск ночью, а не каждые 29 часов
%APPCMD% add apppool /name:%POOL% /managedRuntimeVersion:"" /enable32BitAppOnWin64:false
%APPCMD% set apppool /apppool.name:%POOL% /recycling.periodicRestart.time:00:00:00
%APPCMD% set config -section:system.applicationHost/applicationPools /+"[name='%POOL%'].recycling.periodicRestart.schedule.[value='03:00:00']" /commit:apphost

:: 2. Каталог становится приложением IIS («Преобразовать в приложение») в своём пуле
%APPCMD% add app /site.name:"%SITE%" /path:/%APP% /physicalPath:"C:\inetpub\1c\trade"
%APPCMD% set app "%SITE%/%APP%" /applicationPool:%POOL%

:: 3. Обработчик 1С на все запросы приложения (запишется в web.config каталога)
%APPCMD% unlock config /section:handlers
%APPCMD% set config "%SITE%/%APP%" /section:handlers /+"[name='1C Web-service Extension',path='*',verb='*',modules='IsapiModule',scriptProcessor='%DLL%',resourceType='Unspecified',requireAccess='None']"
%APPCMD% set config "%SITE%/%APP%" /section:handlers /accessPolicy:"Read, Execute, Script" /commit:apphost

:: 4. Разрешить модуль в «Ограничениях ISAPI и CGI»
%APPCMD% set config /section:isapiCgiRestriction /+"[path='%DLL%',description='1C Web-service Extension',allowed='True']" /commit:apphost

:: 5. Анонимный вход (пользователя спросит уже 1С) и подробные ошибки, как у публикации 1С
%APPCMD% set config "%SITE%/%APP%" -section:system.webServer/security/authentication/anonymousAuthentication /enabled:"True" /commit:apphost
%APPCMD% set config "%SITE%/%APP%" -section:system.webServer/httpErrors -errorMode:Detailed /commit:apphost

:: 6. Перезапустить пул и проверить, что приложение в нём
%APPCMD% recycle apppool /apppool.name:%POOL%
%APPCMD% list app "%SITE%/%APP%"

Главное отличие от инструкции автора: сопоставления для *.1cws и *.1crs и MIME-типы 1С не нужны. Один обработчик с path="*" отдаёт модулю 1С все запросы: веб-клиент, /hs/, /ws/, /odata/. Со старыми сопоставлениями по расширениям веб-клиент и HTTP-сервисы получат 404. Итоговый web.config с поднятыми лимитами:

<?xml version="1.0" encoding="UTF-8"?>
<!-- C:\inetpub\1c\trade\web.config: обработчик пишут публикация 1С и appcmd из листинга выше,
     requestLimits добавлен вручную -->
<configuration>
    <system.webServer>
        <handlers>
            <add name="1C Web-service Extension" path="*" verb="*"
                 modules="IsapiModule"
                 scriptProcessor="C:\Program Files\1cv8\8.3.27.1786\bin\wsisapi.dll"
                 resourceType="Unspecified" requireAccess="None" />
        </handlers>
        <security>
            <requestFiltering>
                <!-- тело запроса до 200 МБ (файлы из веб-клиента, большие POST в HTTP-сервисы),
                     длинные адреса OData с $filter -->
                <requestLimits maxAllowedContentLength="209715200"
                               maxQueryString="8192" maxUrl="8192" />
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

По умолчанию IIS пропускает тело запроса до 30000000 байт (около 28,6 МБ) и строку запроса до 2048 байт: большой файл упрётся в 413.1 (в старых версиях IIS — 404.13), длинный $filter OData — в 404.15.

Повторная публикация после обновления платформы

В web.config записан полный путь к wsisapi.dll конкретной версии, поэтому после установки новой платформы публикация работает на старом модуле. Клиент-серверной базе нужен модуль версии кластера, иначе в ответе будет «Несоответствие версий клиента и сервера 1С:Предприятия». После удаления старой версии IIS ответит 500.0 с кодом 0x8007007e. Обновление 1С на IIS делают так:

  1. Конфигуратор новой версии → «Публикация на веб-сервере…» → «Опубликовать». Перезапуск веб-сервера, который он предложит, для IIS означает iisreset всех сайтов; на общем сервере откажитесь и перезапустите только пул 1С.
  2. webinst новой версии по существующему default.vrd — настройки сервисов сохранятся. Тоже только Default Web Site.
  3. Скрипт PowerShell — для многих публикаций и других сайтов.
:: Повторная публикация по существующему default.vrd: настройки сервисов сохранятся.
:: Командная строка от имени администратора; webinst - из каталога НОВОЙ версии платформы.
mkdir C:\Backup 2>nul
copy "C:\inetpub\1c\trade\default.vrd" C:\Backup\trade-default.vrd
cd /d "C:\Program Files\1cv8\8.3.27.1786\bin"
webinst -publish -iis -dir "C:\inetpub\1c\trade" -descriptor "C:\inetpub\1c\trade\default.vrd"
:: Если публикация была с входом по Windows, добавьте к команде ключ -osauth
%windir%\system32\inetsrv\appcmd.exe recycle apppool /apppool.name:1C-trade
:: Проверка: приложение должно остаться в своём пуле (в выводе applicationPool:1C-trade)
%windir%\system32\inetsrv\appcmd.exe list app "Default Web Site/trade"
# Перевод публикаций 1С на IIS на новую версию платформы: путь к wsisapi.dll в web.config,
# «Ограничения ISAPI и CGI», перезапуск затронутых пулов. Windows PowerShell 5.1 от администратора.
# Без -Apply скрипт только показывает, что изменит:
#   .\Switch-1CPublications.ps1 -NewVersion 8.3.27.1786
#   .\Switch-1CPublications.ps1 -NewVersion 8.3.27.1786 -Apply
param(
    [Parameter(Mandatory = $true)][string]$NewVersion,
    [string]$PlatformRoot = 'C:\Program Files\1cv8',   # 32-битная платформа: C:\Program Files (x86)\1cv8
    [switch]$Apply
)
Import-Module WebAdministration

$newDll = Join-Path $PlatformRoot "$NewVersion\bin\wsisapi.dll"
if (-not (Test-Path $newDll)) { throw "Not found: $newDll" }
$stamp = Get-Date -Format 'yyyyMMdd-HHmmss'
$handlerXPath = "//handlers/add[contains(@scriptProcessor, 'wsisapi.dll')]"

# 1. Публикации, у которых обработчик 1С указывает на другую версию
$targets = @(foreach ($site in Get-Website) {
    foreach ($app in Get-WebApplication -Site $site.Name) {
        $dir = [Environment]::ExpandEnvironmentVariables($app.PhysicalPath)
        $webConfig = Join-Path $dir 'web.config'
        if (-not (Test-Path $webConfig)) { continue }
        $xml = [xml](Get-Content -Path $webConfig -Raw -Encoding UTF8)
        $old = @($xml.SelectNodes($handlerXPath) | Where-Object { $_.GetAttribute('scriptProcessor') -ne $newDll })
        if ($old.Count -gt 0) {
            [pscustomobject]@{
                Publication = "$($site.Name)$($app.Path)"
                Pool        = $app.applicationPool
                OldDll      = $old[0].GetAttribute('scriptProcessor')
                WebConfig   = $webConfig
            }
        }
    }
})
$targets | Format-Table Publication, Pool, OldDll -AutoSize
if ($targets.Count -eq 0 -or -not $Apply) { return }

# 2. Резервные копии: конфигурация IIS (откат: appcmd restore backup <имя>) и каждый web.config
& "$env:windir\system32\inetsrv\appcmd.exe" add backup "before-1c-$stamp"
foreach ($t in $targets) { Copy-Item -Path $t.WebConfig -Destination "$($t.WebConfig).$stamp.bak" }

# 3. Новый модуль - в «Ограничения ISAPI и CGI», иначе будет 404.2
$allowedDlls = Get-WebConfiguration -PSPath 'IIS:\' -Filter 'system.webServer/security/isapiCgiRestriction/add' |
    ForEach-Object { $_.path }
if ($allowedDlls -notcontains $newDll) {
    Add-WebConfiguration -PSPath 'IIS:\' -Filter 'system.webServer/security/isapiCgiRestriction' `
        -Value @{ path = $newDll; allowed = $true; description = '1C Web-service Extension' }
}

# 4. Новый путь к модулю в web.config каждой публикации
foreach ($t in $targets) {
    $xml = [xml](Get-Content -Path $t.WebConfig -Raw -Encoding UTF8)
    foreach ($handler in $xml.SelectNodes($handlerXPath)) {
        $handler.SetAttribute('scriptProcessor', $newDll)
    }
    $xml.Save($t.WebConfig)
}

# 5. Перезапуск только затронутых пулов: старый модуль выгрузится из w3wp.exe
$targets.Pool | Sort-Object -Unique | ForEach-Object { Restart-WebAppPool -Name $_ }

Старую версию удаляйте, когда аудит покажет у всех публикаций новую версию и прежний пул.

Проверка: аудит публикаций и проверка из 1С

Скрипт находит публикации 1С на всех сайтах по обработчику с wsisapi.dll и показывает версию и разрядность модуля, пул, разрешение ISAPI, анонимный вход и base из default.vrd. Настройки он только читает.

# Аудит публикаций 1С на IIS: версия и разрядность wsisapi.dll, пул, «Ограничения ISAPI и CGI»,
# анонимный вход, base из default.vrd. Только читает настройки. Windows PowerShell 5.1 от администратора.
Import-Module WebAdministration

# Разрядность DLL по полю Machine заголовка PE: 0x14C - x86, 0x8664 - x64. Библиотека не загружается
function Get-DllBitness([string]$Path) {
    $stream = [System.IO.File]::OpenRead($Path)
    try {
        $buffer = New-Object byte[] 4096
        [void]$stream.Read($buffer, 0, $buffer.Length)
    } finally {
        $stream.Dispose()
    }
    $machine = [BitConverter]::ToUInt16($buffer, [BitConverter]::ToInt32($buffer, 0x3C) + 4)
    if ($machine -eq 0x8664) { return 'x64' }
    if ($machine -eq 0x14C) { return 'x86' }
    return 'unknown'
}

$allowedDlls = Get-WebConfiguration -PSPath 'IIS:\' -Filter 'system.webServer/security/isapiCgiRestriction/add' |
    Where-Object { $_.allowed } | ForEach-Object { $_.path }

$report = foreach ($site in Get-Website) {
    foreach ($app in Get-WebApplication -Site $site.Name) {
        $dir = [Environment]::ExpandEnvironmentVariables($app.PhysicalPath)
        $webConfig = Join-Path $dir 'web.config'
        if (-not (Test-Path $webConfig)) { continue }
        $xml = [xml](Get-Content -Path $webConfig -Raw -Encoding UTF8)
        $handler = $xml.SelectSingleNode("//handlers/add[contains(@scriptProcessor, 'wsisapi.dll')]")
        if ($null -eq $handler) { continue }                     # не публикация 1С

        $location  = "$($site.Name)$($app.Path)"
        $dll       = [Environment]::ExpandEnvironmentVariables($handler.GetAttribute('scriptProcessor'))
        $pool      = Get-Item "IIS:\AppPools\$($app.applicationPool)"
        $anonymous = Get-WebConfiguration -PSPath 'IIS:\' -Location $location `
            -Filter 'system.webServer/security/authentication/anonymousAuthentication'
        $vrd       = Join-Path $dir 'default.vrd'

        $dllBits  = if (Test-Path $dll) { Get-DllBitness $dll } else { 'no file' }
        $poolBits = if ($pool.enable32BitAppOnWin64) { 'x86' } else { 'x64' }
        $base     = if (Test-Path $vrd) { ([xml](Get-Content -Path $vrd -Raw -Encoding UTF8)).point.base } else { '' }

        [pscustomobject]@{
            Publication = $location
            Version     = Split-Path (Split-Path (Split-Path $dll -Parent) -Parent) -Leaf
            Bitness     = if ($dllBits -eq $poolBits) { "$dllBits OK" } else { "dll $dllBits, pool $poolBits - MISMATCH" }
            Pool        = "$($app.applicationPool): $((Get-WebAppPoolState -Name $app.applicationPool).Value)"
            IsapiCgi    = if ($allowedDlls -contains $dll) { 'allowed' } else { 'NOT ALLOWED (404.2)' }
            Anonymous   = if ($anonymous.enabled) { "on, user '$($anonymous.userName)'" } else { 'off (401.2)' }
            VrdBase     = if (-not $base) { 'no default.vrd' }
                          elseif ($base -cne $app.Path) { "$base - case differs from $($app.Path)" }
                          else { $base }
        }
    }
}
$report | Format-List

Функция 1С запрашивает корень публикации и достаёт со страницы ошибки IIS подкод и код Windows. Подробную страницу IIS отдаёт локальным запросам, поэтому запускайте проверку на веб-сервере. Для публикации с входом по Windows передайте АутентификацияОС = Истина.

// Проверка публикации 1С на IIS из кода: модуль объекта обработки или общий модуль «Сервер».
// Запрашивает корень публикации и по странице ошибки IIS определяет подкод (404.3, 500.0)
// и код Windows (0x800700c1). Подробную страницу ошибки IIS отдаёт локальным запросам,
// поэтому запускайте проверку на самом веб-сервере. Пример:
// Итог = ПроверитьПубликациюIIS("localhost", "trade");
// Сообщить(СтрШаблон("%1 %2 %3", Итог.КодСостояния, Итог.ПодкодIIS, Итог.Совет));
Функция ПроверитьПубликациюIIS(Знач Хост, Знач ИмяПубликации, Знач Порт = 80,
	Знач АутентификацияОС = Ложь) Экспорт

	Итог = Новый Структура("Адрес, КодСостояния, ВебСервер, ПодкодIIS, КодОшибки, Совет",
		"", 0, "", "", "", "");
	Путь = "/" + ИмяПубликации + "/";
	Итог.Адрес = "http://" + Хост + ":" + Формат(Порт, "ЧГ=0") + Путь;

	// АутентификацияОС = Истина - для публикации с входом по Windows (NTLM или Negotiate)
	Соединение = Новый HTTPСоединение(Хост, Порт, , , , 30, , АутентификацияОС);
	Попытка
		Ответ = Соединение.Получить(Новый HTTPЗапрос(Путь));
	Исключение
		// До IIS запрос не дошёл: служба W3SVC, привязка сайта к порту, брандмауэр
		Итог.Совет = "Нет ответа: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
		Возврат Итог;
	КонецПопытки;

	Итог.КодСостояния = Ответ.КодСостояния;
	Итог.ВебСервер = ЗначениеЗаголовка(Ответ.Заголовки, "Server"); // Microsoft-IIS/10.0
	Если Ответ.КодСостояния < 400 Тогда
		Итог.Совет = "Публикация отвечает";
		Возврат Итог;
	КонецЕсли;

	Текст = Ответ.ПолучитьТелоКакСтроку();
	Если ТипЗнч(Текст) <> Тип("Строка") Тогда
		Текст = "";
	КонецЕсли;
	Итог.ПодкодIIS = ПодкодIIS(Текст, Ответ.КодСостояния);
	Итог.КодОшибки = КодОшибкиWindows(Текст);
	Итог.Совет = СоветПоОшибкеIIS(Ответ.КодСостояния, Итог.ПодкодIIS, Итог.КодОшибки);
	Возврат Итог;

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

// "HTTP Error 404.3 - Not Found" -> "404.3"; пустая строка, если подкода в тексте нет
Функция ПодкодIIS(Текст, КодСостояния)

	Префикс = Формат(КодСостояния, "ЧГ=0") + ".";
	Позиция = СтрНайти(Текст, Префикс);
	Если Позиция = 0 Тогда
		Возврат "";
	КонецЕсли;

	Цифры = "";
	Позиция = Позиция + СтрДлина(Префикс);
	Пока Позиция <= СтрДлина(Текст) Цикл
		ТекущийСимвол = Сред(Текст, Позиция, 1);
		Если СтрНайти("0123456789", ТекущийСимвол) = 0 Тогда
			Прервать;
		КонецЕсли;
		Цифры = Цифры + ТекущийСимвол;
		Позиция = Позиция + 1;
	КонецЦикла;

	Возврат ?(Цифры = "", "", Префикс + Цифры);

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

// "Error Code 0x800700c1" или "Код ошибки 0x800700c1" -> "0x800700c1"
Функция КодОшибкиWindows(Текст)

	Позиция = СтрНайти(НРег(Текст), "0x8007");
	Если Позиция = 0 Тогда
		Возврат "";
	КонецЕсли;
	Возврат НРег(Сред(Текст, Позиция, 10));

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

// Типичная причина по подкоду IIS и коду Windows
Функция СоветПоОшибкеIIS(КодСостояния, ПодкодIIS, КодОшибки)

	// Сначала подкоды с однозначной причиной: код Windows на их страницах бывает общим
	Если ПодкодIIS = "404.2" Тогда
		Возврат "Модуля нет в «Ограничениях ISAPI и CGI» - типично после обновления платформы";
	ИначеЕсли ПодкодIIS = "404.3" Или ПодкодIIS = "403.14" Тогда
		Возврат "Запрос не дошёл до 1С: для адреса нет обработчика «1C Web-service Extension» (web.config)";
	ИначеЕсли ПодкодIIS = "500.21" Тогда
		Возврат "Не установлен компонент IIS «Расширения ISAPI»";
	ИначеЕсли ПодкодIIS = "401.2" Тогда
		Возврат "Анонимная проверка подлинности выключена на сервере, сайте или приложении";
	ИначеЕсли ПодкодIIS = "401.3" Тогда
		Возврат "У IUSR или пула нет прав NTFS на каталог публикации";
	ИначеЕсли ПодкодIIS = "413.1" Или ПодкодIIS = "404.13" Или ПодкодIIS = "404.15" Тогда
		Возврат "Запрос больше лимитов фильтрации: requestLimits в web.config";
	ИначеЕсли КодОшибки = "0x800700c1" Тогда
		Возврат "Разрядность wsisapi.dll и пула не совпадает: параметр пула enable32BitAppOnWin64";
	ИначеЕсли КодОшибки = "0x8007007e" Тогда
		Возврат "Модуль не найден: в web.config путь к wsisapi.dll удалённой версии платформы";
	ИначеЕсли КодОшибки = "0x80070005" Тогда
		Возврат "Отказ в доступе: права IIS_IUSRS на bin платформы, IUSR и IIS_IUSRS на каталоги";
	ИначеЕсли КодОшибки = "0x80070021" Тогда
		Возврат "Раздел handlers заблокирован: appcmd unlock config /section:handlers";
	ИначеЕсли КодСостояния = 503 Тогда
		Возврат "Пул приложений остановлен: запустите его, причину ищите в журнале System (WAS)";
	ИначеЕсли КодСостояния = 405 Тогда
		Возврат "Сверьте регистр имени публикации в адресе и атрибут base в default.vrd";
	ИначеЕсли ПодкодIIS = "" Тогда
		Возврат "Подкода IIS нет: это ответ самой 1С или краткая страница ошибки для удалённого запроса";
	КонецЕсли;

	Возврат "Подкод " + ПодкодIIS + ": подробности в тексте страницы ошибки";

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

// Имена заголовков HTTP сравниваем без учёта регистра
Функция ЗначениеЗаголовка(Заголовки, Имя)

	Для Каждого Заголовок Из Заголовки Цикл
		Если НРег(Заголовок.Ключ) = НРег(Имя) Тогда
			Возврат Заголовок.Значение;
		КонецЕсли;
	КонецЦикла;
	Возврат "";

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

Разбор ключевых строк

  • path='*' verb='*' modules='IsapiModule' — все запросы приложения уходят в wsisapi.dll, обработчик нужен один.
  • unlock config /section:handlers — без неё заблокированный на уровне сервера раздел обработчиков даёт 500.19 с кодом 0x80070021; платформа выполняет ту же команду.
  • /commit:apphost — проверка подлинности пишется в applicationHost.config (блок <location path="Default Web Site/trade">), копия каталога публикации её не переносит.
  • Аудит берёт разрядность из поля Machine PE-заголовка, не загружая DLL; -cne сравнивает base с учётом регистра. Восьмой параметр HTTPСоединение включает NTLM или Negotiate.

Типичные ошибки

HTTP Error 500.0 — Internal Server Error, модуль IsapiModule

На странице указаны модуль IsapiModule, обработчик «1C Web-service Extension» и код ошибки. 0x800700c1 («%1 не является приложением Win32») — разрядность модуля и пула не совпадает, см. шаг 2. 0x8007007e — модуль не найден: в web.config путь к удалённой версии платформы. 0x80070005 — отказ в доступе, права из шага 3.

HTTP Error 404.0 и 404.3 — Not Found

Запрос достался обработчику статических файлов, а не модулю 1С: на странице ошибки обработчиком указан StaticFile, а не «1C Web-service Extension». Адресов вида /trade/ws/Exchange.1cws и /trade/hs/… на диске нет, поэтому IIS ответит 404.0, на корне публикации — 403.14. 404.3 («The page you are requesting cannot be served because of the extension configuration») бывает, только если файл по адресу есть, а его расширения нет в MIME-типах. Причины: обработчик удалён, web.config потерян при копировании или сопоставления настроены только на отдельные расширения; в «Сопоставлениях обработчиков» должна быть строка «1C Web-service Extension» с путём *.

ОшибкаПричинаЧто сделать
404.2модуля нет в «Ограничениях ISAPI и CGI», обычно после обновления платформыразрешить wsisapi.dll новой версии
500.21«bad module "IsapiModule"» — не установлены «Расширения ISAPI»шаг 1
500.19, 0x80070021раздел handlers заблокирован на уровне сервераappcmd unlock config /section:handlers
401.2анонимный вход выключен на сервере, сайте или приложениишаг 4
500.19, 0x80070005пул не может прочитать web.config: нет прав на каталог публикациишаг 3
503пул остановлен, например после нескольких падений w3wp.exe подрядзапустить пул, причина — в журнале System (WAS)
413.1, 404.15запрос больше лимитов фильтрацииrequestLimits в web.config

Ошибка 405 из практики автора. HTTP-сервис отвечает 405, хотя метод описан: имя публикации в адресе и в default.vrd должно совпадать с учётом регистра. IIS найдёт приложение и по /Base1/, и по /base1/, а модулю 1С нужен путь ровно как в base="/base1" — сверьте с колонкой VrdBase аудита. Адреса сервисов разобраны в статье «HTTP-сервис 1С: создание с нуля».

Обновление конфигурации файловой базы не получает монопольный режим — базу держит рабочий процесс IIS. На время обновления остановите пул: appcmd stop apppool /apppool.name:1C-trade.

Частые вопросы

Можно ли опубликовать базу не в Default Web Site?

Только вручную: в листинге appcmd задайте свой сайт в переменной SITE, остальное не меняется.

Можно ли держать на одном IIS базы разных версий платформы?

Да, у каждой публикации свой путь к wsisapi.dll. Разведите их по пулам: две версии модуля в одном w3wp.exe не уживаются, а разрядность у пула одна. Клиент-серверной базе нужен модуль версии её кластера (см. «Установка сервера 1С 8.3»).

Как входить в 1С через IIS под учётной записью Windows?

Установите «Проверку подлинности Windows» и при публикации отметьте «Использовать аутентификацию операционной системы на веб-сервере» (у webinst — ключ -osauth). Публикация выключит для приложения анонимный вход и включит проверку Windows. Пользователю 1С включите аутентификацию ОС с его доменной учётной записью.

Когда проще заказать

Если публикацию нужно поднять на сервере с другими сайтами или перевести десяток баз на новую версию платформы, а своего администратора 1С нет, отдайте задачу исполнителю. Разместите задачу на площадке — оценка бесплатная, ответ в течение рабочего дня. Для обмена с сайтом посмотрите услугу обмена 1С с сайтом.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.