Код, Наименование, Дата: работа со стандартными полями объекта в расширении конфигурации

· 9 мин

Содержание

Чтобы добавить стандартный реквизит в расширение 1С, заимствуйте сам объект: в Конфигураторе щёлкните по нему правой кнопкой в дереве основной конфигурации и выберите Добавить в расширение. После этого все его стандартные реквизиты (Код, Наименование, Ссылка, Дата, Номер, ПометкаУдаления и другие) доступны в модулях, формах и запросах расширения. Создавать их отдельно не нужно, да и нельзя.

Дальше задача обычно сводится к одному: вывести поле на форму или использовать его в коде. Оба способа ниже, с примерами и разбором ошибок, которые появляются после обновления типовой конфигурации. Расширения есть в платформе начиная с 8.3.6, всё описанное относится к интерфейсу «Такси».

Как устроены стандартные реквизиты и почему их не создают в расширении

Стандартный реквизит — это поле, которое платформа добавляет объекту сама, по его типу. У справочника есть Код и Наименование, у документа — Номер и Дата, у регистра — Период и Регистратор. В дереве метаданных их не видно среди обычных реквизитов. В основной конфигурации они открываются кнопкой «Стандартные реквизиты» в палитре свойств объекта.

Набор стандартных полей задают свойства объекта в основной конфигурации:

  • 📏 длина кода и наименования (если длина кода 0, поля Код у справочника нет);
  • 🌳 иерархичность (без неё нет Родитель и ЭтоГруппа);
  • 👥 список владельцев (без него нет Владелец);
  • 📄 проведение документа (без него у документа нет признака Проведен).

Расширение эти свойства не переопределяет. Поэтому команды «создать стандартный реквизит» в расширении нет. Есть заимствование: расширение получает ссылку на объект основной конфигурации и работает с ним со всеми его полями.

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

Добавление стандартного реквизита в расширение: пошагово

Шаг 1. Создайте или откройте расширение

  1. Откройте базу в Конфигураторе.
  2. Выберите Конфигурация → Расширения конфигурации.
  3. Нажмите «Добавить», задайте имя и префикс, например Расш1_. Префикс платформа подставит в имена новых объектов и процедур.
  4. В списке расширений откройте дерево нового расширения.

Основная конфигурация тоже должна быть открыта (Конфигурация → Открыть конфигурацию), иначе заимствовать будет не из чего.

Шаг 2. Заимствуйте объект

  1. В дереве основной конфигурации найдите объект, например справочник Номенклатура.
  2. Правой кнопкой — Добавить в расширение.
  3. Если расширений несколько, выберите нужное.

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

Шаг 3. Заимствуйте форму, если поле нужно вывести

  1. Раскройте в основной конфигурации ветку Формы объекта.
  2. На нужной форме (элемента или списка) — правой кнопкой Добавить в расширение.
  3. Откройте заимствованную форму в дереве расширения.

Шаг 4. Сохраните и примените расширение

  1. Сохраните расширение.
  2. Выполните Конфигурация → Обновить конфигурацию базы данных (F7) при активном окне расширения.
  3. Запустите режим «1С:Предприятие» и проверьте форму.

Делайте это на копии базы, а в рабочую переносите готовый файл .cfe. Загрузка .cfe и обновление конфигурации базы данных — два отдельных действия: после загрузки файла его ещё нужно применить.

Синтаксис: имена стандартных реквизитов по типам объектов

Обращаются к стандартным полям так же, как к обычным: через точку от объекта, ссылки или таблицы запроса. Имена фиксированы платформой.

Тип объектаОсновные стандартные реквизиты
СправочникСсылка, Код, Наименование, ПометкаУдаления, Предопределенный, ИмяПредопределенныхДанных, Родитель, ЭтоГруппа, Владелец, ВерсияДанных
ДокументСсылка, Номер, Дата, Проведен, ПометкаУдаления, ВерсияДанных
План видов характеристикСсылка, Код, Наименование, ТипЗначения, Родитель
Регистр сведенийПериод, Регистратор, НомерСтроки, Активность (последние три — у подчинённых регистратору)
Регистр накопленияПериод, Регистратор, НомерСтроки, Активность, ВидДвижения (у регистра остатков)
Табличная частьСсылка, НомерСтроки

Родитель, ЭтоГруппа и Владелец есть только при соответствующих свойствах объекта, см. первый раздел.

В модулях расширения

// В модуле формы элемента заимствованного справочника
КодТовара = Объект.Код;
Владелец  = Объект.Владелец;

// От ссылки — платформа сама прочитает значение из базы
ДатаДокумента = ДокументСсылка.Дата;

В запросах

Запрос = Новый Запрос;
Запрос.Текст =
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка,
	|	Номенклатура.Код,
	|	Номенклатура.Наименование
	|ИЗ
	|	Справочник.Номенклатура КАК Номенклатура
	|ГДЕ
	|	НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(СтрШаблон("%1 — %2", Выборка.Код, Выборка.Наименование));
КонецЦикла;

Через метаданные

Проверить, есть ли поле у объекта, можно через коллекцию СтандартныеРеквизиты:

МетаСправочник = Метаданные.Справочники.Номенклатура;
ЕстьКод = МетаСправочник.ДлинаКода > 0;
Синоним = МетаСправочник.СтандартныеРеквизиты.Наименование.Синоним;

Такая проверка пригодится в общих модулях расширения, которые работают с несколькими справочниками сразу.

Вывод стандартного реквизита на форму

Есть два пути: перетащить поле в конструкторе заимствованной формы или добавить элемент программно при открытии. Разница — в устойчивости к обновлениям.

СпособКогда подходитРиски
Конструктор формыРазовая доработка, форма в типовой меняется редкоЕсли в новом релизе переименуют группу, куда вы положили поле, расширение не применится
Программно в ПриСозданииНаСервереФорма часто меняется в обновлениях, поле нужно в нескольких формахНужно писать и проверять код, элемент не виден в конструкторе

Через конструктор

  1. Откройте заимствованную форму в расширении.
  2. В панели «Реквизиты» раскройте основной реквизит Объект (у формы списка — Список).
  3. Найдите Код или другой стандартный реквизит и перетащите его в дерево элементов, в нужную группу.
  4. В свойствах элемента при необходимости задайте заголовок и ТолькоПросмотр.

Платформа запомнит, что расширение изменило форму, и при открытии наложит изменения на типовую.

Программно

Код пишется в модуле заимствованной формы. Обработчик подключается к существующей процедуре формы через аннотацию &После:

&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

	Если Элементы.Найти("Расш1_Код") <> Неопределено Тогда
		Возврат;
	КонецЕсли;

	Группа = Элементы.Найти("ГруппаШапка");
	Если Группа = Неопределено Тогда
		Поле = Элементы.Добавить("Расш1_Код", Тип("ПолеФормы"));
	Иначе
		Поле = Элементы.Добавить("Расш1_Код", Тип("ПолеФормы"), Группа);
	КонецЕсли;

	Поле.ПутьКДанным = "Объект.Код";
	Поле.Вид = ВидПоляФормы.ПолеВвода;
	Поле.ТолькоПросмотр = Истина;

КонецПроцедуры

Имя ГруппаШапка условное: посмотрите реальное имя группы в дереве элементов заимствованной формы. Если группа исчезнет в новом релизе, поле просто встанет в конец формы, а не сломает её.

Если в форме нет процедуры ПриСозданииНаСервере, аннотацию &После использовать не получится. Тогда в палитре свойств заимствованной формы, на закладке событий, назначьте свой обработчик события «При создании на сервере» в колонке расширения.

Колонка в форме списка

Для динамического списка путь к данным — Список.Код. Если колонка добавлена программно и остаётся пустой, значит, поле не попало в выборку списка. Включите его явно:

Список.УстановитьОбязательноеИспользование("Код", Истина);

Если нужного стандартного реквизита у объекта нет

Частая ситуация: у справочника длина кода равна нулю, а коду нужно быть. Заимствование тут не поможет — поля нет в самом объекте.

Варианты:

  • ➕ Свой реквизит в заимствованном объекте. В платформе 8.3.11 и новее к заимствованному справочнику или документу можно добавить собственный реквизит, например Расш1_Код с типом «Строка». Данные хранятся в базе, при применении расширения таблица реструктурируется.
  • 🧮 Вычисляемое поле на форме. Если нужно только показать значение (например, номер документа с префиксом), добавьте реквизит формы и заполняйте его при открытии.
  • 🛠️ Доработка основной конфигурации. Изменить длину кода можно только в основной конфигурации, сняв её с полной поддержки. Это уже не расширение, и обновления станут дороже.

Свой реквизит в объекте меняет структуру таблицы. На большом справочнике или документе применение расширения займёт время: делайте это вне рабочих часов, когда в базе нет активной работы.

Что происходит при обновлении типовой конфигурации

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

Что чаще всего ломается:

  • 🔀 Переименовали группу формы, в которую вы положили поле через конструктор.
  • 🗑️ Удалили или переименовали процедуру формы, к которой прицеплен &После или &Перед.
  • 📐 Изменили свойства объекта, от которых зависит стандартный реквизит: например, выключили иерархию — пропал Родитель.

Как проверять перед обновлением рабочей базы:

  1. Обновите копию базы на новый релиз.
  2. Загрузите в неё то же расширение.
  3. В Конфигураторе откройте расширение и выполните синтаксический контроль модулей.
  4. Откройте в пользовательском режиме все формы, которые изменяет расширение.

Если форма сильно переработана, проще удалить её заимствование и заимствовать заново, а поле добавить кодом. Тогда следующее обновление пройдёт без правок.

Диагностика: выберите симптом

Производительность: как не замедлить формы и списки

Сам по себе стандартный реквизит дешёвый. Код, Наименование, Дата, Номер лежат в основной таблице объекта, и платформа строит по ним индексы. Тормоза появляются из-за того, что выводят рядом с ними.

Что держать под контролем:

  • 🔗 Разыменование в списках. Колонка Список.Владелец.Наименование добавляет соединение с таблицей владельца. На списке из сотен тысяч строк это заметно. Если хватает самой ссылки на владельца, выводите Список.Владелец.
  • 🔁 Обращения к ссылке в цикле. Ссылка.Код внутри цикла по тысячам строк — это тысячи отдельных чтений из базы. Получите все коды одним запросом.
  • 🧱 Лишние поля в обязательном использовании. УстановитьОбязательноеИспользование заставляет список выбирать поле всегда, даже если колонку скрыли. Включайте его только для полей, без которых форма не работает.
  • 🖥️ Работа на клиенте. Обращение Объект.Ссылка.Код из клиентской процедуры вызывает сервер. Нужное значение передайте на форму при создании.

Пример замены цикла одним запросом:

Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	Т.Ссылка КАК Ссылка,
	|	Т.Код КАК Код
	|ИЗ
	|	Справочник.Номенклатура КАК Т
	|ГДЕ
	|	Т.Ссылка В (&Список)");
Запрос.УстановитьПараметр("Список", МассивСсылок);
Коды = Новый Соответствие;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Коды.Вставить(Выборка.Ссылка, Выборка.Код);
КонецЦикла;

Дальше код берётся из соответствия Коды[Ссылка] без обращения к базе.

Частые вопросы

Можно ли в расширении поменять синоним стандартного реквизита?
Надёжнее менять заголовок не у реквизита, а у элемента формы. Для этого в заимствованной форме задайте свойство «Заголовок» у поля или установите его кодом при создании формы.
Нужно ли заимствовать объект, чтобы прочитать его Код в общем модуле расширения?
Нет. Обратиться к справочнику или документу основной конфигурации из кода можно и без заимствования. Заимствование нужно, чтобы менять сам объект, его формы или модули.
Сохранится ли поле на форме, если пользователь настроил форму под себя?
Пользовательские настройки накладываются поверх формы с расширением. Новый элемент появится, но пользователь может его скрыть, а сброс настроек вернёт видимость.
Почему в конструкторе формы не видно стандартных реквизитов объекта?
Раскройте основной реквизит Объект в панели «Реквизиты». Если нужного поля нет и там, его нет у объекта: проверьте длину кода, иерархию и владельцев в основной конфигурации.
Подойдёт ли способ для конфигурации на поддержке без возможности изменений?
Да, ради этого расширения и существуют: основная конфигурация остаётся на полной поддержке, а все доработки лежат в расширении.