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

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

Часто при работе с современными конфигурациями 1С (такими как 1С:ERP, Управление торговлей, Комплексная автоматизация, Розница или УНФ) возникает следующая проблема: созданные дополнительные реквизиты, которые предназначались только для одной определенной номенклатурной группы, неожиданно всплывают в карточках абсолютно всех товаров. Удалить их напрямую из конкретной группы не получается. Разберем по шагам, почему это происходит и как правильно решить эту задачу.

Проанализируем ситуацию и архитектуру дополнительных реквизитов

Многие пользователи и даже разработчики ошибочно полагают, что эти "неудаляемые" реквизиты являются предопределенными в конфигураторе. На самом деле это не так. В коде программы (в конфигураторе) предопределены только сами корневые папки, так называемые наборы. А вот сами реквизиты внутри них создает пользователь в режиме Предприятия.

В подсистеме дополнительных реквизитов есть четкое разделение по наборам. Если вы добавите свойство в корневой набор Справочник "Номенклатура" (общие), оно автоматически станет доступно для всей номенклатуры в базе данных. Именно поэтому свойство и "всплывает" в других карточках товаров. Чтобы реквизит отображался только для определенной группы, его нужно создавать строго внутри набора конкретного Вида номенклатуры (например, только для вида "Бытовая техника" или "Услуги").

Решение 1: Правильный перенос реквизитов с помощью обработки

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

Рассмотрим алгоритм действий с использованием стандартной обработки ГрупповоеИзменениеРеквизитов:

  1. Перейдите в справочник НаборыДополнительныхРеквизитовИСведений. Создайте новый дополнительный реквизит с нужным типом данных, но уже в наборе нужного вам Вида номенклатуры.
  2. Откройте типовую обработку Групповое изменение реквизитов. Выберите для изменения справочник Номенклатура.
  3. Настройте отбор: укажите только ту группу товаров (или вид номенклатуры), для которой этот реквизит предназначался.
  4. В списке доступных для изменения полей найдите ваш новый реквизит. Настройте для него формулу так, чтобы его значение приравнивалось к значению старого "общего" реквизита. Выполните изменение. Это массово скопирует значения.
  5. После успешного переноса необходимо очистить старый реквизит. Снова воспользуйтесь обработкой, выберите всю номенклатуру (где старый реквизит заполнен), и установите для него пустое значение, чтобы очистить скрытые табличные части и не плодить "хвосты" в базе данных.
  6. Только после очистки удалите старый реквизит из набора Номенклатура (общие).

Решение 2: Переопределение видимости реквизитов на форме (без удаления)

Посмотрим на пример, когда реквизит действительно должен быть общим для 90% товаров в вашей базе, но сильно мешает при заполнении лишь в нескольких специфичных видах номенклатуры (например, в услугах). В этом случае удалять его нецелесообразно.

Первый вариант — скрыть реквизит визуально через пользовательские настройки. В форме карточки номенклатуры нажмите кнопку "Еще", выберите "Изменить форму" и снимите галочку видимости с ненужного дополнительного реквизита.

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

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


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

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

Особенности работы с характеристиками

Если у вас аналогичная проблема возникла не с самой номенклатурой, а с ее характеристиками, алгоритм действий будет абсолютно идентичным. В справочнике наборов есть отдельная ветвь для характеристик. Свойства могут быть ошибочно привязаны к набору Характеристики номенклатуры (общие), из-за чего они появляются во всех характеристиках базы. Решается проблема точно так же: созданием реквизита в наборе характеристик конкретного вида номенклатуры, переносом данных обработкой и последующим удалением общего свойства.

← На главную