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