Свои поля в типовом документе без снятия с поддержки: реквизиты через расширение

· 9 мин

Содержание

Чтобы добавить реквизит в расширение 1С, заимствуйте нужный справочник или документ в расширение (контекстное меню объекта в основной конфигурации → Добавить в расширение), откройте заимствованный объект и на вкладке «Данные» создайте новый реквизит с префиксом расширения в имени. Затем заимствуйте форму объекта, перетащите реквизит на форму и выполните Обновить конфигурацию базы данных для расширения. Основная конфигурация остаётся на поддержке и обновляется как обычно.

Добавлять свои реквизиты к заимствованным объектам платформа умеет с версии 8.3.11. Сами расширения появились раньше, в 8.3.6, но первые версии меняли только интерфейс и код. Если у вас платформа с номером ниже 8.3.11, вкладка «Данные» у заимствованного объекта будет недоступна для добавления.

Всё описанное ниже общее для платформы и не зависит от конфигурации: шаги одинаковы для Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других решений на 8.3.

Подготовка: создаём расширение и задаём префикс

Работа идёт в Конфигураторе. Если расширение у вас уже есть, переходите к следующему разделу.

  1. Откройте базу в режиме Конфигуратор и откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. Перейдите в Конфигурация → Расширения конфигурации.
  3. Нажмите «Добавить». Платформа создаст расширение с именем вида Расширение1 и префиксом Расширение1_.
  4. Откройте свойства расширения (двойной щелчок по строке) и поменяйте три поля:
    • 📌 Имя — понятное, например ДопРеквизитыПродаж;
    • 📌 Префикс имён — короткий, например дрп_;
    • 📌 Назначение — «Дополнение», раз вы добавляете новые данные.
  5. Нажмите «Конфигурация» в командной панели списка расширений, чтобы открыть дерево расширения.

Префикс — это защита от будущих обновлений. Если фирма-разработчик в новом релизе добавит в документ реквизит с тем же именем, что и у вас, расширение перестанет применяться. С префиксом дрп_ДатаДоставки такое совпадение практически исключено.

Перед работой с данными сделайте резервную копию базы . Это единственное место в процедуре, где копия обязательна: расширение с реквизитами меняет структуру таблиц.

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

Как добавить реквизит в объект через расширение

Расширение не видит объект основной конфигурации, пока вы его не заимствуете.

Заимствование объекта

  1. В окне расширения откройте дерево основной конфигурации. Удобнее всего — через контекстное меню корня расширения или через меню Конфигурация основной конфигурации, затем найдите объект, например Документы → РеализацияТоваровУслуг.
  2. Щёлкните по объекту правой кнопкой и выберите Добавить в расширение.
  3. В дереве расширения появится тот же документ с пометкой заимствования. Его типовые реквизиты в расширении не копируются, но в коде и запросах доступны по своим именам.

Создание реквизита

  1. Откройте заимствованный объект в расширении (двойной щелчок).
  2. Перейдите на вкладку «Данные».
  3. В группе «Реквизиты» нажмите «Добавить».
  4. Задайте имя с префиксом: дрп_ДатаДоставки, синоним — «Дата доставки».
  5. Выберите тип: Дата, состав даты — «Дата».

Повторите для каждого поля. Так же добавляются реквизиты к справочникам: например, дрп_Регион типа СправочникСсылка.Регионы в справочник «Контрагенты», если справочник регионов тоже создан в расширении или заимствован.

Можно ли добавить все реквизиты разом

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

Свойства и ограничения нового поля

Свойства реквизита из расширения такие же, как у реквизита в основной конфигурации. Настраивайте их в палитре свойств (Alt+Enter).

СвойствоЧто даётПример
ТипКакие значения можно ввестиЧисло, длина 15, точность 2
НеотрицательноеЗапрет отрицательных чиселВес груза
Проверка заполнения«Выдавать ошибку» — документ не запишется с пустым полемДата доставки
Значение заполненияЧто подставится в новый объектЛожь для флага
Параметры выбораОтбор в форме выбораТолько не помеченные на удаление
Связи параметров выбораОтбор по значению другого реквизитаДоговор по выбранному контрагенту
ИндексироватьИндекс в таблице СУБДПоле, по которому часто ищут
ПодсказкаТекст при наведении на поле«Плановая дата отгрузки клиенту»

Несколько правил, которые избавят от проблем:

  • 🔹 Длина строки. Ставьте конкретную длину, например 150. Строка неограниченной длины не сравнивается в запросах без ПОДСТРОКА и плохо индексируется.
  • 🔹 Проверка заполнения. Включайте «Выдавать ошибку» только там, где пустое значение действительно недопустимо. Иначе пользователи не смогут записать старые документы, открытые на правку.
  • 🔹 Индекс. Добавляйте его, только если по полю строятся отборы в больших списках. Каждый индекс замедляет запись.
  • 🔹 Тип-ссылка на объект расширения. Если реквизит ссылается на справочник, созданный в этом же расширении, удалить такой справочник позже будет сложнее: сначала придётся очистить ссылки.

Тип и длину продумайте до первого применения в рабочей базе: каждое изменение структуры — это новая реструктуризация таблиц документа.

Табличные части: колонка в «Товарах» и новая табличная часть

С табличными частями работают два сценария.

Новая колонка в типовой табличной части

  1. В заимствованном документе раскройте «Табличные части» в дереве основной конфигурации и заимствуйте нужную, например Товары, через Добавить в расширение.
  2. Откройте заимствованную табличную часть в расширении.
  3. Добавьте реквизит: дрп_НомерПартииПоставщика, тип Строка, длина 50.

Типовые колонки «Номенклатура», «Количество», «Цена» остаются как были. Ваша колонка хранится отдельно, но в запросе обращение к ней выглядит обычно: РеализацияТоваровУслугТовары.дрп_НомерПартииПоставщика.

Своя табличная часть

На вкладке «Данные» заимствованного документа в группе «Табличные части» нажмите «Добавить» и назовите её с префиксом, например дрп_ГрафикДоставки. Внутри создайте реквизиты: ДатаРейса, Водитель, Адрес. Префикс достаточно поставить у имени табличной части: реквизиты внутри неё уже не пересекутся с типовыми.

Выводим реквизиты на форму и подключаем события

Реквизит в объекте сам на форме не появится. Форму тоже нужно заимствовать.

Поле на форме

  1. В дереве основной конфигурации раскройте Формы документа и заимствуйте основную форму, например ФормаДокумента.
  2. Откройте её в расширении. Слева вверху — дерево элементов, справа вверху — реквизиты формы.
  3. Раскройте реквизит Объект: ваши поля с префиксом будут в его составе.
  4. Перетащите дрп_ДатаДоставки в нужную группу дерева элементов, например под поле «Контрагент».
  5. Для колонки табличной части раскройте Объект → Товары и перетащите дрп_НомерПартииПоставщика внутрь элемента-таблицы Товары.

Свой реквизит формы (не объекта) добавляется в правом верхнем окне кнопкой «Добавить». Он не хранится в базе и подходит для вспомогательных значений: признак, итог, флажок отбора.

Обработчики событий формы

Код расширения не заменяет типовой, а встраивается рядом с ним. В свойствах заимствованной формы или элемента выберите событие и создайте обработчик: конфигуратор предложит вариант вызова — перед, после или вместо типового.

Тот же результат даёт аннотация в модуле формы. Пример: заполнить дату доставки при создании документа.

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

	Если Не ЗначениеЗаполнено(Объект.Ссылка)
		И Не ЗначениеЗаполнено(Объект.дрп_ДатаДоставки) Тогда
		Объект.дрп_ДатаДоставки = ТекущаяДатаСеанса() + 86400;
	КонецЕсли;

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

Если поле нужно добавить без визуального редактора, создайте элемент программно в том же обработчике:

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

Без указания родителя поле попадёт в конец формы. Чтобы поставить его в конкретную группу, используйте Элементы.Вставить(Имя, Тип, Родитель, ПередЭлементом).

События модуля объекта

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

&После("ПередЗаписью")
Процедура дрп_ПередЗаписьюПосле(Отказ, РежимЗаписи, РежимПроведения)

	Если ЗначениеЗаполнено(дрп_ДатаДоставки) И дрп_ДатаДоставки < НачалоДня(Дата) Тогда
		ОбщегоНазначения.СообщитьПользователю(
			"Дата доставки не может быть раньше даты документа", ЭтотОбъект, "дрп_ДатаДоставки", , Отказ);
	КонецЕсли;

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

Функция ОбщегоНазначения.СообщитьПользователю есть в конфигурациях на Библиотеке стандартных подсистем (Бухгалтерия, ЗУП, УТ). В самописной конфигурации без неё создайте Новый СообщениеПользователю и установите Отказ = Истина вручную.

Аннотация &Вместо полностью отключает типовой код этого обработчика. После обновления конфигурации в типовой процедуре могут появиться новые исправления, а у вас они работать не будут. Используйте &Перед и &После, когда этого достаточно.

Применение, проверка и жизнь после обновлений

Обновление базы

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

Чтобы перенести готовое расширение в рабочую базу, сохраните его в файл .cfe (в списке расширений команда сохранения в файл) и загрузите в целевой базе. В конфигурациях на БСП это можно сделать без Конфигуратора: Администрирование → Печатные формы, отчеты и обработки → Расширения. Загрузка файла и обновление структуры базы — отдельные шаги: после загрузки в Конфигураторе всё равно нужно выполнить обновление.

Как проверить, что всё работает

  • ✅ Создайте документ, заполните новое поле, запишите и закройте. Откройте снова: значение на месте.
  • ✅ Оставьте обязательное поле пустым: запись должна прерваться с вашим сообщением.
  • ✅ Сделайте запрос в консоли запросов: ВЫБРАТЬ Ссылка, дрп_ДатаДоставки ИЗ Документ.РеализацияТоваровУслуг.
  • ✅ Проверьте поле в списке документов: через «Ещё → Изменить форму» его можно добавить колонкой без кода.

После обновления типовой конфигурации

Перед установкой нового релиза в копии базы проверьте применимость расширения: в списке расширений Конфигуратора есть проверка применимости к текущей конфигурации. Если в релизе переименовали или удалили заимствованный объект, расширение не применится, и платформа укажет, какой объект изменился. Типичные причины:

  • 🔸 разработчик переименовал форму, которую вы заимствовали;
  • 🔸 появился реквизит с тем же именем, что у вашего (лечится префиксом);
  • 🔸 изменился тип или состав контролируемого свойства заимствованного реквизита.

Исправьте заимствование в копии, затем обновите рабочую базу.

Частые ошибки и как их избежать

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

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

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

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