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

Программист 1С v8.3 (Управляемые формы) Управленческий учет Финансы и профессиональные услуги
← На главную

Каждый разработчик 1С рано или поздно сталкивается с настоящей «мистикой»: на управляемой форме в режиме 1С:Предприятие отображаются поля, которых абсолютно точно нет в конфигураторе. Более того, глобальный поиск по конфигурации не находит программного создания этих элементов (нет методов ИзменитьРеквизиты(), Элементы.Добавить() или Элементы.Вставить()), а замер производительности и отладчик не показывают никаких подозрительных операций при открытии формы.

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

Суть явления: механизм пользовательской настройки формы

Платформа 1С обладает мощным встроенным функционалом, который позволяет пользователям и администраторам кастомизировать интерфейс без привлечения программиста и изменения метаданных. Речь идет о механизме «Изменить форму».

Когда на форме присутствует какой-либо ссылочный реквизит (например, Контрагент с типом ссылки на справочник «Контрагенты»), платформа позволяет «вытащить» реквизиты этого контрагента (его ИНН, КПП, основной банковский счет, адрес и т.д.) прямо на форму текущего документа.

Давайте разберем по шагам, как это происходит в пользовательском режиме:

  1. Пользователь открывает форму документа (например, «Заявка на расходование ДС») и нажимает кнопку Еще -> Изменить форму.
  2. В дереве элементов формы пользователь находит поле ссылки, например, Объект.Контрагент.
  3. При выделении этого поля становится активной кнопка Добавить поля на панели инструментов окна настройки.
  4. В открывшемся списке реквизитов справочника «Контрагенты» пользователь отмечает флажками ИНН, КПП и Основной банковский счет.
  5. Нажимает «ОК» и «Применить».

После этого платформа автоматически перестраивает форму и отображает выбранные поля. При этом в самой конфигурации никаких изменений не происходит, а данные для этих полей считываются динамически через разыменование ссылок («через точку»).

Почему отладчик и замер производительности «молчат»?

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

Где искать эти элементы в коллекции «Элементы» при отладке?

Утверждение о том, что этих элементов нет в коллекции ЭтаФорма.Элементы в режиме отладки — это частое заблуждение. Они там присутствуют, но имеют специфические особенности, из-за которых их трудно обнаружить:

Во-первых, особое именование. Платформа дает таким элементам составные системные имена. Если вы добавили поле ИНН через реквизит Контрагент, имя элемента формы в коллекции будет выглядеть как КонтрагентИНН (или иметь аналогичную системную структуру). Попытка найти элемент по ключевому слову "ИНН" в лоб через поиск в табло отладчика не увенчается успехом.

Во-вторых, иерархическое расположение. Эти элементы не лежат в корне коллекции элементов формы. Они жестко подчинены тому родительскому элементу (или группе), из которого они были извлечены. Проанализируем структуру коллекции:


// Пример обхода дерева элементов формы для поиска пользовательских полей
Для Каждого ТекущийЭлемент Из ЭтаФорма.Элементы Цикл
    Если Найти(ТекущийЭлемент.Имя, "Контрагент") > 0 Тогда
        // Здесь мы увидим системные элементы, добавленные пользователем
        Сообщить("Найден элемент: " + ТекущийЭлемент.Имя + " с типом: " + ТипЗнч(ТекущийЭлемент));
    КонецЕсли;
КонецЦикла;

Как проверить и доказать, что дело в настройках формы?

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

  1. Запустите сеанс «1С:Предприятие» под пользователем, у которого отображаются эти поля.
  2. Откройте проблемную форму.
  3. Нажмите Еще -> Изменить форму...
  4. В открывшемся окне настройки нажмите кнопку Еще (внутри самого окна настройки) и выберите пункт Установить стандартные настройки.

Если после нажатия кнопки «Применить» поля ИНН, КПП или Банковский счет мгновенно исчезли с формы — значит, гипотеза верна на 100%. Вы столкнулись именно с пользовательским переопределением формы.

Как эти настройки тиражируются между пользователями?

Часто программисты недоумевают: «Я зашел под совершенно новым тестовым пользователем, а поля все равно видны! Как они могли появиться сами?».

Ответ кроется в механизмах администрирования 1С. Администратор системы или разработчик может настроить форму один раз под своей учетной записью, а затем скопировать эти настройки другим пользователям. Рассмотрим, как это делается:

В результате все новые и существующие пользователи базы данных увидят изменения интерфейса «из коробки», хотя в конфигураторе форма останется абсолютно чистой.

Где хранятся эти настройки в базе данных и как их очистить программно?

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

Рассмотрим пример кода, который позволяет удалить пользовательские настройки формы программно:


// Программный сброс настроек формы документа для конкретного пользователя
ИмяФормыДляСброса = "Документ.ЗаявкаНаРасходованиеДенежныхСредств.Форма.ФормаДокумента";
ИмяПользователя = "ИвановИИ";

// Удаляем настройки внешнего вида формы из системного хранилища
ХранилищеСистемныхНастроек.Удалить(
    ИмяФормыДляСброса + "/НастройкиФормы", 
    , 
    ИмяПользователя
);

Альтернативный вариант: динамическое внедрение через БСП (Свойства)

Если вы проверили настройки формы, сбросили их до стандартных, но поля ИНН/КПП все равно остались, значит, работает другой популярный механизм современных конфигураций (особенно на базе БСП) — Дополнительные реквизиты и сведения.

В конфигурациях «Бухгалтерия предприятия» или «БИТ.Финанс» внедрена подсистема «Свойства» из Библиотеки Стандартных Подсистем. Она позволяет динамически выводить на форму новые поля, основываясь на метаданных, хранящихся в плане видов характеристик.

Как отличить этот механизм:

  1. Программный код создания элементов в этом случае действительно есть, но он находится глубоко внутри общих модулей БСП (например, УправлениеСвойствамиПереопределяемый, УправлениеСвойствамиСлужебный).
  2. В модуле самой формы документа вы увидите вызов процедуры инициализации свойств в обработчике ПриСозданииНаСервере. Обычно он выглядит так: УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, Объект);
  3. При выполнении этой процедуры БСП обращается к базе данных, считывает список дополнительных реквизитов для данного типа документа, программно вызывает метод ИзменитьРеквизиты() и добавляет элементы в специально предназначенную для этого группу (обычно это группа с именем ГруппаДополнительныеРеквизиты).

Чтобы управлять такими полями, вам не нужно менять код формы. Достаточно зайти в режим «1С:Предприятие», открыть раздел Администрирование -> Дополнительные реквизиты и сведения, найти нужный документ и отключить отображение неактуальных свойств.

← На главную