Работа с реквизитами форм в 1С:Предприятие — одна из самых востребованных задач среди разработчиков и администраторов системы.hether вы добавляете новое поле в документ, изменяете свойства существующего реквизита или переносите данные между версиями конфигурации, процесс требует аккуратности и понимания механизмов платформы. Ошибки при обновлении реквизитов могут привести к потере данных, сбоям в работе интерфейса или даже падению базы при обновлении.
В этой статье мы разберём 5 основных способов обновления реквизитов форм — от ручного редактирования в конфигураторе до программных методов с использованием встроенного языка. Особое внимание уделим сохранению данных при изменении структуры меток, так как это наиболее критичный момент для бизнес-процессов. Материал будет полезен как начинающим специалистам, так и опытным программистам 1С, которые хотят оптимизировать свою работу.
1. Когда требуется обновление реквизитов формы?
Прежде чем приступать к изменениям, важно понять, в каких случаях вообще необходимо обновлять реквизиты. Вот наиболее распространённые сценарии:
- 📝 Добавление нового поля в документ или справочник (например, требуется хранить дополнительную информацию о клиенте или товаре).
- 🔄 Изменение типа данных реквизита (с числа на строку, с даты на булево значение и т.п.).
- 🗑️ Удаление устаревших реквизитов, которые больше не используются в бизнес-процессах.
- 🔗 Перенос реквизитов между объектами (например, из документа в справочник или наоборот).
- 🛠️ Оптимизация структуры для ускорения работы формы (например, замена группы реквизитов на табличную часть).
Каждый из этих случаев требует своего подхода. Например, изменение типа данных может привести к потере информации, если не предусмотреть механизм конвертации. А удаление реквизита вообще опасно, если он используется в отчётах или обработках. Поэтому перед любыми изменениями рекомендуется:
⚠️ Внимание: Всегда создавайте резервную копию базы данных перед изменением структуры меток. Даже если вы работаете в тестовом режиме, ошибка может привести к необратимым последствиям в продуктивной базе.
Также стоит учитывать, что в некоторых случаях проще создать новый реквизит и перенести в него данные из старого, чем модифицировать существующий. Это особенно актуально для крупных баз с длительной историей.
2. Способ 1: Ручное изменение через конфигуратор
Самый простой и наглядный способ — редактирование реквизитов непосредственно в Конфигураторе 1С. Этот метод подходит для небольших изменений, когда не требуется массовая обработка или сложная логика преобразования данных.
Чтобы обновить реквизит формы через конфигуратор:
- Откройте конфигуратор в режиме
1С:Предприятие(с правами администратора). - В дереве объектов найдите нужный документ, справочник или другой объект, где требуется изменить реквизит.
- Раскройте ветку
Реквизитыи выберите нужный реквизит (или создайте новый через контекстное меню). - В палитре свойств (
F4) измените необходимые параметры: имя, тип, длину, комментарий и т.д. - Сохраните конфигурацию (
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С:ЗУП), прямое изменение реквизитов может привести к проблемам при обновлении. В этом случае лучше использовать расширения конфигурации — механизм, который позволяет добавлять новые реквизиты без изменения исходного кода.
Преимущества расширений:
- 🔄 Совместимость с обновлениями — ваши изменения не затрутся при обновлении типовой конфигурации.
- 🛠️ Гибкость — можно добавлять реквизиты, формы, отчёты и даже изменять алгоритмы.
- 📁 Удобное управление — расширения можно отключать/включать без перезапуска базы.
- 👥 Разделение ответственности — изменения бизнес-логики отделены от типового функционала.
Чтобы добавить новый реквизит через расширение:
- Откройте конфигуратор и перейдите в
Конфигурация → Расширения. - Создайте новое расширение или откройте существующее.
- В дереве расширения найдите объект, к которому хотите добавить реквизит (например,
Справочник.Контрагенты). - Добавьте новый реквизит через контекстное меню (
Добавить → Реквизит). - Настройте свойства реквизита (имя, тип, комментарий).
- Сохраните расширение и обновите базу данных.
Пример добавления реквизита ДатаПоследнегоКонтакта к справочнику Контрагенты через расширение:
// В модуле расширения
Процедура ПриСозданииНаСервере()
// Добавляем реквизит к справочнику Контрагенты
Реквизит = Расширение.Объекты.Справочник.Контрагенты.Реквизиты.Добавить();
Реквизит.Имя = "ДатаПоследнегоКонтакта";
Реквизит.Тип = Новый ОписаниеТипов("Дата");
Реквизит.Комментарий = "Дата последнего взаимодействия с контрагентом";
КонецПроцедуры
После добавления реквизита через расширение его можно использовать в коде так же, как и обычный реквизит:
Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если Контрагент.ДатаПоследнегоКонтакта = '00010101' Тогда
Сообщить("Контакт не был установлен!");
Иначе
Сообщить("Последний контакт: " + Формат(Контрагент.ДатаПоследнегоКонтакта, "ДФ=dd.MM.yyyy"));
КонецЕсли;
⚠️ Внимание: Реквизиты, добавленные через расширения, не видны в основной конфигурации при просмотре через конфигуратор. Чтобы их увидеть, нужно открыть расширение или использовать отладчик.
Расширения конфигурации — самый безопасный способ добавлять реквизиты в типовые решения, так как они не конфликтуют с обновлениями от 1С.
6. Способ 5: Миграция данных при изменении реквизитов
Одно из самых сложных заданий — сохранение данных при изменении структуры реквизитов. Например, если вы:
- 🔄 Меняете тип реквизита с
СтроканаЧисло. - 🗑️ Удаляете реквизит и создаёте новый с другим именем.
- 📊 Разделяете один реквизит на несколько (например,
АдреснаГород,Улица,Дом).
В таких случаях нужно предусмотреть механизм миграции данных. Рассмотрим пошаговый алгоритм:
- Создайте временный реквизит для хранения старых данных.
- Напишите обработку переноса, которая скопирует данные из старого реквизита в новый.
- Протестируйте перенос на копии базы.
- Выполните перенос в рабочей базе в нерабочее время.
- Удалите старый реквизит (если он больше не нужен).
Пример кода для миграции данных из реквизита СтарыйКод (строка) в НовыйКод (число):
Процедура МиграцияКодов()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка,
| СтарыйКод КАК СтароеЗначение
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| НЕ СтарыйКод ЕСТЬ NULL";
Результат = Запрос.Выполнить();
Пока Результат.Следующий() Цикл
Попытка
Номенклатура = Результат.Ссылка.ПолучитьОбъект();
НовоеЗначение = Число(Результат.СтароеЗначение);
Номенклатура.НовыйКод = НовоеЗначение;
Номенклатура.Записать();
Исключение
ЗаписатьЖурналРегистрации(НСтр("ru = 'Ошибка миграции для %1: %2'"),
Результат.Ссылка, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Для сложных миграций (например, когда один реквизит разбивается на несколько) можно использовать временные таблицы:
Процедура РазбитьАдресНаЧасти()
// 1. Создаём временную таблицу для хранения разобранных адресов
ТаблицаАдресов = Новый ТаблицаЗначений;
ТаблицаАдресов.Колонки.Добавить("Ссылка");
ТаблицаАдресов.Колонки.Добавить("Город");
ТаблицаАдресов.Колонки.Добавить("Улица");
ТаблицаАдресов.Колонки.Добавить("Дом");
// 2. Загружаем данные из старого реквизита
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Адрес ИЗ Справочник.Контрагенты";
Результат = Запрос.Выполнить();
Пока Результат.Следующий() Цикл
Адрес = Результат.Адрес;
// Разбираем адрес на части (пример упрощён)
МассивАдреса = СтроковыеФункции.РазделитьСтроку(Адрес, ",");
НоваяСтрока = ТаблицаАдресов.Добавить();
НоваяСтрока.Ссылка = Результат.Ссылка;
НоваяСтрока.Город = МассивАдреса[0];
НоваяСтрока.Улица = МассивАдреса[1];
НоваяСтрока.Дом = МассивАдреса[2];
КонецЦикла;
// 3. Обновляем объекты новыми данными
Для Каждого Строка Из ТаблицаАдресов Цикл
Контрагент = Строка.Ссылка.ПолучитьОбъект();
Контрагент.Город = Строка.Город;
Контрагент.Улица = Строка.Улица;
Контрагент.Дом = Строка.Дом;
Контрагент.Записать();
КонецЦикла;
КонецПроцедуры
⚠️ Внимание: При миграции данных всегда проверяйте уникальность значений. Например, если вы переносите данные из строкового реквизита в числовой, убедитесь, что в старых данных нет дубликатов, которые могут привести к конфликтам.
7. Типичные ошибки и как их избежать
При обновлении реквизитов формы даже опытные разработчики допускают ошибки. Вот наиболее распространённые из них и способы их предотвращения:
| Ошибка | Последствия | Как избежать |
|---|---|---|
| 🔄 Изменение типа реквизита без преобразования данных | Потеря информации или ошибки при чтении | Использовать временные реквизиты для миграции |
| 🗑️ Удаление реквизита, используемого в отчётах | Падение отчётов или некорректные данные | Проверять зависимости через Конфигурация → Анализ → Показать связи объекта |
📝 Добавление реквизита с резервным именем (например, Реквизит1) | Путаница в коде и сложности при поддержке | Давать осмысленные имена (например, ДатаПоследнейОплаты) |
| 🔒 Изменение реквизитов в типовых конфигурациях без расширений | Конфликты при обновлении | Использовать расширения или поддерживаемые механизмы |
| 📊 Непроверенные изменения в продуктивной базе | Простой бизнес-процессов | Тестировать на копии базы с реальными данными |
Чтобы минимизировать риски, следуйте этому чек-листу перед обновлением реквизитов:
Создана резервная копия базы данных|Проведен анализ зависимостей реквизита|Тестирование выполнено на копии базы|Пользователи предупреждены о возможном простое|Подготовлен план отката при ошибке-->
Если после обновления реквизитов возникли проблемы, воспользуйтесь этими советами для диагностики:
- 🔍 Проверьте журнал регистрации на наличие ошибок (
Администрирование → Журнал регистрации). - 📊 Сравните структуру меток до и после изменения (можно через
Конфигурация → Сравнить конфигурации). - 🛠️ Проверьте права доступа — возможно, у пользователей нет прав на новый реквизит.
- 🔄 Откатните изменения, если проблема критична, и повторите процесс с исправлениями.
Что делать, если после обновления реквизита форма перестала открываться?
1. Проверьте, не ссылается ли форма на удалённый реквизит в своём модуле.
2. Откройте форму в конфигураторе и исправьте ошибки в коде (обычно это обращения к несуществующим полям).
3. Если форма повреждена, восстановите её из резервной копии или пересоздайте.
4. Обновите конфигурацию базы данных (Конфигурация → Обновить конфигурацию базы данных).
FAQ: Частые вопросы по обновлению реквизитов в 1С
Можно ли изменить тип реквизита с Строка на Число без потери данных?
Да, но только если все строковые значения можно однозначно преобразовать в числа. Например, строка "100" преобразуется в число 100, а строка "100 руб." — нет (будет ошибка или пустое значение). Перед изменением типа рекомендуется:
- Проверить все текущие значения на возможность преобразования.
- Создать резервную копию базы.
- Выполнить тестовое преобразование на копии данных.
Если данные не поддаются автоматическому преобразованию, лучше создать новый реквизит и перенести данные вручную.
Как добавить реквизит в типовую конфигурацию, чтобы он не пропал при обновлении?
Используйте расширения конфигурации. Этот механизм специально предназначен для безопасного добавления