Как эффективно скрыть или деактивировать предопределенные элементы справочника в 1С 8.3

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

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

Почему нельзя просто удалить предопределенные элементы?

Предопределенные элементы справочников в 1С создаются разработчиками конфигурации для обеспечения ее логики и функциональности. Они могут быть жестко 'зашиты' в код программы, использоваться в алгоритмах, отчетах или других механизмах. Их прямое удаление (даже программное через конфигуратор) может привести к серьезным ошибкам, некорректной работе функционала, а в худшем случае – к полной неработоспособности системы и проблемам при последующих обновлениях.

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

Методы скрытия и деактивации предопределенных элементов

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

1. Пометка на удаление

Самый простой и стандартный способ 'скрыть' неиспользуемый элемент – это пометить его на удаление. В типовых списках и формах подбора 1С, если не включен специальный отбор, элементы, помеченные на удаление, по умолчанию не отображаются.

  1. Интерактивно: Откройте форму элемента справочника, который нужно скрыть. В меню 'Еще' или по кнопке 'Удалить' (обычно обозначается крестиком) выберите 'Пометить на удаление/Снять пометку'.
  2. Программно: Вы можете написать небольшой обработчик, который будет помечать на удаление нужные элементы.

Преимущества: Простота реализации, встроенная функциональность 1С.

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

2. Добавление дополнительного реквизита для архивации/деактивации

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

Шаг 1: Добавление реквизита в справочник

В конфигураторе откроем наш справочник (например, ВидыНоменклатуры). Добавим новый реквизит:

  1. Имя: НеАктуален (или Архивный, НеИспользовать).
  2. Тип: Булево.

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

Шаг 2: Настройка отбора в списке справочника

Нам потребуется изменить форму списка справочника, чтобы она автоматически применяла отбор по новому реквизиту. Мы можем сделать это программно в модуле формы списка. Для наглядности можно также реализовать флажок в динамическом списке в 1С 8.3, чтобы пользователь сразу видел статус записи.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Устанавливаем отбор при создании формы, если это не новый элемент
    Если НЕ ЭтоНовый() Тогда
        УстановитьОтборНаФорме();
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УстановитьОтборНаФорме()
    // Получаем текущий отбор списка
    Отбор = Элементы.Список.Отбор; // 'Список' - это имя элемента формы, который отображает справочник

    // Создаем новый элемент отбора для нашего реквизита 'НеАктуален'
    ЭлементОтбора = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НеАктуален"); // Имя нашего реквизита
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Ложь; // Показываем только те элементы, у которых 'НеАктуален' = Ложь
    ЭлементОтбора.Использование = Истина; // Включаем использование этого отбора

    // При желании, можно сделать отбор недоступным для изменения пользователем
    // ЭлементОтбора.Доступность = Ложь;
КонецПроцедуры

После этих изменений форма списка справочника будет по умолчанию показывать только те элементы, у которых реквизит НеАктуален имеет значение Ложь.

Шаг 3: Массовая установка флага для существующих элементов

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

Если же вы предпочитаете программный метод, можно выполнить следующий код:


&НаСервере
Процедура ВыполнитьНаСервере()
    // Создаем запрос для выбора предопределенных элементов
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    СправочникВидыНоменклатуры.Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.ВидыНоменклатуры КАК СправочникВидыНоменклатуры
        |ГДЕ
        |    СправочникВидыНоменклатуры.ПометкаУдаления = ЛОЖЬ
        |    И СправочникВидыНоменклатуры.Предопределенный = ИСТИНА"; 

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

    // Перебираем каждый выбранный элемент
    Пока Результат.Следующий() Цикл
        Объект = Результат.Ссылка.ПолучитьОбъект(); 
        
        Если ТипЗнч(Объект.НеАктуален) <> Тип("Неопределено") Тогда 
            Объект.НеАктуален = Истина;
            Объект.Записать();
        КонецЕсли;
    КонецЦикла;

    Сообщить("Все предопределенные элементы успешно помечены как неактуальные.");
КонецПроцедуры

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

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

3. Использование предопределенных элементов как "заглушек"

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

Преимущества: Не требует изменения самого справочника или его форм.

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

4. Крайняя мера: Снятие предопределенности и физическое удаление

ВНИМАНИЕ! Этот метод КРАЙНЕ не рекомендуется.

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

Заключение и рекомендации

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

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

← На главную