# Настройка и решение проблем с 1С

Документ даёт ответы на типовые обращения клиентов по настройке и диагностике обмена с 1С. Связан с [1С не подключается — диагностика](https://help.1forma.ru/domains/integrations/runbook-1c-connect-auth.md). Внутри — архитектура SOAP-обмена, пошаговая настройка подключения, типичные проблемы, SQL-диагностика, параметры логирования и поставочные артефакты модуля 1С.

## 1. Архитектура обмена и предварительные требования

Обмен 1С и 1Формы идёт через SOAP веб-сервисы в обоих направлениях:

```
1С:Предприятие  ←→  Веб-сервисы  ←→  Первая Форма
       ↑                                    ↑
  Модуль обмена                      TC1CService.asmx
  (расширение 1С)                    api/sync1c
```

Обе стороны общаются через **SOAP веб-сервисы**:

- **1С → 1Ф**: 1С вызывает маршрут `/TC1CService.asmx` (или `api/sync1c/send-1c-event`)
- **1Ф → 1С**: 1Ф вызывает веб-сервис, опубликованный в 1С по адресу `OneCAddress`

**Сначала определите сборку.** Всё, что описано в этом документе, относится к **полной сборке**. В сертифицируемой сборке (ФСТЭК-сборка, профиль решения `UniForm.Barebone`) обмен с 1С отсутствует: ни `/TC1CService.asmx`, ни `api/sync1c`, ни административных маршрутов `api/admin/sync1c/*`, ни ядра обмена в сборке нет, поэтому обращения к этим адресам отвечают `404`, а настройка конфигурации и проверка соединения недоступны. Если площадка сертифицируемая — вопрос «почему обмен не работает» закрывается здесь.

### Требования на стороне 1С и 1Ф

**На стороне 1С:**

1. **Модуль обмена** — расширение конфигурации 1С (поставляется отдельно, не входит в дистрибутив 1Ф)
2. **Публикация веб-сервиса 1С** — через Конфигуратор или утилиту публикации Apache/IIS
3. **Учётная запись** для подключения 1Ф к 1С (логин + пароль, должна иметь права на вызов веб-сервиса)
4. **Сетевой доступ** с сервера 1Ф к серверу 1С по указанному URL (порт, firewall)

**На стороне 1Ф:**

1. **Системный пользователь** — учётная запись в 1Ф для операций синхронизации
2. **Сетевой доступ** с сервера 1С к серверу 1Ф по URL вида `https://server/TC1CService.asmx`
3. **Лицензия** — достаточное количество лицензий 1Ф

**Доступ к службе обмена (`/TC1CService.asmx`).** Служба, которую 1С вызывает при обмене 1С → 1Ф, принимает только запросы с учётными данными 1Формы: логин и пароль пользователя (Basic), токен сессии (`1FormaAuth`), персональный ключ доступа (`1F-Pat`) или вход через Windows, если он включён на площадке. Запрос без учётных данных (в том числе открытие `…/TC1CService.asmx?WSDL` в браузере без входа) получает отказ. Перед обновлением убедитесь, что в модуле обмена 1С и в самописных клиентах указаны рабочие учётные данные пользователя 1Формы, а у сервисной учётной записи нет второго фактора (Basic со вторым фактором не проходит).

## 2. Настройка подключения (пошагово)

### 2.1 В админке 1Ф: создание конфигурации синхронизации

Путь: **Администрирование → Синхронизации → 1С → Создать конфигурацию**

Ключевые параметры:

| Параметр | Что указывать | Пример |
|----------|---------------|--------|
| **Имя конфигурации** | Уникальное имя (латиница) | `ERP_Production` |
| **Адрес 1С (OneCAddress)** | URL опубликованного веб-сервиса 1С | `https://1c-server:8080/erp/ws/1CIntegration.1cws` |
| **Логин 1С (OneCUserName)** | Учётная запись для доступа к 1С | `sync_user` |
| **Пароль 1С (OneCPassword)** | Пароль (хранится зашифрованным) | `***` |
| **Тип аутентификации** | Basic (по умолчанию), Ntlm, Windows | `Basic` |
| **Адрес 1Ф (TCAddress)** | WSDL-адрес веб-сервиса 1Ф | `https://1f-server/TC1CService.asmx?WSDL` |
| **Логин 1Ф** | Логин системного пользователя 1Ф | `system` |
| **Пароль 1Ф** | Пароль системного пользователя 1Ф | `***` |
| **ДП для GUID** | ExtParamID для хранения GUID записи 1С | `12345` |

Пароли 1С и 1Ф хранятся зашифрованными, и в базе одной площадки соседствуют два формата: у давно заведённых конфигураций — голый Base64 без префикса, у сохранённых позже — с префиксом (`VENC:` или `$v2$`, зависит от примитива шифрования площадки). Читаются оба, на работу обмена это не влияет. Формат меняется только когда пароль вводят заново: при сохранении конфигурации без правки пароля значение остаётся в прежнем виде.

**Проверка соединения (2.2):** в админке нажать **«Проверить соединение»** → вызывается `POST api/admin/sync1c/config/test-connection?name=...`

Если OK → возвращается `1` (TestConnection successful).

**Настройка в 1С (2.3):**

1. Открыть модуль обмена в 1С
2. Указать URL веб-сервиса 1Ф: `https://server/TC1CService.asmx?WSDL`
3. Указать логин и пароль (те же, что в конфигурации 1Ф)
4. Нажать «Тест подключения»

## 3. Типичные проблемы и решения

### 3.1 «1С не видит 1Ф» (ошибка аутентификации из 1С)

**Симптом**: в 1С при тесте подключения ошибка вида `Аутентификация пользователя не выполнена` или `401 Unauthorized`.

**Проверить**:

1. **URL и доступ?** Запрос `https://server/TC1CService.asmx?WSDL` без учётных данных должен получить отказ (описание сервиса анонимно не отдаётся); с учётными данными пользователя 1Формы (Basic или другой поддерживаемый способ) тот же адрес возвращает WSDL. Если без входа открывается полное описание сервиса — площадка без актуальной защиты endpoint'а либо без ограничения на периметре
2. **Логин/пароль?** Проверить что учётная запись существует в 1Ф и активна
3. **HTTPS/сертификат?** Если используется самоподписанный сертификат — 1С может его отвергать. Добавить сертификат в доверенные на сервере 1С
4. **Порт/firewall?** С сервера 1С выполнить `telnet 1f-server 443` (или нужный порт)
5. **IIS/Reverse proxy?** Проверить что Windows Authentication или Basic Authentication включены на уровне IIS для пути `/TC1CService.asmx`

### 3.2–3.4 Ошибки соединения 1Ф→1С, очередь и обновление 1С

**«1Ф не видит 1С» (тест соединения из админки)**

**Симптом**: кнопка «Проверить соединение» падает с ошибкой.

**Проверить**:

1. **OneCAddress** — URL должен быть полным, включая путь к `.1cws` или `.asmx`
2. **Тип аутентификации** — должен соответствовать настройке на стороне 1С (обычно Basic)
3. **Сеть** — с сервера 1Ф должен быть доступ к серверу 1С по указанному URL
4. **Веб-сервис опубликован?** — после обновления 1С публикация может сброситься, нужно переопубликовать

**События приходят, но данные не применяются**

**Проверить**:

1. **Сопоставление пользователей** (`Sync1CUsersMap`) — логин 1С должен быть сопоставлен с UserID в 1Ф
2. **Record (запись синхронизации)** — документ/справочник 1С должен быть в настройках конфигурации
3. **Очередь** — события могут застревать в очереди `Sync1CEventQueues` (см. `RetryCount`)
4. **Время события относительно коммита** — событие по GUID, пришедшее во время каскада «После смены ДП», может относиться к ещё не закоммиченной задаче: у виртуальных документов исходящий `Modify` отправляется после коммита, и в `Sync1CLog` ему соответствует строка `Outbound event deferred until transaction commit.` Если событие не находит задачу, сопоставьте его время со временем коммита и с этой строкой.

**После обновления 1С обмен перестал работать**

1. **Переопубликовать веб-сервис** в конфигураторе 1С
2. Проверить что **URL не изменился**
3. Проверить что **модуль обмена** совместим с новой версией конфигурации

**Ошибка типа ссылки у Lookup-ДП**

**Ошибка смены статуса несуществующей задачи при неподдерживаемых ДП**

**Симптом:** попытка 1С изменить статус задачи завершается ошибкой «Не найдена задача для изменения статуса», статус не переводится.

**Причина:** задача по переданному из 1С идентификатору в 1Форме не найдена. Если ответ при этом не содержит наименования задачи и состоит только из неподдерживаемых типов дополнительных параметров (файл, множественный выбор задач, сквозной параметр, выбор пользователей, дерево), новая задача не создаётся — и смена статуса прерывается понятной ошибкой отсутствия задачи, а не обращением к задаче с нулевым идентификатором.

**Что сделать:** проверить сопоставление идентификаторов между 1С и 1Формой; убедиться, что задача с этим идентификатором создана в 1Форме либо пакет создания несёт наименование и поддерживаемые типы параметров.



**Симптом**: в задаче появляется сервисный комментарий «Синхронизация с 1С: ДП '<имя реквизита>' (ID <ID ДП>) в задаче <номер задачи> имеет некорректный тип ссылки '<тип>': отсутствует разделитель '.'.». Значение в 1С при этом не уходит.

**Причина**: платформа не смогла собрать ссылочный тип из имени объекта 1С — в нём нет точки-разделителя между классом и именем. Имя приходит из системного имени объекта (`OneCDocName`) записи синхронизации категории задачи-ссылки, а если его нет — из `Links` реквизита-ссылки.

**Что сделать**: найти в настройке сопоставления категорию задачи-ссылки и проверить, что её запись синхронизации заполнена и системное имя объекта записано через точку, а у реквизита-ссылки в `Links` указано полное имя справочника, а не только его класс. После исправления передачу значения нужно запустить заново — событие с этой ошибкой из очереди удаляется и автоматически не повторяется.

**Табличный ДП с неподдерживаемой колонкой не уходит в 1С**

**Симптом:** табличный ДП не попадает в выгрузку в 1С, в задаче появляется сервисный комментарий о пропуске, запись о пропуске есть в журнале синхронизации. Если таблица пуста (0 строк), 1С не узнаёт, что таблица очищена.

**Причина:** если хотя бы одна синхронизируемая колонка табличного ДП относится к типу, который конвертер отправить не умеет, такой ДП отсекается от выгрузки. Для **непустой** таблицы отсечение сохраняется — это ожидаемое поведение, а не сбой.

**Что сделано:** начиная со сборки 2.268 «Скульптор» пустая таблица (0 строк) с неподдерживаемой колонкой передаётся в 1С пустой таблицей — и при полной выгрузке, и при точечном изменении задачи. На точечном пути это работает и при явной очистке значения, и при удалении строк: пустота определяется по текущему состоянию таблицы, а не по самой команде удаления. Если строки в таблице остались, ДП по-прежнему пропускается с записью в журнал и сервисным комментарием. Таблицы без неподдерживаемых синхронизируемых колонок обрабатываются как прежде.

**Что сделать при обращении:** проверить, каким путём шёл обмен — полной выгрузкой или точечным изменением — и есть ли строки в таблице после сохранения: пустая таблица должна уйти в 1С как очистка, а при оставшихся строках пропуск из-за неподдерживаемой колонки ожидаем. Далее проверить типы синхронизируемых колонок. Если колонка с неподдерживаемым типом нужна в обмене — исключить её из синхронизации или использовать обходные приёмы из раздела про сопоставление сущностей и метаданных ([1С — сопоставление сущностей](https://help.1forma.ru/domains/integrations/1c-entity-mapping.md)).

**Неподдерживаемый тип реквизита (ДП) обрывал отправку события в 1С**

**Симптом:** при изменении задачи часть реквизитов не уезжает в 1С, в задаче появляется сервисный комментарий о пропущенном реквизите, в журнале синхронизации — запись о пропуске.

**Причина:** не всякий тип дополнительного параметра умеет уехать из 1Формы в 1С. Для одних типов исходящая конвертация не реализована вовсе, для других она не поддерживается как колонка табличного ДП. Раньше такой реквизит обрывал исходящее событие целиком, и вместе с ним не уезжали остальные реквизиты задачи.

**Как теперь:** неподдерживаемый реквизит и табличный ДП с неподдерживаемой колонкой пропускаются, остальные реквизиты события уезжают в 1С как обычно; о пропуске система сообщает сервисным комментарием в задаче и строкой в журнале синхронизации. Перечень пропускаемых типов берётся из самого конвертера, поэтому новый неподдерживаемый тип начинает пропускаться без ручной правки списка.

| Где | Что не поддерживается |
|---|---|
| Тип ДП целиком | сквозной параметр, множественный выбор задач, выбор пользователей, адресаты и другие типы без исходящей конвертации |
| Колонка табличного ДП — пропускается вся таблица | адресаты, файл, выбор пользователей, таблица, сквозной параметр, множественный выбор задач |

Колонка с признаком «передавать как текст» уезжает без разбора типа и пропуск не открывает. Если в событии не осталось ни одного передаваемого реквизита, событие всё равно уходит в 1С — с пустым составом реквизитов: событие создания задачи создаёт документ в 1С и получает GUID из ответа, у виртуального документа GUID запроса генерируется и записывается в задачу перед отправкой. Сервисный комментарий и запись в журнале о пропуске при этом остаются. Не отправляется только событие изменения задачи без изменённого реквизита.

**Документ в 1С не создан, хотя задача есть в 1Форме**

**Симптом:** задача создана в 1Форме, но документа в 1С нет, реквизит с GUID задачи пуст, ошибки синхронизации нет — есть только сервисный комментарий о пропущенном реквизите.

**Причина:** до сборки 2.268 событие, в котором после пропуска не осталось ни одного передаваемого реквизита, не отправлялось вовсе: обработка завершалась до вызова 1С, GUID виртуального документа не генерировался, ответ 1С не обрабатывался.

**Что сделать:** сверить сборку площадки и версию модуля обмена. На актуальной сборке событие из одних неподдерживаемых реквизитов уходит с пустым составом и документ создаётся. Если на обновлённой площадке расхождение повторяется — передать разработке номер задачи, строку журнала синхронизации и имя пропущенного реквизита.

**Что делать:** по журналу синхронизации определить, какой тип не поддержан, и решить с разработкой — изменить тип реквизита в настройке обмена либо завести задачу на поддержку этого типа в исходящей конвертации. Менять список пропускаемых типов вручную больше не нужно.

**Значение из 1С не попало в задачу, остальные реквизиты обновились**

**Симптом:** после обмена часть реквизитов записалась, один или несколько — нет; в ленте задачи виден сервисный комментарий о пропущенном реквизите.

**Причина:** входящий обмен не переносит пять типов дополнительных параметров — файл, множественный выбор задач, сквозной параметр, выбор пользователей и дерево. Такой параметр пропускается, обработка события продолжается. До сборки 2.268 «Скульптор» один такой параметр обрывал разбор всего ответа, и не обновлялся ни один реквизит.

**Что проверить:** тип параметра в категории и имя реквизита из комментария, ту же строку в журнале синхронизации. Если значение нужно в задаче, его должен нести реквизит поддерживаемого типа — текст, число, дата, список, ссылка.

### 3.5 На сертифицируемой сборке обмен с 1С не настраивается

**Симптомы**: `/TC1CService.asmx` отвечает `404`; `api/sync1c/*` и `api/admin/sync1c/*` отвечают `404`; раздел «Синхронизации → 1С» в клиенте открывается, но настройки не сохраняются; записи очереди обмена висят в состоянии «Выполняется»; кнопка «Выполнить повторно» в форме `queue-log` отвечает `204` и ничего не делает.

**Причина** во всех случаях одна: площадка собрана в сертифицируемой сборке (`UniForm.Barebone`), обмен изъят из неё. Это не дефект и не поломка настроек — поведение записи очереди и ответ `204` ожидаемы.

**Что делать**: не тратить время на настройку обмена. Если площадка должна работать с обменом, она должна быть собрана в полной сборке: перевод площадки на сертифицируемую сборку — решение владельца продукта, и включить обмен обратно в такой сборке нечем. Записи типа «обмен с 1С» в очереди можно удалить: обработчика, который бы их разобрал, в сборке нет.

## 4. Диагностические SQL-запросы

Запросы для быстрой диагностики обмена с 1С:

```sql
set transaction isolation level read uncommitted;

-- Последние ошибки синхронизации
select top 50
        l.[Date],
        l.SettingsName,
        l.Origin,
        l.[Message],
        l.Duration
from dbo.Sync1CLog l with (nolock)
where l.[Message] like '%error%' or
      l.[Message] like '%exception%' or
      l.[Message] like '%ошибк%'
order by l.[Date] desc;

-- Очередь: застрявшие события
select
        q.SettingsName,
        q.RetryCount,
        count(*) as Cnt
from dbo.Sync1CEventQueues q with (nolock)
where q.RetryCount > 3
group by q.SettingsName, q.RetryCount
order by q.RetryCount desc;

-- Mapping пользователей 1С
select
        m.User1CLogin,
        m.UserID,
        u.FullName
from dbo.Sync1CUsersMap m with (nolock)
        join dbo.Users u with (nolock)
            on u.UserID = m.UserID
order by m.User1CLogin;
```

## 5. Параметры логирования и режимы аутентификации

Параметры логирования синхронизации и режимы аутентификации к веб-сервису 1С:

| Параметр | Значение | Описание |
|----------|----------|----------|
| `TC1C_SyncLog` | 0 | Логирование отключено |
| `TC1C_SyncLog` | 1 | Полные логи (по умолчанию) |
| `TC1C_SyncLog` | 2 | Только ошибки |
| `TC1C_DaysLogKept` | 7 | Хранить логи N дней (чистка по воскресеньям) |

| Тип (`OneCCredentialType`) | Когда использовать |
|----------------------------|-------------------|
| **Basic** | По умолчанию. Логин и пароль в HTTP-заголовке. Требует HTTPS |
| **Ntlm** | Доменная аутентификация Windows (NTLM) |
| **Windows** | Встроенная Windows-аутентификация (Kerberos/NTLM) |
| **Certificate** | Клиентский сертификат |

| Режим безопасности (`OneCSecurityMode`) | Описание |
|-----------------------------------------|----------|
| **TransportCredentialOnly** | По умолчанию. Учётные данные в заголовке, TLS опционально |
| **Transport** | Только TLS/SSL |
| **TransportWithMessageCredential** | TLS + WS-Security |

## 6. Поставочные артефакты модуля

Файлы модуля хранятся в категории **«Репозиторий версий приложения»**, задача **«Модуль 1С»**.

Префикс `YYYYMMDD_` в имени файла — дата сборки версии. Актуальная версия — файл с последней датой в имени.

### `YYYYMMDD_Расширение_ИнтеграцияСПервойФормой.cfe` — основной поставочный артефакт

Расширение конфигурации 1С (формат `.cfe`). Это то, что устанавливается клиенту — не затрагивает типовую конфигурацию 1С, накладывается поверх неё отдельным слоем.

**Что делает:** добавляет в 1С веб-сервис, через который 1Форма и 1С обмениваются данными по SOAP в обоих направлениях.

**Ключевое свойство:** расширение загружается **общим слоем** — устанавливается один раз и автоматически применяется ко всем базам клиента (Бухгалтерия, ЗУП и т.д.) без отдельного переноса на каждую.

**Установка клиенту:**

1. Открыть 1С Конфигуратор
2. Меню «Конфигурация» → «Расширения конфигурации» → «Добавить из файла» → выбрать `.cfe`
3. Перезапустить 1С в режиме предприятия
4. Опубликовать веб-сервис через Конфигуратор или утилиту публикации (Apache/IIS)
5. Передать клиенту URL веб-сервиса для указания в админке 1Формы (Администрирование → Синхронизации → 1С → поле «Адрес 1С»)

### `YYYYMMDD_Конфигурация_ИнтеграцияСПервойФормой.cf` — тестовая конфигурация

Полная конфигурация 1С (формат `.cf`). Используется **только разработчиками** — клиентам не передаётся.

**Что делает:** позволяет поднять изолированную 1С-базу с модулем интеграции без доступа к клиентской конфигурации. Аналог `DB_Test` на стороне 1С.

**Когда использовать:**

- Разработка и отладка изменений в модуле
- Регрессионная проверка перед передачей новой версии `.cfe` клиентам
- Воспроизведение ошибок без риска затронуть продуктивные данные

**Загрузка:**

1. Создать новую пустую базу 1С
2. Открыть Конфигуратор → «Конфигурация» → «Загрузить конфигурацию из файла» → выбрать `.cf`
3. Обновить конфигурацию базы данных

### Архивные артефакты и схема поставки

**`ИнтеграцияСПервойФормой.cfe` — предыдущая версия расширения**

Более ранняя версия расширения (без датированного префикса в имени — исходный формат до введения версионирования).

**Назначение:** архивная версия для отката, если в новой версии обнаружится регрессия у клиента. Перед заменой на новую версию рекомендуется убедиться, что старый `.cfe` сохранён в задаче.

**`Module1C.zip` — исторический архив**

Первоначальная поставка модуля (февраль 2025) в zip-архиве. Содержит ранние версии файлов модуля в едином архиве — формат, использовавшийся до разделения на `.cf` и `.cfe`.

**Назначение:** исторический артефакт, хранится для справки. В текущей работе не используется.

```
┌─ Разработка / тест ─────────────────────────────────────┐
│  .cf → загрузить в чистую 1С-базу                       │
│  (Конфигуратор → «Загрузить конфигурацию из файла»)     │
│  → проверить работу модуля, воспроизвести / исправить   │
│     ошибку                                              │
└─────────────────────────────────────────────────────────┘
                        ↓ проверено, OK
┌─ Поставка клиенту ──────────────────────────────────────┐
│  .cfe → Конфигуратор → Расширения → Добавить из файла   │
│  → опубликовать веб-сервис (Apache/IIS)                 │
│  → передать URL клиенту для настройки в админке 1Ф      │
└─────────────────────────────────────────────────────────┘
```
