Почему пропадают реквизиты с определяемым типом на форме документа в 1С:ERP?

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

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

Проанализируем природу этой неполадки, разберем внутренние механизмы платформы «1С:Предприятие 8.3» и рассмотрим пошаговые способы диагностики и устранения ошибки.

Механизм защитной инициализации форм в платформе

Для понимания причин такого поведения необходимо изучить алгоритм построения управляемой формы. В платформе 1С действует механизм защитной инициализации элементов интерфейса:

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

Аналогичное поведение наблюдается в случаях, когда реквизит имеет составной тип или ссылается на определяемый тип (например, ОпределяемыйТип.GLN), который в подключенном расширении конфигурации переопределен с другим составом типов или ссылается на метаданные, к которым у пользователя нет прав на чтение.

Причина ошибки: конфликт определяемого типа в расширении

Выясним причину, которая чаще всего приводит к исчезновению полей с типом GLN (например, «GLN организации», «GLN контрагента») и других подобных реквизитов. Главным источником проблемы является некорректное заимствование определяемого типа в расширение конфигурации:

  1. Определяемый тип был добавлен в расширение разработчиком (случайно или намеренно при заимствовании связанных объектов).
  2. В расширении состав типов для этого объекта изменился (например, указан тип Строка вместо ссылки, либо урезан состав составного типа).
  3. В свойствах заимствованного объекта в расширении было отключено свойство Проверять значение при подключении расширения, из-за чего расширение успешно применилось без ошибок компиляции.
  4. В момент открытия формы документа платформа обнаруживает несовпадение метаданных расширения и основной конфигурации и исключает реквизит из контекста формы.

Ограничения платформы и режимы совместимости

Рассмотрим важные платформенные нюансы, связанные с расширениями и определяемыми типами:

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

Права доступа: Если определяемый тип расширяется ссылочными типами данных, отсутствие у текущей роли пользователя прав Чтение или Просмотр на добавленный объект метаданных приведет к тому, что платформа скроет весь реквизит целиком.

Пошаговое решение проблемы

Разберем по шагам порядок действий для восстановления нормального отображения реквизитов.

Шаг 1. Локализация конфликта в расширениях

Проверим все подключенные к информационной базе расширения:

  1. Откроем конфигуратор и перейдем в меню Конфигурация — Расширения конфигурации.
  2. Поочередно проверим дерево метаданных каждого активного расширения в ветке Общие — Определяемые типы.
  3. Найдем определяемый тип, вызвавший сбой (в нашем случае — GLN).

Шаг 2. Исправление или удаление определяемого типа

В зависимости от архитектурных задач выберем один из вариантов:

Вариант А (если определяемый тип попал в расширение случайно): Удалим объект GLN из расширения конфигурации. Это наиболее частое и простое решение, полностью восстанавливающее типовое поведение реквизитов.

Вариант Б (если переопределение типа действительно необходимо): Приведем типы в расширении в полное соответствие с логикой конфигурации:

  1. Убедимся, что режим совместимости конфигурации и расширения установлен не ниже 8.3.20.
  2. Включим в расширение все типы данных, которые входят в состав определяемого типа в основной конфигурации.
  3. Проверим наличие флага Проверять значение при подключении расширения.
  4. Убедимся, что во всех ролях расширения добавлены права на чтение добавленных типов.

Шаг 3. Очистка кэша метаданных

После внесения изменений в расширение необходимо сбросить кэшированную структуру данных платформы. На практике метаданные расширений могут застревать в локальном кэше клиента и сервера 1С, продолжая скрывать элементы даже после корректного исправления метаданных. Перезапустим сеанс «1С:Предприятия» с очисткой временных файлов пользователя или запуском с ключом /ClearCache.

Альтернативные способы доработки

Если в рамках доработки требуется хранить данные иного формата, но изменять типовой определяемый тип нежелательно из-за риска конфликтов при обновлениях, применим следующие проектные решения:

  1. Использование дополнительных реквизитов БСП: Задействуем встроенную подсистему «Свойства» библиотеки стандартных подсистем. Это позволяет гибко настраивать дополнительные реквизиты любых типов без модификации метаданных конфигурации.
  2. Собственный реквизит документа в расширении: Создадим в расширении отдельный реквизит с требуемым специфическим типом и выведем его на форму. При проведении документа программно преобразуем значение в базовый формат и запишем в типовой реквизит документа через обработчики событий.
← На главную