Разработчику надо понимать разницу между реквизитом объекта, реквизитом формы и элементом формы. Это три разных уровня абстракции:
-
Реквизит объекта: это описание колонки в таблице базы данных. Он используется для хранения и последующего использования информации.
-
Реквизит формы: это переменная в оперативной памяти, которая существует только пока открыто конкретное окно формы. После закрытия формы, переменная удаляется.
-
Элемент формы: это визуальный объект формы (поле ввода, флажок и т.д.), который пользователь видит на экране и с которым взаимодействует.
Чтобы пользователь мог что-то ввести на экране, создается Элемент формы и связывается с Реквизитом формы, а тот, в свою очередь, может быть связан с Реквизитом объекта, если данные надо сохранить.
Далее перед разработчиком развилка: нужно ли это поле в базе данных для последующего использования или оно нужно только «здесь и сейчас» для удобства работы пользователя?
Добавление реквизита на форму без сохранения данных в БД
Если данные нужны только для визуализации или промежуточных расчетов — добавляются реквизит формы и элемент формы. Обычно это делается программно:
-
Минимизация конфликтов при обновлении. Если 1С изменила форму, код либо отработает штатно, либо просто выдаст мягкое предупреждение, не ломая всю форму целиком. В последствии не нужно лезть и «вручную» перепривязывать элементы в конфигураторе.
-
Динамическое управление интерфейсом. Программный метод позволяет легко управлять видимостью и составом данных в зависимости от нужных условий.
-
Тиражируемость. Буквально — если нужно добавить один и тот же реквизит в большое количество форм, то можно использовать переопределяемый общий модуль БСП, который вызывается при создании форм конфигурации.
Пример кода:
//КодПример
//1. Добавляем данные (Реквизит формы). Те самые, которые живут, пока жива форма.
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(
Новый РеквизитФормы("МойРеквизит1", //Имя реквизита формы. То, как он будет называться в дереве реквизитов формы
Новый ОписаниеТипов("СправочникСсылка.НазваниеСправочника1"), //описание типа реквизита
, //Путь до самого реквизита, не включая его имя.
Нстр("ru='Заголовок поля'")) //подпись реквизита на форме
);
МассивРеквизитов.Добавить(Новый РеквизитФормы("МойРеквизит2", Новый ОписаниеТипов("Строка"), , "Заголовок поля 2"));
//Важно. Вызывать метод ИзменитьРеквизиты() тогда, когда полностью сформирован массив с добавляемыми реквизитами,
//т.к. это тяжелая операция.
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
// 2. Добавляем визуальный элемент на форме (Элемент формы)
НовыйЭлемент = Элементы.Добавить("ПолеМойРеквизит1", Тип("ПолеФормы"), ЭтаФорма.ГруппаШапка);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "МойРеквизит1"; // Связываем элемент с данными
НовыйЭлемент.УстановитьДействие("ПриИзменении", "МояПроцедураПриИзменении"); // Добавление события “ПриИзменении” и назначение ему обработчика “МояПроцедураПриИзменении”
НовыйЭлемент.Видимость = Истина; //Видиомость элемента на форме
НовыйЭлемент.ТолькоПросмотр = Истина; //Возможность редактирования элемента н форме.
НовыйЭлемент = Элементы.Вставить("ПолеМойРеквизит2", //уникальное имя нового элемента формы
Тип("ПолеФормы"), //Тип добавляемого объекта на форму.
ЭтаФорма.ГруппаШапка, // Куда именно вставляем - на форму или в какую-то группу/страницу
Элементы.КнопкаЗакрыть //элемент, перед которым вставляется добавляемый элемент.
);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "МойРеквизит2"; // Связываем элемент с данными
Добавление кода в Расширение
Самый быстрый способ. Не затрагивается структура основной конфигурации, а меняется только пользовательский интерфейс:
-
Создается расширение, если его нет. Затем заходим в форму, которую хотим расширить в основной конфигурации, заходим в модуль этой формы.
-
Правой кнопкой по процедуре ПриСозданииНаСервере(), добавить в расширение. Почему именно так? Если кратко — это событие, выполняющиеся на сервере один раз до отображения формы пользователю и уже имеющее доступ к данным объекта.
-
«Метод является обработчиком события. Добавить расширение обработчика?» В предложенном окне выбора нажимаем «Да». Выбирается этот вариант, т.к. платформа автоматически пропишет в свойствах формы из расширения это событие с соответствующие аннотацией.
-
Далее выбирается тип перехвата «После». Для обработчиков событий есть три аннотации: «Перед», «После» и «Вместо». Выбирается «После», т.к. ОБЫЧНО требуется чтобы сначала отработал типовой код. Но всё зависит от контекста задачи.
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
//КодПример
КонецПроцедуры
Плюсы:
-
Быстрая реализация для одной формы.
-
Основная конфигурация остается на поддержке.
Минусы:
-
При изменении формы в основной конфигурации, расширение может не примениться.
Добавление кода в переопределяемые модули БСП
Чтобы программно доработать форму через БСП должны выполняться следующие условия:
-
Наличие БСП.
-
В режиме Предприятие: «Функции для тех. специалиста» — Регистр сведений «ВерсииПодсистем» — должна быть строка СтандартныеПодсистемы / StandardSubsystems.
-
В Конфигураторе: «Общие» — «Подсистемы» должна присутствовать подсистема СтандартныеПодсистемы.
-
-
Для того чтобы код вызвался, в типовой дорабатываемой форме должен быть (в процедуре ПриСозданииНаСервере) стандартный вызов СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);
Если эти условия выполняются, тогда можно приступать к реализации:
-
Находим общий модуль МодификацияКонфигурацииПереопределяемый в дереве метаданных конфигурации, открываем его с сохранением поддержки.
-
В процедуру ПриСозданииНаСервере добавляем следующий код:
Если Форма.ИмяФормы = "Справочник.НазваниеСправочника1.Форма.НазваниеФормы" Тогда
//Это условие важно, т.к. в данная процедура вызывается для многих форм, а добавлять код нужно в конкретную(ые).
//КодПример
ИначеЕсли Форма.ИмяФормы = "Справочник.НазваниеСправочника2.Форма.НазваниеФормы" Тогда
//КодПример
КонецЕсли;
Плюсы:
-
Можно добавить реквизит сразу в 10 разных форм из одного модуля.
Минусы:
-
Частичное снятие конфигурации с поддержки.
Добавление реквизита на форму с сохранением данных в БД
Если всё же нужно сохранять реквизит в БД, следует определиться с тем, как в дальнейшем он будет использоваться.
При выполнении любого из этих условий стоит добавлять реквизит в дерево метаданных, а затем программно выводить его на форму:
-
Будет использоваться в сложных алгоритмах, логику которых надо программировать.
-
Принадлежит объекту метаданных с огромным количеством записей и в него надо добавить сразу с десяток дополнительных реквизитов на форму.
-
Нуждается в настройках прав доступа.
-
Меняется несколько раз в день.
-
Пользователю критично расположение реквизита на форме.
В противном случае можно присмотреться к механизму дополнительных реквизитов и сведений.
Добавление реквизита в дереве метаданных: основная конфигурация или расширение
Следует помнить, что т.к. реквизит объекта уже существует в дереве метаданных, то он автоматически добавляется в «объект» на форму в качестве реквизита формы. Поэтому создавать его самому не надо, задача сводится только к созданию для него элемента формы и их связыванию.
//КодПример
//Добавляем визуальный элемент на форме (Элемент формы)
НовыйЭлемент = Элементы.Добавить("ПолеМойРеквизит1", Тип("ПолеФормы"), ЭтаФорма.ГруппаШапка);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "Объект.МойРеквизит1"; // Связываем элемент с реквизитом объекта
Добавление реквизита в дерево метаданных — это создание полноценной колонки в таблице БД объекта для основной конфигурации и созданиедополнительной таблицы в БД для расширяемого объекта, если использовать расширение. Это надо учитывать при добавлении.
Чтобы решить, что оптимальней использовать, приведем сравнение по некоторым основным критериям.
|
Основная конфигурация |
Расширение |
|
|
Поддержка |
Снятие с поддержки объекта — риск случайного изменения в конфигураторе, дополнительные сложности при обновлении. |
Основная конфигурация остается на полной поддержке. |
|
Сохранность данных |
Реквизит — часть основной таблицы БД. Максимальная сохранность. |
Реквизит является частью другой таблицы БД, не основной. Хранящиеся данные напрямую связаны с активностью расширения. Расширение выключено — данные не активны, удалено — данные удалены. |
|
Производительность |
Реквизит — часть основной таблицы БД. Максимальная скорость. |
Данные объекта получаются с помощью левого соединения основной таблицы БД объекта и дополнительной, таблицы расширения. |
Механизм дополнительных реквизитов и сведений (БСП)
Этот способ позволяет добавлять реквизиты на форму в предприятии не программно, при условии, что подключена БСП и механизм дополнительных реквизитов.
Как проверить БСП, было сказано ранее, механизм дополнительных реквизитов и сведений является её частью.
-
Настройка: Зайдите в «Администрирование» — «Общие настройки» — галка «Дополнительные реквизиты и сведения».
-
Выбор объекта: Найдите в списке нужный объект (например, «Справочник Номенклатура»).
-
Создание реквизита: Добавить → Новый. Заполните его описание.
-
Размещение: Поле автоматически появится в специальной группе «Дополнительно» на форме объекта.
-
Заполнение: Пользователи могут сразу вводить данные.
Плюсы:
-
Не надо писать код.
-
Меньше проблем при обновлении типовой конфигурации
-
Не нужно выгонять пользователей из базы (не требуется монопольный доступ).
Минусы:
-
Запросы работают медленнее, чем по обычным полям, т.к. данные хранятся в табличных частях объекта, регистре сведений и плане видов характеристик, с которым потом надо соединяться.
Резюме по способам добавления реквизитов на форму
-
Программный реквизит формы: используйте этот вариант для временных расчетов или визуализации данных, которые не нужно хранить в базе данных.
-
Дополнительные реквизиты и сведения (БСП): выбирайте этот способ, если нужно дать пользователям возможность самим добавлять поля без изменения кода и конфигурации.
-
Реквизит в расширении: оптимально для быстрого добавления хранимых данных без снятия основной конфигурации с поддержки, но с учетом затрат на производительность.
-
Реквизит в основной конфигурации: используйте для критически важных данных, участвующих в сложных расчетах и тяжелых отчетах, где важна максимальная производительность и сохранность.
-
Переопределяемые модули БСП: применяйте этот метод, когда необходимо программно вывести один и тот же реквизит сразу на множество различных форм из единой точки управления.
Вступайте в нашу телеграмм-группу Инфостарт