Каждый разработчик 1С рано или поздно сталкивается с настоящей «мистикой»: на управляемой форме в режиме 1С:Предприятие отображаются поля, которых абсолютно точно нет в конфигураторе. Более того, глобальный поиск по конфигурации не находит программного создания этих элементов (нет методов ИзменитьРеквизиты(), Элементы.Добавить() или Элементы.Вставить()), а замер производительности и отладчик не показывают никаких подозрительных операций при открытии формы.
В этой статье мы подробно разберем, как устроен этот механизм платформы «1С:Предприятие 8.3», почему отладчик ведет себя подобным образом и как найти «невидимые» элементы формы.
Платформа 1С обладает мощным встроенным функционалом, который позволяет пользователям и администраторам кастомизировать интерфейс без привлечения программиста и изменения метаданных. Речь идет о механизме «Изменить форму».
Когда на форме присутствует какой-либо ссылочный реквизит (например, Контрагент с типом ссылки на справочник «Контрагенты»), платформа позволяет «вытащить» реквизиты этого контрагента (его ИНН, КПП, основной банковский счет, адрес и т.д.) прямо на форму текущего документа.
Давайте разберем по шагам, как это происходит в пользовательском режиме:
Объект.Контрагент.ИНН, КПП и Основной банковский счет.После этого платформа автоматически перестраивает форму и отображает выбранные поля. При этом в самой конфигурации никаких изменений не происходит, а данные для этих полей считываются динамически через разыменование ссылок («через точку»).
Разработчики часто пытаются найти причину появления полей с помощью замера производительности, устанавливая фильтр на методы программного изменения формы. Однако в данном случае замер не даст никаких результатов. Выясним причину этого поведения:
ИзменитьРеквизиты(). При добавлении пользовательских полей схема реквизитов формы не меняется. Новые реквизиты не регистрируются в памяти сервера как новые данные формы. Платформа просто визуализирует свойства уже существующего объекта (в нашем примере — контрагента).Утверждение о том, что этих элементов нет в коллекции ЭтаФорма.Элементы в режиме отладки — это частое заблуждение. Они там присутствуют, но имеют специфические особенности, из-за которых их трудно обнаружить:
Во-первых, особое именование. Платформа дает таким элементам составные системные имена. Если вы добавили поле ИНН через реквизит Контрагент, имя элемента формы в коллекции будет выглядеть как КонтрагентИНН (или иметь аналогичную системную структуру). Попытка найти элемент по ключевому слову "ИНН" в лоб через поиск в табло отладчика не увенчается успехом.
Во-вторых, иерархическое расположение. Эти элементы не лежат в корне коллекции элементов формы. Они жестко подчинены тому родительскому элементу (или группе), из которого они были извлечены. Проанализируем структуру коллекции:
// Пример обхода дерева элементов формы для поиска пользовательских полей
Для Каждого ТекущийЭлемент Из ЭтаФорма.Элементы Цикл
Если Найти(ТекущийЭлемент.Имя, "Контрагент") > 0 Тогда
// Здесь мы увидим системные элементы, добавленные пользователем
Сообщить("Найден элемент: " + ТекущийЭлемент.Имя + " с типом: " + ТипЗнч(ТекущийЭлемент));
КонецЕсли;
КонецЦикла;
Если вы хотите быстро убедиться, что «лишние» поля появились именно благодаря механизму пользовательской настройки, выполните следующие действия:
Если после нажатия кнопки «Применить» поля ИНН, КПП или Банковский счет мгновенно исчезли с формы — значит, гипотеза верна на 100%. Вы столкнулись именно с пользовательским переопределением формы.
Часто программисты недоумевают: «Я зашел под совершенно новым тестовым пользователем, а поля все равно видны! Как они могли появиться сами?».
Ответ кроется в механизмах администрирования 1С. Администратор системы или разработчик может настроить форму один раз под своей учетной записью, а затем скопировать эти настройки другим пользователям. Рассмотрим, как это делается:
В результате все новые и существующие пользователи базы данных увидят изменения интерфейса «из коробки», хотя в конфигураторе форма останется абсолютно чистой.
Все изменения разметки форм, сделанные пользователями, сохраняются в системных таблицах базы данных — в хранилище системных настроек. Разработчик может управлять ими программно. Например, если вам необходимо принудительно сбросить настройки формы для определенного пользователя или для всех пользователей сразу, можно использовать объект ХранилищеСистемныхНастроек.
Рассмотрим пример кода, который позволяет удалить пользовательские настройки формы программно:
// Программный сброс настроек формы документа для конкретного пользователя
ИмяФормыДляСброса = "Документ.ЗаявкаНаРасходованиеДенежныхСредств.Форма.ФормаДокумента";
ИмяПользователя = "ИвановИИ";
// Удаляем настройки внешнего вида формы из системного хранилища
ХранилищеСистемныхНастроек.Удалить(
ИмяФормыДляСброса + "/НастройкиФормы",
,
ИмяПользователя
);
Если вы проверили настройки формы, сбросили их до стандартных, но поля ИНН/КПП все равно остались, значит, работает другой популярный механизм современных конфигураций (особенно на базе БСП) — Дополнительные реквизиты и сведения.
В конфигурациях «Бухгалтерия предприятия» или «БИТ.Финанс» внедрена подсистема «Свойства» из Библиотеки Стандартных Подсистем. Она позволяет динамически выводить на форму новые поля, основываясь на метаданных, хранящихся в плане видов характеристик.
Как отличить этот механизм:
УправлениеСвойствамиПереопределяемый, УправлениеСвойствамиСлужебный).ПриСозданииНаСервере. Обычно он выглядит так:
УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма, Объект);
ИзменитьРеквизиты() и добавляет элементы в специально предназначенную для этого группу (обычно это группа с именем ГруппаДополнительныеРеквизиты).Чтобы управлять такими полями, вам не нужно менять код формы. Достаточно зайти в режим «1С:Предприятие», открыть раздел Администрирование -> Дополнительные реквизиты и сведения, найти нужный документ и отключить отображение неактуальных свойств.