Как добавить поле на форму документа в 1С, не прерывая работу пользователей

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Для начала разберем фундаментальное ограничение платформы. В 1С существует два типа обновления конфигурации базы данных: динамическое (так называемое "демоническое") и полное (с реструктуризацией).

Когда мы меняем только программный код (модули) или визуальное расположение элементов на форме, система позволяет выполнить динамическое обновление. Пользователи продолжают работать, а изменения вступают в силу после перезапуска сеанса или переоткрытия формы. Но как только мы добавляем новый Реквизит объекта (например, поле в документ), платформа должна изменить структуру таблицы в SQL-базе (добавить новую колонку). Это действие требует монопольного захвата таблиц, что исключает работу пользователей в данный момент.

Решение 1: Использование механизма «Дополнительные реквизиты и сведения»

Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), а это практически все современные типовые решения (УТ 11, ERP 2, Бухгалтерия 3.0), то это самый эффективный способ. Рассмотрим его пошагово:

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

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

Решение 2: Фоновое обновление конфигурации базы данных

Если нам принципиально нужно добавить именно реальный реквизит в структуру объекта, проанализируем механизм Фонового обновления. Этот функционал доступен в клиент-серверном варианте работы.

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

Когда основная часть данных скопирована, администратору все же потребуется кратковременный монопольный доступ. Однако вместо часов ожидания, это займет от нескольких секунд до пары минут. Программа просто "подменит" старые таблицы новыми. Для пользователей это выглядит как минутный технический перерыв, а не полная остановка работы на полдня.

Решение 3: Программное добавление реквизита формы через Расширение

Выясним причину, по которой иногда достаточно добавить Реквизит формы, а не реквизит объекта. Если данные в этом поле не нужно хранить вечно в базе данных (например, это расчетный показатель или временный статус), мы можем использовать динамическое обновление программного кода.

Разберем пример кода, который можно поместить в расширение в процедуру ПриСозданииНаСервере:


&НаСервере
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Добавляем реквизит формы программно
    МассивДобавляемыхРеквизитов = Новый Массив;
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ВременныйСтатус", Новый ОписаниеТипов("СправочникСсылка.Статусы")));
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
    
    // Добавляем элемент формы для отображения реквизита
    Элемент = Элементы.Добавить("ДекорацияСтатус", Тип("ПолеФормы"), ЭтаФорма);
    Элемент.Вид = ВидПоляФормы.ПолеВвода;
    Элемент.ПутьКДанным = "ВременныйСтатус";
КонецПроцедуры

Такое изменение можно применить динамически, и пользователи увидят новое поле сразу после перезахода в документ.

Решение 4: Связка «Регистр сведений + Программный элемент»

Если данные все же нужно хранить, но реструктуризация документа недопустима, проанализируем метод использования внешнего хранилища. Мы можем использовать существующий в системе или заранее созданный универсальный Регистр сведений.

Рассмотрим алгоритм действий:

  1. Создаем программный реквизит на форме (как в предыдущем примере).
  2. В событии формы ПриЧтенииНаСервере прописываем код получения значения из регистра.
  3. В событии формы ПослеЗаписиНаСервере прописываем код сохранения значения в регистр.

Пример кода для считывания данных из регистра:


&НаСервере
Процедура ПрочитатьДополнительныеДанные()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ДопДанные.ЗначениеПоля
        |ИЗ
        |   РегистрСведений.ДополнительнаяИнформацияОбъектов КАК ДопДанные
        |ГДЕ
        |   ДопДанные.Объект = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
        ЭтаФорма.ВременныйСтатус = Выборка.ЗначениеПоля;
    КонецЕсли;
КонецПроцедуры

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

Важные нюансы работы с Расширениями

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

Подведем итог: если вам нужно добавить поле мгновенно и без риска — используйте Дополнительные реквизиты БСП. Если требуется программная логика без изменения структуры — выбирайте динамическое добавление реквизитов формы с хранением в регистрах. Если же структурное изменение неизбежно — планируйте фоновое обновление, чтобы свести время простоя к минимуму.

← На главную