Работа с реквизитами форм в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и администраторов системы.hether вы добавляете новое поле в документ, изменяете свойства существующего реквизита или переносите данные между версиями конфигурации, процесс требует аккуратности и понимания механизмов платформы. Ошибки при обновлении реквизитов могут привести к потере данных, сбоям в работе интерфейса или даже падению базы при обновлении.

В этой статье мы разберём 5 основных способов обновления реквизитов форм — от ручного редактирования в конфигураторе до программных методов с использованием встроенного языка. Особое внимание уделим сохранению данных при изменении структуры меток, так как это наиболее критичный момент для бизнес-процессов. Материал будет полезен как начинающим специалистам, так и опытным программистам , которые хотят оптимизировать свою работу.

1. Когда требуется обновление реквизитов формы?

Прежде чем приступать к изменениям, важно понять, в каких случаях вообще необходимо обновлять реквизиты. Вот наиболее распространённые сценарии:

  • 📝 Добавление нового поля в документ или справочник (например, требуется хранить дополнительную информацию о клиенте или товаре).
  • 🔄 Изменение типа данных реквизита (с числа на строку, с даты на булево значение и т.п.).
  • 🗑️ Удаление устаревших реквизитов, которые больше не используются в бизнес-процессах.
  • 🔗 Перенос реквизитов между объектами (например, из документа в справочник или наоборот).
  • 🛠️ Оптимизация структуры для ускорения работы формы (например, замена группы реквизитов на табличную часть).

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

⚠️ Внимание: Всегда создавайте резервную копию базы данных перед изменением структуры меток. Даже если вы работаете в тестовом режиме, ошибка может привести к необратимым последствиям в продуктивной базе.

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

📊 Как часто вы обновляете реквизиты форм в 1С?
Раз в месяц
Раз в квартал
Только при критичных изменениях
Никогда не обновлял

2. Способ 1: Ручное изменение через конфигуратор

Самый простой и наглядный способ — редактирование реквизитов непосредственно в Конфигураторе 1С. Этот метод подходит для небольших изменений, когда не требуется массовая обработка или сложная логика преобразования данных.

Чтобы обновить реквизит формы через конфигуратор:

  1. Откройте конфигуратор в режиме 1С:Предприятие (с правами администратора).
  2. В дереве объектов найдите нужный документ, справочник или другой объект, где требуется изменить реквизит.
  3. Раскройте ветку Реквизиты и выберите нужный реквизит (или создайте новый через контекстное меню).
  4. В палитре свойств (F4) измените необходимые параметры: имя, тип, длину, комментарий и т.д.
  5. Сохраните конфигурацию (Ctrl+S) и обновите базу данных (Конфигурация → Обновить конфигурацию базы данных).

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

  • 🔄 Преобразовать автоматически (если типы совместимы, например, ЧислоСтрока).
  • 🗑️ Очистить значения (если преобразование невозможно).
  • Отменить изменение (если не уверены в последствиях).
⚠️ Внимание: При изменении типа реквизита с Строка на Число все нечисловые значения будут утеряны. Например, строка "100 руб." не преобразуется в число 100 — вместо неё будет пустое значение.

Для наглядности рассмотрим пример изменения типа реквизита Цена с Число(10,2) на Строка(50):

ДействиеРезультатПримечание
Исходный тип: Число(10,2)Значение: 1234.56Хранится как число
Изменение на Строка(50)Значение: "1234.56"Автоматическое преобразование
Обратное изменение на Число(10,2)Значение: 1234.56Если строка содержит только цифры
Строка с текстом: "Цена: 1000"Значение: 0 или пустоНепреобразуемый формат
💡

Перед массовым изменением типов реквизитов экспортируйте данные в Excel через отчёт "Выгрузка данных". Это поможет восстановить информацию в случае ошибки.

3. Способ 2: Программное изменение через встроенный язык

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

  • 🔄 Массово обновлять реквизиты в нескольких объектах.
  • 📊 Контролировать процесс преобразования данных.
  • 🔒 Добавлять проверки перед изменением (например, наличие прав у пользователя).
  • 📝 Вести лог изменений для отката при ошибках.

Пример кода для добавления нового реквизита ДополнительнаяИнформация типа Строка(250) ко всем справочникам в конфигурации:

Процедура ДобавитьРеквизитКоВсемСправочникам()

// Получаем список всех справочников в конфигурации

МассивСправочников = Метаданные.Справочники;

Для Каждого Справочник Из МассивСправочников Цикл

Попытка

// Проверяем, существует ли уже такой реквизит

Если НЕ Справочник.Реквизиты.Найти("ДополнительнаяИнформация") Тогда

НовыйРеквизит = Справочник.Реквизиты.Добавить();

НовыйРеквизит.Имя = "ДополнительнаяИнформация";

НовыйРеквизит.Тип = Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250));

НовыйРеквизит.Комментарий = "Поле для хранения дополнительных сведений";

КонецЕсли;

Исключение

ЗаписатьЖурналРегистрации(НСтр("ru = 'Ошибка при добавлении реквизита к справочнику %1: %2'"),

Справочник.Имя, ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

Сообщить("Обновление реквизитов завершено!");

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

Для изменения типа существующего реквизита можно использовать следующий подход (на примере изменения типа реквизита КодПоставщика с Строка на Число):

Процедура ИзменитьТипРеквизита()

// Получаем объект метаданных

Справочник = Метаданные.Справочники.Поставщики;

Реквизит = Справочник.Реквизиты.КодПоставщика;

// Меняем тип

Реквизит.Тип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0));

// Преобразуем существующие данные (если возможно)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| КодПоставщика КАК СтароеЗначение

|ИЗ

| Справочник.Поставщики

|ГДЕ

| НЕ КодПоставщика ЕСТЬ NULL";

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

Попытка

НовоеЗначение = Число(Результат.СтароеЗначение);

// Обновляем запись (здесь нужен код для массового обновления)

Исключение

// Если преобразование невозможно, логируем ошибку

ЗаписатьЖурналРегистрации(НСтр("ru = 'Не удалось преобразовать значение %1 для поставщика'"),

Результат.СтароеЗначение);

КонецПопытки;

КонецЦикла;

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

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

Создать резервную копию базы данных|Протестировать код в копии рабочей базы|Проверить права доступа пользователя|Подготовить журнал для логирования ошибок|Согласовать изменения с бизнес-пользователями-->

4. Способ 3: Обновление через внешние обработки

Если изменения реквизитов требуется проводить регулярно (например, при обновлении типовых конфигураций), удобно использовать внешние обработки. Они позволяют:

  • 🔄 Стандартизировать процесс обновления для разных баз.
  • 📁 Хранить историю изменений в одном месте.
  • 🛠️ Добавлять дополнительную логику (например, проверку зависимостей).
  • 👥 Делегировать задачу администраторам без доступа к конфигуратору.

Пример структуры внешней обработки для обновления реквизитов:

Перем мМассивИзменений; // Хранит список изменений (объект, реквизит, новый тип и т.д.)

Процедура ПриСозданииНаСервере()

// Инициализируем массив изменений

мМассивИзменений = Новый Массив;

// Добавляем пример изменения: для справочника "Контрагенты" меняем реквизит "ИНН" на строку длиной 12 символов

Изменение = Новый Структура;

Изменение.Вставить("ТипОбъекта", "Справочник.Контрагенты");

Изменение.Вставить("ИмяРеквизита", "ИНН");

Изменение.Вставить("НовыйТип", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(12)));

мМассивИзменений.Добавить(Изменение);

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

Процедура ВыполнитьОбновление(Команда)

Для Каждого Изменение Из мМассивИзменений Цикл

Попытка

ОбъектМетаданных = Метаданные.НайтиПоИмени(Изменение.ТипОбъекта);

Если ОбъектМетаданных = Неопределено Тогда

Продолжить;

КонецЕсли;

Реквизит = ОбъектМетаданных.Реквизиты.Найти(Изменение.ИмяРеквизита);

Если Реквизит = Неопределено Тогда

Продолжить;

КонецЕсли;

Реквизит.Тип = Изменение.НовыйТип;

Сообщить(СтрШаблон("Реквизит %1 объекта %2 обновлён",

Изменение.ИмяРеквизита, Изменение.ТипОбъекта));

Исключение

Сообщить(СтрШаблон("Ошибка при обновлении %1: %2",

Изменение.ИмяРеквизита, ОписаниеОшибки()));

КонецПопытки;

КонецЦикла;

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

Преимущества внешних обработок:

ПреимуществоОписание
🔒 БезопасностьМожно ограничить права на выполнение обработки
📊 Контроль версийОбработку можно хранить в системе контроля версий (Git, SVN)
🔄 Повторное использованиеОдна обработка подходит для нескольких баз
📝 ДокументированиеЛегко добавлять комментарии и инструкции прямо в код

Для сложных сценариев (например, миграции данных между реквизитами) в обработку можно добавить:

  • 📊 Логирование всех действий в журнал.
  • ⏮️ Механизм отката на случай ошибки.
  • 🔍 Проверку зависимостей (например, используется ли реквизит в отчётах).
  • 📈 Статистику изменений (сколько записей обновлено успешно).
Как защитить обработку от несанкционированного использования?

Добавьте в начало обработки проверку прав пользователя:

Если НЕ Пользователь.ИмеетРоль("АдминистраторСистемы") Тогда

Предупреждение("Доступ запрещён! Требуются права администратора.");

Возврат;

КонецЕсли;

Также можно добавить пароль или проверку по списку разрешённых пользователей.

5. Способ 4: Обновление через расширения конфигурации

Если вы работаете с типовыми конфигурациями (например, 1С:Бухгалтерия, 1С:УТ, 1С:ЗУП), прямое изменение реквизитов может привести к проблемам при обновлении. В этом случае лучше использовать расширения конфигурации — механизм, который позволяет добавлять новые реквизиты без изменения исходного кода.

Преимущества расширений:

  • 🔄 Совместимость с обновлениями — ваши изменения не затрутся при обновлении типовой конфигурации.
  • 🛠️ Гибкость — можно добавлять реквизиты, формы, отчёты и даже изменять алгоритмы.
  • 📁 Удобное управление — расширения можно отключать/включать без перезапуска базы.
  • 👥 Разделение ответственности — изменения бизнес-логики отделены от типового функционала.

Чтобы добавить новый реквизит через расширение:

  1. Откройте конфигуратор и перейдите в Конфигурация → Расширения.
  2. Создайте новое расширение или откройте существующее.
  3. В дереве расширения найдите объект, к которому хотите добавить реквизит (например, Справочник.Контрагенты).
  4. Добавьте новый реквизит через контекстное меню (Добавить → Реквизит).
  5. Настройте свойства реквизита (имя, тип, комментарий).
  6. Сохраните расширение и обновите базу данных.

Пример добавления реквизита ДатаПоследнегоКонтакта к справочнику Контрагенты через расширение:

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

Процедура ПриСозданииНаСервере()

// Добавляем реквизит к справочнику Контрагенты

Реквизит = Расширение.Объекты.Справочник.Контрагенты.Реквизиты.Добавить();

Реквизит.Имя = "ДатаПоследнегоКонтакта";

Реквизит.Тип = Новый ОписаниеТипов("Дата");

Реквизит.Комментарий = "Дата последнего взаимодействия с контрагентом";

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

После добавления реквизита через расширение его можно использовать в коде так же, как и обычный реквизит:

Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

Если Контрагент.ДатаПоследнегоКонтакта = '00010101' Тогда

Сообщить("Контакт не был установлен!");

Иначе

Сообщить("Последний контакт: " + Формат(Контрагент.ДатаПоследнегоКонтакта, "ДФ=dd.MM.yyyy"));

КонецЕсли;

⚠️ Внимание: Реквизиты, добавленные через расширения, не видны в основной конфигурации при просмотре через конфигуратор. Чтобы их увидеть, нужно открыть расширение или использовать отладчик.
💡

Расширения конфигурации — самый безопасный способ добавлять реквизиты в типовые решения, так как они не конфликтуют с обновлениями от 1С.

6. Способ 5: Миграция данных при изменении реквизитов

Одно из самых сложных заданий — сохранение данных при изменении структуры реквизитов. Например, если вы:

  • 🔄 Меняете тип реквизита с Строка на Число.
  • 🗑️ Удаляете реквизит и создаёте новый с другим именем.
  • 📊 Разделяете один реквизит на несколько (например, Адрес на Город, Улица, Дом).

В таких случаях нужно предусмотреть механизм миграции данных. Рассмотрим пошаговый алгоритм:

  1. Создайте временный реквизит для хранения старых данных.
  2. Напишите обработку переноса, которая скопирует данные из старого реквизита в новый.
  3. Протестируйте перенос на копии базы.
  4. Выполните перенос в рабочей базе в нерабочее время.
  5. Удалите старый реквизит (если он больше не нужен).

Пример кода для миграции данных из реквизита СтарыйКод (строка) в НовыйКод (число):

Процедура МиграцияКодов()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Ссылка,

| СтарыйКод КАК СтароеЗначение

|ИЗ

| Справочник.Номенклатура

|ГДЕ

| НЕ СтарыйКод ЕСТЬ NULL";

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

Попытка

Номенклатура = Результат.Ссылка.ПолучитьОбъект();

НовоеЗначение = Число(Результат.СтароеЗначение);

Номенклатура.НовыйКод = НовоеЗначение;

Номенклатура.Записать();

Исключение

ЗаписатьЖурналРегистрации(НСтр("ru = 'Ошибка миграции для %1: %2'"),

Результат.Ссылка, ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

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

Для сложных миграций (например, когда один реквизит разбивается на несколько) можно использовать временные таблицы:

Процедура РазбитьАдресНаЧасти()

// 1. Создаём временную таблицу для хранения разобранных адресов

ТаблицаАдресов = Новый ТаблицаЗначений;

ТаблицаАдресов.Колонки.Добавить("Ссылка");

ТаблицаАдресов.Колонки.Добавить("Город");

ТаблицаАдресов.Колонки.Добавить("Улица");

ТаблицаАдресов.Колонки.Добавить("Дом");

// 2. Загружаем данные из старого реквизита

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка, Адрес ИЗ Справочник.Контрагенты";

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

Адрес = Результат.Адрес;

// Разбираем адрес на части (пример упрощён)

МассивАдреса = СтроковыеФункции.РазделитьСтроку(Адрес, ",");

НоваяСтрока = ТаблицаАдресов.Добавить();

НоваяСтрока.Ссылка = Результат.Ссылка;

НоваяСтрока.Город = МассивАдреса[0];

НоваяСтрока.Улица = МассивАдреса[1];

НоваяСтрока.Дом = МассивАдреса[2];

КонецЦикла;

// 3. Обновляем объекты новыми данными

Для Каждого Строка Из ТаблицаАдресов Цикл

Контрагент = Строка.Ссылка.ПолучитьОбъект();

Контрагент.Город = Строка.Город;

Контрагент.Улица = Строка.Улица;

Контрагент.Дом = Строка.Дом;

Контрагент.Записать();

КонецЦикла;

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

⚠️ Внимание: При миграции данных всегда проверяйте уникальность значений. Например, если вы переносите данные из строкового реквизита в числовой, убедитесь, что в старых данных нет дубликатов, которые могут привести к конфликтам.

7. Типичные ошибки и как их избежать

При обновлении реквизитов формы даже опытные разработчики допускают ошибки. Вот наиболее распространённые из них и способы их предотвращения:

ОшибкаПоследствияКак избежать
🔄 Изменение типа реквизита без преобразования данныхПотеря информации или ошибки при чтенииИспользовать временные реквизиты для миграции
🗑️ Удаление реквизита, используемого в отчётахПадение отчётов или некорректные данныеПроверять зависимости через Конфигурация → Анализ → Показать связи объекта
📝 Добавление реквизита с резервным именем (например, Реквизит1)Путаница в коде и сложности при поддержкеДавать осмысленные имена (например, ДатаПоследнейОплаты)
🔒 Изменение реквизитов в типовых конфигурациях без расширенийКонфликты при обновленииИспользовать расширения или поддерживаемые механизмы
📊 Непроверенные изменения в продуктивной базеПростой бизнес-процессовТестировать на копии базы с реальными данными

Чтобы минимизировать риски, следуйте этому чек-листу перед обновлением реквизитов:

Создана резервная копия базы данных|Проведен анализ зависимостей реквизита|Тестирование выполнено на копии базы|Пользователи предупреждены о возможном простое|Подготовлен план отката при ошибке-->

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

  • 🔍 Проверьте журнал регистрации на наличие ошибок (Администрирование → Журнал регистрации).
  • 📊 Сравните структуру меток до и после изменения (можно через Конфигурация → Сравнить конфигурации).
  • 🛠️ Проверьте права доступа — возможно, у пользователей нет прав на новый реквизит.
  • 🔄 Откатните изменения, если проблема критична, и повторите процесс с исправлениями.
Что делать, если после обновления реквизита форма перестала открываться?

1. Проверьте, не ссылается ли форма на удалённый реквизит в своём модуле.

2. Откройте форму в конфигураторе и исправьте ошибки в коде (обычно это обращения к несуществующим полям).

3. Если форма повреждена, восстановите её из резервной копии или пересоздайте.

4. Обновите конфигурацию базы данных (Конфигурация → Обновить конфигурацию базы данных).

FAQ: Частые вопросы по обновлению реквизитов в 1С

Можно ли изменить тип реквизита с Строка на Число без потери данных?

Да, но только если все строковые значения можно однозначно преобразовать в числа. Например, строка "100" преобразуется в число 100, а строка "100 руб." — нет (будет ошибка или пустое значение). Перед изменением типа рекомендуется:

  1. Проверить все текущие значения на возможность преобразования.
  2. Создать резервную копию базы.
  3. Выполнить тестовое преобразование на копии данных.

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

Как добавить реквизит в типовую конфигурацию, чтобы он не пропал при обновлении?

Используйте расширения конфигурации. Этот механизм специально предназначен для безопасного добавления