Добавление новых полей в 1С 8.3: конфигуратор, расширения и код
Содержание
Поле в 1С — это либо реквизит объекта (справочника, документа, регистра), либо элемент формы. Добавить его можно тремя путями: реквизитом в конфигураторе, таким же реквизитом в расширении конфигурации (не снимая типовую с поддержки) или программно, когда поле нужно показать на форме прямо при её открытии. После изменения структуры базу обновляют клавишей F7.
Какой из способов добавить поля в 1С выбрать — зависит от двух вещей: типовая у вас конфигурация или собственная, и нужно ли хранить значение в базе или достаточно показать его на форме. Ниже — каждый способ по шагам, с кодом и с разбором того, где чаще всего спотыкаются.
Какой способ добавления поля подходит вашей задаче
Прежде чем лезть в метаданные, определитесь с методом. От этого зависит, придётся ли снимать конфигурацию с поддержки и переживёт ли изменение ближайшее обновление.
🔹 Реквизит в конфигураторе — когда база самописная или уже снята с поддержки. Поле хранится в базе, доступно в запросах и отчётах.
🔹 Реквизит в расширении — для типовой конфигурации (Бухгалтерия, ЗУП, УТ). Типовая остаётся на полной поддержке, ваше поле живёт отдельным модулем и не слетает при обновлении релиза.
🔹 Программное добавление на форму — когда значение не нужно хранить: временное поле для ввода, вычисляемый показатель, динамически собираемый список реквизитов.
F7).ПриСозданииНаСервере.Добавление реквизита через конфигуратор
Это базовый способ. Поле становится полноценной колонкой в таблице базы.
- Откройте конфигуратор:
Конфигурация → Открыть конфигурацию. - В дереве найдите объект — например
Справочники → Контрагенты. - Раскройте ветку Реквизиты, правой кнопкой —
Добавить. - В палитре свойств задайте Имя (латиница, без пробелов, например
ДатаПроверки) и Синоним — то, что увидит пользователь. - Выберите Тип. Для текста это
Строка: укажите длину;0означает неограниченную строку — ставьте её только там, где длина действительно непредсказуема, иначе поле нельзя проиндексировать. - При необходимости включите Индексирование, если по полю будут искать или отбирать.
Для ссылочных данных выбирайте тип СправочникСсылка.<Имя> или ДокументСсылка.<Имя> — поле станет ссылкой на другой объект. Если значение бывает разного типа, задайте составной тип и отметьте нужные типы в списке.
Полезные свойства реквизита, которые часто забывают:
- Проверка заполнения — поставьте «Выдавать ошибку», и платформа не даст провести документ с пустым обязательным полем.
- Заполнять / Значение заполнения — задаёт значение по умолчанию для новых объектов (у существующих записей оно не меняется).
- Многострочный режим — для длинных текстовых реквизитов, чтобы поле на форме разворачивалось в несколько строк.
После этого изменения существуют только в конфигурации. Чтобы они попали в базу данных, нажмите F7 (Конфигурация → Обновить конфигурацию базы данных).
Обновление структуры базы требует монопольного доступа: другие пользователи должны выйти. Делайте это в нерабочее время и обязательно после резервной копии, если меняете рабочую базу.
У существующих записей новый реквизит получит пустое значение своего типа: пустую строку, 0, пустую дату или пустую ссылку. Чтобы заполнить его осмысленно, запустите разовую обработку или пропишите заполнение в модуле объекта.
Как вывести новое поле на форму — вручную и программно
Реквизит, добавленный в конфигураторе, не появляется на уже отредактированной форме сам. Его нужно вынести.
Вручную. Откройте форму объекта. В правом верхнем окне (дерево реквизитов формы) раскройте основной реквизит Объект — там будет ваше новое поле. Перетащите его мышью в нужную группу левого окна элементов. Сохраните форму и обновите базу.
Программно. Когда поле собирается по условию или не должно храниться, его добавляют при создании формы. Пример — добавить строковое поле Комментарий на управляемую форму:
&НаСервере
Процедура ДобавитьПолеКомментарий()
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(
Новый РеквизитФормы("Комментарий", Новый ОписаниеТипов("Строка")));
ИзменитьРеквизиты(НовыеРеквизиты);
НовоеПоле = Элементы.Добавить("Комментарий", Тип("ПолеФормы"));
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Комментарий";
КонецПроцедуры
Метод ИзменитьРеквизиты() принадлежит управляемой форме и работает только на сервере. Вызывайте процедуру из обработчика ПриСозданииНаСервере.
Программно добавленные таким образом реквизиты формы в базе не хранятся — после закрытия формы значение пропадает. Если его нужно сохранить, поле всё равно должно опираться на реквизит объекта.
Чтобы поле встало в конкретную группу, третьим параметром Элементы.Добавить() передают родителя, например Элементы.ГруппаШапка. Свойством ТолькоПросмотр поле делают нередактируемым, а свойством Видимость — скрывают по условию. Так собирают формы, которые меняют состав полей в зависимости от вида операции или прав пользователя.
Добавление колонки в табличную часть документа
Отдельный частый случай — добавить поле не в шапку, а в табличную часть: новую колонку в строки товаров, услуг или начислений.
- В конфигураторе откройте документ, раскройте ветку Табличные части и выберите нужную (например
Товары). - Внутри неё раскройте Реквизиты и добавьте новый реквизит — так же, как у обычного объекта, с именем и типом.
- Обновите структуру базы (
F7). - Откройте форму документа. В дереве реквизитов формы новая колонка появится внутри таблицы; перетащите её в таблицу на форме или добавьте колонку программно в элемент-таблицу.
Реквизит табличной части хранится построчно и доступен в запросах через точку: Документ.Товары.ВашеПоле. Для типовой конфигурации колонку так же добавляют через расширение, заимствуя документ и его табличную часть.
Добавление поля через расширение конфигурации
Для типовых конфигураций это главный способ. Расширение позволяет добавить реквизит , не снимая типовую конфигурацию с поддержки — обновления релизов продолжают устанавливаться автоматически. Расширения конфигурации работают начиная с платформы 8.3.6.
Порядок действий:
Конфигурация → Расширения конфигурации. Создайте новое расширение, задайте имя и префикс.- Откройте конфигурацию расширения. Найдите нужный типовой объект, правой кнопкой — команда добавления объекта в расширение (заимствование). Объект станет «заимствованным».
- В заимствованном объекте добавьте собственный реквизит — так же, как в конфигураторе. Имя лучше начинать с префикса расширения, чтобы не конфликтовать с типовыми именами.
- Сохраните расширение и обновите структуру базы (
F7).
Если расширение приходит отдельным файлом .cfe, его сначала загружают (Конфигурация → Расширения конфигурации → загрузить), и только потом выполняют Обновить конфигурацию базы данных. Это два разных шага: загрузка файла структуру базы ещё не меняет.
В актуальных версиях платформы расширением можно добавить собственные реквизиты справочникам, документам и их табличным частям, а также полям регистров. Чем выше режим совместимости расширения с конфигурацией, тем больше операций оно разрешает — но и тем сильнее зависит от версии типовой. Для простого добавления поля подходит режим «Адаптируемый», который устойчивее к обновлениям релизов.
Выносить новое поле на типовую форму из расширения тоже удобнее через саму форму расширения: заимствуете форму и добавляете на неё элемент, привязанный к вашему реквизиту.
Новые поля в регистрах сведений и накопления
В регистрах «поля» называются иначе, и от выбора зависит логика учёта. Путать их нельзя.
| Что добавляем | Регистр сведений | Регистр накопления |
|---|---|---|
| Разрез, по которому различаются записи | Измерение | Измерение |
| Числовой показатель, который суммируется | Ресурс | Ресурс |
| Справочная информация | Реквизит | Реквизит |
Добавляется поле так же: раскрываете ветку Измерения, Ресурсы или Реквизиты объекта, правой кнопкой — Добавить, задаёте имя и тип.
Особенность: новое измерение меняет уникальность записей. У регистра сведений с режимом записи «Независимый» комбинация измерений (плюс период, если регистр периодический) должна оставаться уникальной — после добавления измерения пересмотрите, не появятся ли задвоения. Для ресурса следите за типом: суммируемый показатель почти всегда Число с заданной точностью.
Если новое поле — просто пояснение к записи и в отборах или итогах не участвует, делайте его реквизитом, а не измерением. Лишнее измерение раздувает индекс регистра и замедляет запись.
После правок регистра так же нужно обновление структуры базы и монопольный доступ. У регистра накопления дополнительно пересчитываются итоги, поэтому на большой базе обновление может занять заметное время — закладывайте его в технологическое окно.
Контроль изменений и производительность
Несколько приёмов, без которых добавление полей в рабочей базе рано или поздно приводит к проблемам.
📌 Снятие с поддержки — крайняя мера. Если можно решить задачу расширением, не трогайте замок поддержки в конфигураторе. Снятая с поддержки типовая обновляется вручную через сравнение и объединение, и это надолго.
📌 Командная разработка — через хранилище. Если над конфигурацией работают несколько человек, изменения вносят через хранилище конфигурации: объект захватывается, правится, помещается обратно. Иначе чужие правки затираются.
📌 Индексы — осознанно. Индексирование ускоряет отбор по полю, но замедляет запись и увеличивает базу. Индексируйте только те реквизиты, по которым реально идёт поиск или отбор в списках и отчётах.
📌 Длина строки имеет значение. Неограниченная строка (длина 0) хранится отдельно и не индексируется. Для кодов, артикулов, коротких пометок задавайте конкретную длину.
📌 Сначала копия, потом рабочая база. Любое изменение структуры сперва проверяйте на копии рабочей базы: добавили поле, обновили структуру, прогнали типовые операции. Так вы поймаете конфликт имён или долгий пересчёт итогов до того, как он остановит работу бухгалтерии.
Отдельно держите в голове сценарий обновления типовой, снятой с поддержки: ваши поля придётся переносить вручную через Сравнить, объединить при каждом релизе. Это и есть главный довод в пользу расширений — они избавляют от этой ручной работы.
Перед изменением рабочей базы пройдитесь по короткому чек-листу.
Частые ошибки при добавлении полей
🔸 Реквизит добавлен, но его нет в базе. Забыли обновить структуру (F7). Изменения в конфигураторе и в базе данных — это два разных состояния, пока не нажата кнопка обновления.
🔸 Поле есть в конфигураторе, но не видно на форме. Управляемая форма не подхватывает новые реквизиты автоматически, если она уже редактировалась. Вынесите поле на форму вручную или программно.
🔸 Не удаётся обновить базу — «требуется монопольный доступ». В базе работают пользователи или висит сеанс. Структуру базы меняют только при монопольном доступе.
🔸 После смены типа существующего реквизита данные «поехали». Если в поле уже лежали значения, смена типа может их обнулить или вызвать конфликт при обновлении. Меняйте тип только на пустом поле либо через промежуточную конвертацию данных.
🔸 Имя реквизита в расширении совпало с типовым. Приводит к ошибкам при применении расширения. Используйте префикс расширения в именах.
Частые вопросы
Появится ли новое поле в базе сразу после добавления реквизита?
Обновить конфигурацию базы данных (F7) и требует монопольного доступа.Можно ли добавить поле, не снимая конфигурацию с поддержки?
Почему реквизит есть в конфигураторе, а на форме его нет?
ПриСозданииНаСервере.Что будет со старыми записями после добавления реквизита?
0, пустую дату, пустую ссылку. Чтобы заполнить их данными, запустите разовую обработку.