Код, Наименование, Дата: работа со стандартными полями объекта в расширении конфигурации
Содержание
Чтобы добавить стандартный реквизит в расширение 1С, заимствуйте сам объект: в Конфигураторе щёлкните по нему правой кнопкой в дереве основной конфигурации и выберите Добавить в расширение. После этого все его стандартные реквизиты (Код, Наименование, Ссылка, Дата, Номер, ПометкаУдаления и другие) доступны в модулях, формах и запросах расширения. Создавать их отдельно не нужно, да и нельзя.
Дальше задача обычно сводится к одному: вывести поле на форму или использовать его в коде. Оба способа ниже, с примерами и разбором ошибок, которые появляются после обновления типовой конфигурации. Расширения есть в платформе начиная с 8.3.6, всё описанное относится к интерфейсу «Такси».
Как устроены стандартные реквизиты и почему их не создают в расширении
Стандартный реквизит — это поле, которое платформа добавляет объекту сама, по его типу. У справочника есть Код и Наименование, у документа — Номер и Дата, у регистра — Период и Регистратор. В дереве метаданных их не видно среди обычных реквизитов. В основной конфигурации они открываются кнопкой «Стандартные реквизиты» в палитре свойств объекта.
Набор стандартных полей задают свойства объекта в основной конфигурации:
- 📏 длина кода и наименования (если длина кода 0, поля
Коду справочника нет); - 🌳 иерархичность (без неё нет
РодительиЭтоГруппа); - 👥 список владельцев (без него нет
Владелец); - 📄 проведение документа (без него у документа нет признака
Проведен).
Расширение эти свойства не переопределяет. Поэтому команды «создать стандартный реквизит» в расширении нет. Есть заимствование: расширение получает ссылку на объект основной конфигурации и работает с ним со всеми его полями.
Если нужно только показать пользователю колонку Код или Наименование в списке, расширение может вообще не понадобиться. В форме списка откройте Ещё → Изменить форму и включите нужное поле. Настройка сохранится для этого пользователя.
Добавление стандартного реквизита в расширение: пошагово
Шаг 1. Создайте или откройте расширение
- Откройте базу в Конфигураторе.
- Выберите
Конфигурация → Расширения конфигурации. - Нажмите «Добавить», задайте имя и префикс, например
Расш1_. Префикс платформа подставит в имена новых объектов и процедур. - В списке расширений откройте дерево нового расширения.
Основная конфигурация тоже должна быть открыта (Конфигурация → Открыть конфигурацию), иначе заимствовать будет не из чего.
Шаг 2. Заимствуйте объект
- В дереве основной конфигурации найдите объект, например справочник
Номенклатура. - Правой кнопкой —
Добавить в расширение. - Если расширений несколько, выберите нужное.
В дереве расширения появится объект с пометкой о заимствовании. Внутри него уже есть все стандартные реквизиты оригинала. Обычные реквизиты и табличные части заимствуются отдельно, по мере надобности: так расширение меньше зависит от изменений типовой.
Шаг 3. Заимствуйте форму, если поле нужно вывести
- Раскройте в основной конфигурации ветку
Формыобъекта. - На нужной форме (элемента или списка) — правой кнопкой
Добавить в расширение. - Откройте заимствованную форму в дереве расширения.
Шаг 4. Сохраните и примените расширение
- Сохраните расширение.
- Выполните
Конфигурация → Обновить конфигурацию базы данных(F7) при активном окне расширения. - Запустите режим «1С:Предприятие» и проверьте форму.
Делайте это на копии базы, а в рабочую переносите готовый файл .cfe. Загрузка .cfe и обновление конфигурации базы данных — два отдельных действия: после загрузки файла его ещё нужно применить.
Синтаксис: имена стандартных реквизитов по типам объектов
Обращаются к стандартным полям так же, как к обычным: через точку от объекта, ссылки или таблицы запроса. Имена фиксированы платформой.
| Тип объекта | Основные стандартные реквизиты |
|---|---|
| Справочник | Ссылка, Код, Наименование, ПометкаУдаления, Предопределенный, ИмяПредопределенныхДанных, Родитель, ЭтоГруппа, Владелец, ВерсияДанных |
| Документ | Ссылка, Номер, Дата, Проведен, ПометкаУдаления, ВерсияДанных |
| План видов характеристик | Ссылка, Код, Наименование, ТипЗначения, Родитель |
| Регистр сведений | Период, Регистратор, НомерСтроки, Активность (последние три — у подчинённых регистратору) |
| Регистр накопления | Период, Регистратор, НомерСтроки, Активность, ВидДвижения (у регистра остатков) |
| Табличная часть | Ссылка, НомерСтроки |
Родитель, ЭтоГруппа и Владелец есть только при соответствующих свойствах объекта, см. первый раздел.
В модулях расширения
// В модуле формы элемента заимствованного справочника
КодТовара = Объект.Код;
Владелец = Объект.Владелец;
// От ссылки — платформа сама прочитает значение из базы
ДатаДокумента = ДокументСсылка.Дата;
В запросах
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Код,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(СтрШаблон("%1 — %2", Выборка.Код, Выборка.Наименование));
КонецЦикла;
Через метаданные
Проверить, есть ли поле у объекта, можно через коллекцию СтандартныеРеквизиты:
МетаСправочник = Метаданные.Справочники.Номенклатура;
ЕстьКод = МетаСправочник.ДлинаКода > 0;
Синоним = МетаСправочник.СтандартныеРеквизиты.Наименование.Синоним;
Такая проверка пригодится в общих модулях расширения, которые работают с несколькими справочниками сразу.
Вывод стандартного реквизита на форму
Есть два пути: перетащить поле в конструкторе заимствованной формы или добавить элемент программно при открытии. Разница — в устойчивости к обновлениям.
| Способ | Когда подходит | Риски |
|---|---|---|
| Конструктор формы | Разовая доработка, форма в типовой меняется редко | Если в новом релизе переименуют группу, куда вы положили поле, расширение не применится |
Программно в ПриСозданииНаСервере | Форма часто меняется в обновлениях, поле нужно в нескольких формах | Нужно писать и проверять код, элемент не виден в конструкторе |
Через конструктор
- Откройте заимствованную форму в расширении.
- В панели «Реквизиты» раскройте основной реквизит
Объект(у формы списка —Список). - Найдите
Кодили другой стандартный реквизит и перетащите его в дерево элементов, в нужную группу. - В свойствах элемента при необходимости задайте заголовок и
ТолькоПросмотр.
Платформа запомнит, что расширение изменило форму, и при открытии наложит изменения на типовую.
Программно
Код пишется в модуле заимствованной формы. Обработчик подключается к существующей процедуре формы через аннотацию &После:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Элементы.Найти("Расш1_Код") <> Неопределено Тогда
Возврат;
КонецЕсли;
Группа = Элементы.Найти("ГруппаШапка");
Если Группа = Неопределено Тогда
Поле = Элементы.Добавить("Расш1_Код", Тип("ПолеФормы"));
Иначе
Поле = Элементы.Добавить("Расш1_Код", Тип("ПолеФормы"), Группа);
КонецЕсли;
Поле.ПутьКДанным = "Объект.Код";
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ТолькоПросмотр = Истина;
КонецПроцедуры
Имя ГруппаШапка условное: посмотрите реальное имя группы в дереве элементов заимствованной формы. Если группа исчезнет в новом релизе, поле просто встанет в конец формы, а не сломает её.
Если в форме нет процедуры ПриСозданииНаСервере, аннотацию &После использовать не получится. Тогда в палитре свойств заимствованной формы, на закладке событий, назначьте свой обработчик события «При создании на сервере» в колонке расширения.
Колонка в форме списка
Для динамического списка путь к данным — Список.Код. Если колонка добавлена программно и остаётся пустой, значит, поле не попало в выборку списка. Включите его явно:
Список.УстановитьОбязательноеИспользование("Код", Истина);
Если нужного стандартного реквизита у объекта нет
Частая ситуация: у справочника длина кода равна нулю, а коду нужно быть. Заимствование тут не поможет — поля нет в самом объекте.
Варианты:
- ➕ Свой реквизит в заимствованном объекте. В платформе 8.3.11 и новее к заимствованному справочнику или документу можно добавить собственный реквизит, например
Расш1_Кодс типом «Строка». Данные хранятся в базе, при применении расширения таблица реструктурируется. - 🧮 Вычисляемое поле на форме. Если нужно только показать значение (например, номер документа с префиксом), добавьте реквизит формы и заполняйте его при открытии.
- 🛠️ Доработка основной конфигурации. Изменить длину кода можно только в основной конфигурации, сняв её с полной поддержки. Это уже не расширение, и обновления станут дороже.
Свой реквизит в объекте меняет структуру таблицы. На большом справочнике или документе применение расширения займёт время: делайте это вне рабочих часов, когда в базе нет активной работы.
Что происходит при обновлении типовой конфигурации
При каждом запуске платформа сверяет расширение с основной конфигурацией. Для заимствованных объектов проверяются контролируемые свойства. Если объект или форма в типовой изменились несовместимо, расширение не применяется, а пользователи видят предупреждение.
Что чаще всего ломается:
- 🔀 Переименовали группу формы, в которую вы положили поле через конструктор.
- 🗑️ Удалили или переименовали процедуру формы, к которой прицеплен
&Послеили&Перед. - 📐 Изменили свойства объекта, от которых зависит стандартный реквизит: например, выключили иерархию — пропал
Родитель.
Как проверять перед обновлением рабочей базы:
- Обновите копию базы на новый релиз.
- Загрузите в неё то же расширение.
- В Конфигураторе откройте расширение и выполните синтаксический контроль модулей.
- Откройте в пользовательском режиме все формы, которые изменяет расширение.
Если форма сильно переработана, проще удалить её заимствование и заимствовать заново, а поле добавить кодом. Тогда следующее обновление пройдёт без правок.
Производительность: как не замедлить формы и списки
Сам по себе стандартный реквизит дешёвый. Код, Наименование, Дата, Номер лежат в основной таблице объекта, и платформа строит по ним индексы. Тормоза появляются из-за того, что выводят рядом с ними.
Что держать под контролем:
- 🔗 Разыменование в списках. Колонка
Список.Владелец.Наименованиедобавляет соединение с таблицей владельца. На списке из сотен тысяч строк это заметно. Если хватает самой ссылки на владельца, выводитеСписок.Владелец. - 🔁 Обращения к ссылке в цикле.
Ссылка.Кодвнутри цикла по тысячам строк — это тысячи отдельных чтений из базы. Получите все коды одним запросом. - 🧱 Лишние поля в обязательном использовании.
УстановитьОбязательноеИспользованиезаставляет список выбирать поле всегда, даже если колонку скрыли. Включайте его только для полей, без которых форма не работает. - 🖥️ Работа на клиенте. Обращение
Объект.Ссылка.Кодиз клиентской процедуры вызывает сервер. Нужное значение передайте на форму при создании.
Пример замены цикла одним запросом:
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Т.Ссылка КАК Ссылка,
| Т.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Т
|ГДЕ
| Т.Ссылка В (&Список)");
Запрос.УстановитьПараметр("Список", МассивСсылок);
Коды = Новый Соответствие;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Коды.Вставить(Выборка.Ссылка, Выборка.Код);
КонецЦикла;
Дальше код берётся из соответствия Коды[Ссылка] без обращения к базе.
Частые вопросы
Можно ли в расширении поменять синоним стандартного реквизита?
Нужно ли заимствовать объект, чтобы прочитать его Код в общем модуле расширения?
Сохранится ли поле на форме, если пользователь настроил форму под себя?
Почему в конструкторе формы не видно стандартных реквизитов объекта?
Объект в панели «Реквизиты». Если нужного поля нет и там, его нет у объекта: проверьте длину кода, иерархию и владельцев в основной конфигурации.