Как исправить ошибку отображения типов undefined и настроить запись в таблицы с IDENTITY при работе с внешними источниками данных в веб-клиенте 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Работа с внешними источниками данных (ВИД) в 1С — это мощный инструмент для интеграции с внешними SQL-базами, однако при его использовании в веб-клиенте разработчики часто сталкиваются со специфическими проблемами. Разберем ситуацию, когда попытка открыть внешнюю таблицу приводит к критическому сбою сессии, и выясним, почему стандартные механизмы записи могут конфликтовать с настройками SQL Server.

Проблема 1: Ошибка отображения лексического значения undefined в значение типа УникальныйИдентификатор

Рассмотрим сценарий: вы подключаете внешнюю базу данных, настраиваете таблицу как Объектную, выносите ее в интерфейс, но при попытке открытия в веб-клиенте (браузере) получаете ошибку: Ошибка отображения типов: Отображение лексического значения 'undefined' в значение типа 'УникальныйИдентификатор'. После этого работа в веб-клиенте становится невозможной, так как ошибка начинает преследовать пользователя при открытии любых других форм.

Анализируем причину:

Данная проблема была официально признана багом платформы 1С версии 8.3.16. Суть заключается в механизме сериализации данных. Когда веб-клиент обращается к серверу за данными объектной таблицы внешнего источника, платформа преобразует эти данные в формат JSON для передачи в браузер. В версиях 8.3.16 алгоритм формирования ссылки на объект ВИД работал некорректно: внутренний идентификатор записи (UUID) не передавался должным образом, и вместо него в JSON-пакет попадало значение undefined. Браузер, ожидая строгий тип УникальныйИдентификатор, выдавал программное исключение.

Решение проблемы:

  1. Обновление платформы: Данная ошибка была полностью исправлена, начиная с версии платформы 8.3.17. Если ваша информационная база работает на 8.3.16.1148 или аналогичных сборках этого релиза, единственным надежным способом устранения бага является переход на более актуальную версию 1С.
  2. Очистка кэша: Поскольку ошибка «отравляет» кэш метаданных в браузере, после обновления платформы или изменения настроек источника данных обязательно очистите кэш браузера или переименуйте таблицу/источник (как временная мера), чтобы форсировать обновление структуры данных на стороне клиента.
  3. Использование необъектных таблиц: На старых платформах проблему можно обойти, если переключить таблицу в режим «Необъектная». Однако в этом случае вы потеряете возможность использовать стандартные ссылочные связи, формы объектов и навигацию по UUID.

Проблема 2: Конфликт IDENTITY_INSERT при записи в SQL-таблицы

Вторая распространенная проблема возникает при попытке записи данных в таблицы, где первичный ключ (Primary Key) имеет свойство IDENTITY (автоинкремент на стороне SQL Server). Проанализируем типичную ошибку: Невозможно вставить явное значение для столбца идентификаторов в таблице, когда параметр IDENTITY_INSERT имеет значение OFF.

Выясним причину конфликта:

В SQL Server поля с IDENTITY заполняются автоматически самой СУБД. Если 1С пытается явно передать значение в это поле при выполнении команды INSERT, сервер блокирует операцию. Это часто случается, если в конфигураторе 1С таблица внешнего источника настроена как Необъектная.

Разберем способы решения:

Способ 1: Использование объектных таблиц

Как показывает практика, при переводе таблицы в статус Объектная платформа 1С начинает более корректно обрабатывать поля идентификаторов. В этом режиме 1С понимает структуру сущности и при добавлении новой записи исключает поле первичного ключа из SQL-запроса вставки, позволяя SQL Server самостоятельно сгенерировать ID. Убедитесь, что для ключевого поля в свойствах ВнешнегоИсточникаДанных установлены следующие параметры:

Способ 2: Настройка необъектных таблиц

Если вам необходимо использовать именно необъектную таблицу, проанализируем настройки полей. Даже если вы установите флаг «Только чтение» для поля ID, в некоторых версиях платформы 1С все равно может попытаться передать туда 0 или NULL при записи. В этом случае выполните следующие шаги:

  1. В свойствах поля в Конфигураторе найдите пункт «Выражение для заполнения».
  2. Оставьте его пустым или убедитесь, что логика заполнения не конфликтует с серверной.
  3. Если ошибка сохраняется, рассмотрите создание на стороне SQL Server триггера типа INSTEAD OF INSERT. Рассмотрим пример такого кода для SQL:
    
    CREATE TRIGGER tr_TestTable_Insert
    ON testtable
    INSTEAD OF INSERT
    AS
    BEGIN
        INSERT INTO testtable (name) -- Перечисляем все поля, КРОМЕ id
        SELECT name
        FROM inserted
    END;
    

    Такой триггер перехватит попытку вставки от 1С, проигнорирует переданный id и позволит СУБД самой назначить идентификатор.

    Технические нюансы окружения (ODBC и веб-сервер)

    Посмотрим на важные аспекты настройки серверного окружения, которые влияют на стабильность работы ВИД в веб-клиенте:

    • Драйвер ODBC: Рекомендуется использовать современный драйвер ODBC Driver 17 for SQL Server. Устаревший SQL Server Native Client 11.0 может некорректно транслировать типы данных в JSON-потоки веб-клиента.
    • Разрядность: Проверьте, чтобы разрядность установленного драйвера ODBC (x64) соответствовала разрядности сервера приложений 1С и веб-сервера (IIS или Apache).
    • Настройка IIS: При использовании IIS убедитесь, что пул приложений имеет достаточные права для обращения к драйверам ODBC и сетевым ресурсам внешней СУБД.

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

← На главную