Свои поля в типовом документе без снятия с поддержки: реквизиты через расширение
Содержание
Чтобы добавить реквизит
в расширение 1С, заимствуйте нужный справочник или документ в расширение (контекстное меню объекта в основной конфигурации → Добавить в расширение), откройте заимствованный объект и на вкладке «Данные» создайте новый реквизит с префиксом расширения в имени. Затем заимствуйте форму объекта, перетащите реквизит на форму и выполните Обновить конфигурацию базы данных для расширения. Основная конфигурация остаётся на поддержке и обновляется как обычно.
Добавлять свои реквизиты к заимствованным объектам платформа умеет с версии 8.3.11. Сами расширения появились раньше, в 8.3.6, но первые версии меняли только интерфейс и код. Если у вас платформа с номером ниже 8.3.11, вкладка «Данные» у заимствованного объекта будет недоступна для добавления.
Всё описанное ниже общее для платформы и не зависит от конфигурации: шаги одинаковы для Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других решений на 8.3.
Подготовка: создаём расширение и задаём префикс
Работа идёт в Конфигураторе. Если расширение у вас уже есть, переходите к следующему разделу.
- Откройте базу в режиме Конфигуратор и откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - Перейдите в
Конфигурация → Расширения конфигурации. - Нажмите «Добавить». Платформа создаст расширение с именем вида
Расширение1и префиксомРасширение1_. - Откройте свойства расширения (двойной щелчок по строке) и поменяйте три поля:
- 📌 Имя — понятное, например
ДопРеквизитыПродаж; - 📌 Префикс имён — короткий, например
дрп_; - 📌 Назначение — «Дополнение», раз вы добавляете новые данные.
- 📌 Имя — понятное, например
- Нажмите «Конфигурация» в командной панели списка расширений, чтобы открыть дерево расширения.
Префикс — это защита от будущих обновлений. Если фирма-разработчик в новом релизе добавит в документ реквизит с тем же именем, что и у вас, расширение перестанет применяться. С префиксом дрп_ДатаДоставки такое совпадение практически исключено.
Перед работой с данными сделайте резервную копию базы . Это единственное место в процедуре, где копия обязательна: расширение с реквизитами меняет структуру таблиц.
Тренируйтесь на копии рабочей базы. Ошибка в расширении с данными не сломает типовую конфигурацию, но удаление такого расширения уносит с собой всё, что пользователи успели записать в его реквизиты.
Как добавить реквизит в объект через расширение
Расширение не видит объект основной конфигурации, пока вы его не заимствуете.
Заимствование объекта
- В окне расширения откройте дерево основной конфигурации. Удобнее всего — через контекстное меню корня расширения или через меню
Конфигурацияосновной конфигурации, затем найдите объект, напримерДокументы → РеализацияТоваровУслуг. - Щёлкните по объекту правой кнопкой и выберите
Добавить в расширение. - В дереве расширения появится тот же документ с пометкой заимствования. Его типовые реквизиты в расширении не копируются, но в коде и запросах доступны по своим именам.
Создание реквизита
- Откройте заимствованный объект в расширении (двойной щелчок).
- Перейдите на вкладку «Данные».
- В группе «Реквизиты» нажмите «Добавить».
- Задайте имя с префиксом:
дрп_ДатаДоставки, синоним — «Дата доставки». - Выберите тип:
Дата, состав даты — «Дата».
Повторите для каждого поля. Так же добавляются реквизиты к справочникам: например, дрп_Регион типа СправочникСсылка.Регионы в справочник «Контрагенты», если справочник регионов тоже создан в расширении или заимствован.
Можно ли добавить все реквизиты разом
Отдельной команды, которая переносит в расширение весь набор реквизитов разом, нет. Реквизиты своего расширения добавляются по одному, а типовые реквизиты заимствованного объекта переносить и не нужно: они уже работают в коде, формах и запросах расширения. Заимствовать отдельный типовой реквизит имеет смысл, только когда вы хотите вывести его на заимствованную форму или изменить контролируемые свойства.
Свойства и ограничения нового поля
Свойства реквизита из расширения такие же, как у реквизита в основной конфигурации. Настраивайте их в палитре свойств (Alt+Enter).
| Свойство | Что даёт | Пример |
|---|---|---|
| Тип | Какие значения можно ввести | Число, длина 15, точность 2 |
| Неотрицательное | Запрет отрицательных чисел | Вес груза |
| Проверка заполнения | «Выдавать ошибку» — документ не запишется с пустым полем | Дата доставки |
| Значение заполнения | Что подставится в новый объект | Ложь для флага |
| Параметры выбора | Отбор в форме выбора | Только не помеченные на удаление |
| Связи параметров выбора | Отбор по значению другого реквизита | Договор по выбранному контрагенту |
| Индексировать | Индекс в таблице СУБД | Поле, по которому часто ищут |
| Подсказка | Текст при наведении на поле | «Плановая дата отгрузки клиенту» |
Несколько правил, которые избавят от проблем:
- 🔹 Длина строки. Ставьте конкретную длину, например 150. Строка неограниченной длины не сравнивается в запросах без
ПОДСТРОКАи плохо индексируется. - 🔹 Проверка заполнения. Включайте «Выдавать ошибку» только там, где пустое значение действительно недопустимо. Иначе пользователи не смогут записать старые документы, открытые на правку.
- 🔹 Индекс. Добавляйте его, только если по полю строятся отборы в больших списках. Каждый индекс замедляет запись.
- 🔹 Тип-ссылка на объект расширения. Если реквизит ссылается на справочник, созданный в этом же расширении, удалить такой справочник позже будет сложнее: сначала придётся очистить ссылки.
Тип и длину продумайте до первого применения в рабочей базе: каждое изменение структуры — это новая реструктуризация таблиц документа.
Табличные части: колонка в «Товарах» и новая табличная часть
С табличными частями работают два сценария.
Новая колонка в типовой табличной части
- В заимствованном документе раскройте «Табличные части» в дереве основной конфигурации и заимствуйте нужную, например
Товары, черезДобавить в расширение. - Откройте заимствованную табличную часть в расширении.
- Добавьте реквизит:
дрп_НомерПартииПоставщика, типСтрока, длина 50.
Типовые колонки «Номенклатура», «Количество», «Цена» остаются как были. Ваша колонка хранится отдельно, но в запросе обращение к ней выглядит обычно: РеализацияТоваровУслугТовары.дрп_НомерПартииПоставщика.
Своя табличная часть
На вкладке «Данные» заимствованного документа в группе «Табличные части» нажмите «Добавить» и назовите её с префиксом, например дрп_ГрафикДоставки. Внутри создайте реквизиты: ДатаРейса, Водитель, Адрес. Префикс достаточно поставить у имени табличной части: реквизиты внутри неё уже не пересекутся с типовыми.
Выводим реквизиты на форму и подключаем события
Реквизит в объекте сам на форме не появится. Форму тоже нужно заимствовать.
Поле на форме
- В дереве основной конфигурации раскройте
Формыдокумента и заимствуйте основную форму, напримерФормаДокумента. - Откройте её в расширении. Слева вверху — дерево элементов, справа вверху — реквизиты формы.
- Раскройте реквизит
Объект: ваши поля с префиксом будут в его составе. - Перетащите
дрп_ДатаДоставкив нужную группу дерева элементов, например под поле «Контрагент». - Для колонки табличной части раскройте
Объект → Товарыи перетащитедрп_НомерПартииПоставщикавнутрь элемента-таблицыТовары.
Свой реквизит формы (не объекта) добавляется в правом верхнем окне кнопкой «Добавить». Он не хранится в базе и подходит для вспомогательных значений: признак, итог, флажок отбора.
Обработчики событий формы
Код расширения не заменяет типовой, а встраивается рядом с ним. В свойствах заимствованной формы или элемента выберите событие и создайте обработчик: конфигуратор предложит вариант вызова — перед, после или вместо типового.
Тот же результат даёт аннотация в модуле формы. Пример: заполнить дату доставки при создании документа.
&НаСервере
&После("ПриСозданииНаСервере")
Процедура дрп_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Объект.Ссылка)
И Не ЗначениеЗаполнено(Объект.дрп_ДатаДоставки) Тогда
Объект.дрп_ДатаДоставки = ТекущаяДатаСеанса() + 86400;
КонецЕсли;
КонецПроцедуры
Если поле нужно добавить без визуального редактора, создайте элемент программно в том же обработчике:
Элемент = Элементы.Добавить("дрп_ДатаДоставки", Тип("ПолеФормы"));
Элемент.Вид = ВидПоляФормы.ПолеВвода;
Элемент.ПутьКДанным = "Объект.дрп_ДатаДоставки";
Без указания родителя поле попадёт в конец формы. Чтобы поставить его в конкретную группу, используйте Элементы.Вставить(Имя, Тип, Родитель, ПередЭлементом).
События модуля объекта
Проверки при записи кладите в модуль объекта, а не формы: тогда они сработают и при записи из обработки. Откройте модуль объекта заимствованного документа в расширении и добавьте:
&После("ПередЗаписью")
Процедура дрп_ПередЗаписьюПосле(Отказ, РежимЗаписи, РежимПроведения)
Если ЗначениеЗаполнено(дрп_ДатаДоставки) И дрп_ДатаДоставки < НачалоДня(Дата) Тогда
ОбщегоНазначения.СообщитьПользователю(
"Дата доставки не может быть раньше даты документа", ЭтотОбъект, "дрп_ДатаДоставки", , Отказ);
КонецЕсли;
КонецПроцедуры
Функция ОбщегоНазначения.СообщитьПользователю есть в конфигурациях на Библиотеке стандартных подсистем (Бухгалтерия, ЗУП, УТ). В самописной конфигурации без неё создайте Новый СообщениеПользователю и установите Отказ = Истина вручную.
Аннотация &Вместо полностью отключает типовой код этого обработчика. После обновления конфигурации в типовой процедуре могут появиться новые исправления, а у вас они работать не будут. Используйте &Перед и &После, когда этого достаточно.
Применение, проверка и жизнь после обновлений
Обновление базы
- В окне расширения нажмите
F7(Конфигурация → Обновить конфигурацию базы данных). - Конфигуратор покажет список изменений структуры: новые поля и таблицы. Примите их.
- Пользователи увидят изменения после перезапуска своих сеансов. Предупредите их заранее: рабочий сеанс сам расширение не подхватит.
Чтобы перенести готовое расширение в рабочую базу, сохраните его в файл .cfe (в списке расширений команда сохранения в файл) и загрузите в целевой базе. В конфигурациях на БСП это можно сделать без Конфигуратора: Администрирование → Печатные формы, отчеты и обработки → Расширения. Загрузка файла и обновление структуры базы — отдельные шаги: после загрузки в Конфигураторе всё равно нужно выполнить обновление.
Как проверить, что всё работает
- ✅ Создайте документ, заполните новое поле, запишите и закройте. Откройте снова: значение на месте.
- ✅ Оставьте обязательное поле пустым: запись должна прерваться с вашим сообщением.
- ✅ Сделайте запрос в консоли запросов:
ВЫБРАТЬ Ссылка, дрп_ДатаДоставки ИЗ Документ.РеализацияТоваровУслуг. - ✅ Проверьте поле в списке документов: через «Ещё → Изменить форму» его можно добавить колонкой без кода.
После обновления типовой конфигурации
Перед установкой нового релиза в копии базы проверьте применимость расширения: в списке расширений Конфигуратора есть проверка применимости к текущей конфигурации. Если в релизе переименовали или удалили заимствованный объект, расширение не применится, и платформа укажет, какой объект изменился. Типичные причины:
- 🔸 разработчик переименовал форму, которую вы заимствовали;
- 🔸 появился реквизит с тем же именем, что у вашего (лечится префиксом);
- 🔸 изменился тип или состав контролируемого свойства заимствованного реквизита.
Исправьте заимствование в копии, затем обновите рабочую базу.
Частые ошибки и как их избежать
Ещё одна ошибка, которую ловят уже в работе: расширение подключено «в безопасном режиме», а код в обработчике обращается к файлам или внешним ресурсам. Для простых проверок и заполнения полей безопасный режим не мешает, для обмена с внешними системами его придётся отключить в свойствах расширения.