Как скрыть часть номенклатуры в 1С:УНФ и Бухгалтерии по реквизиту или признаку недействительности?

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

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

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

Определение стратегии: зачем нам скрывать номенклатуру?

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

  1. Визуальная гигиена: Нужно, чтобы менеджер не видел лишнего в списке при подборе, но если очень нужно — мог найти.
  2. Защита от ошибок: Нужно запретить выбор старой позиции в новых документах.
  3. Полная конфиденциальность: Элементы не должны быть видны никому и нигде (даже в отчетах).

Рассмотрим решения от простого к сложному.

Способ 1. Штатные механизмы (Без программирования)

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

Для 1С:Управление нашей фирмой (УНФ)

В УНФ существует встроенный механизм, который идеально подходит для нашей задачи. Давайте посмотрим, как им пользоваться.

  1. В карточке номенклатуры найдите реквизит (галочку/флаг), который может называться Недействителен или Недействительная (в зависимости от релиза конфигурации). Иногда он спрятан в группе "Дополнительно".
  2. Установите этот флаг для тех позиций, которые нужно убрать.

Как это работает в интерфейсе:

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

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

Для 1С:Бухгалтерия предприятия (БП)

В типовой Бухгалтерии аналогичный функционал "одной галочкой" реализован не так явно. Здесь чаще всего применяют организационный метод иерархии.

  1. Создайте в справочнике Номенклатура новую группу (папку). Назовите её, например, Архив или Не использовать.
  2. Переместите все ненужные позиции в эту папку.
  3. Чтобы менеджеры "случайно" не заходили туда, можно настроить отбор в форме списка. Через меню Еще — Настроить список можно установить отбор: Родитель Не В Группе "Архив".

Это не дает стопроцентной защиты от выбора, но значительно очищает визуальное пространство справочника.

Способ 2. Пользовательская настройка отборов

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

В любой управляемой форме (форма списка, форма выбора) пользователь может настроить фильтрацию:

  1. Открываем список номенклатуры.
  2. Нажимаем Еще — Настроить список.
  3. На закладке Отбор добавляем новое условие.
  4. Выбираем ваш реквизит (например, ВАрхиве).
  5. Устанавливаем вид сравнения Равно, значение Нет (или Ложь).
  6. Завершаем редактирование.

Теперь в списке будут видны только те товары, у которых галочка не стоит. Однако у этого метода есть существенный минус: любой пользователь может зайти в настройки, случайно сбросить отбор или отключить его, и "скрытые" товары снова станут видны.

Способ 3. Программная доработка (Вмешательство в код)

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

Перехват автоподбора (Ввод по строке)

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

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


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

КонецПроцедуры

Этот код гарантирует, что при наборе текста в поле ввода "архивные" позиции не будут предложены пользователю.

Фильтрация в форме выбора

Однако пользователь может нажать кнопку "Показать все" (квадратики) и открыть форму выбора. Чтобы и там скрыть лишнее, нам нужно вмешаться в открытие формы. Для этого используем событие ОбработкаПолученияФормы в том же модуле менеджера или событие ПриСозданииНаСервере в самой форме списка (через Расширение конфигурации).

Наиболее правильный способ в современных реалиях (через Расширение) — модифицировать запрос динамического списка Список в форме выбора при создании формы.


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

КонецПроцедуры

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

Способ 4. RLS (Ограничение прав доступа на уровне записей)

Это "тяжелая артиллерия". Если вам нужно, чтобы для определенных пользователей номенклатура исчезла вообще везде (в списках, в отчетах, в подсказках, в движениях документов), используется RLS (Record Level Security) — задача решается через расширение для скрытия объектов от пользователей по правам.

Суть метода заключается в настройке Роли. Для объекта Справочник.Номенклатура на право Чтение накладывается ограничение доступа по шаблону. Упрощенно запрос ограничения выглядит так:

ГДЕ ТекДанные.ВашРеквизитАрхива = ЛОЖЬ

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

Преимущества RLS:

Недостатки RLS:

Важные нюансы и предупреждения

При скрытии номенклатуры любым из способов, обратите внимание на следующие моменты:

  1. Остатки на складах: Перед тем как скрыть номенклатуру (особенно через RLS или флаг "Недействителен"), убедитесь, что на ней нет остатков. Для этого предварительно выполните поиск неликвидных товаров и проанализируйте позиции с низкой оборачиваемостью. В УНФ 3.0 для этого подойдет отчет по поиску номенклатуры с низким спросом (удобно через отчет по выявлению неликвидной номенклатуры). В бухгалтерском учете выявить залежавшийся товар поможет поиск неликвидной номенклатуры по 41 и 43 счету. Остатки нужно предварительно списать или переместить на другую номенклатуру.
  2. Отчетность: Если вы используете программные отборы в формах, на отчеты (например, "Валовая прибыль") это не повлияет — там товар будет виден. Если используете RLS — товар пропадет и из отчетов, что исказит финансовый результат (выручка есть, а себестоимость и товар "не существуют").
  3. Удаление объектов: Никогда не используйте команду Спр.Удалить() программно без контроля ссылочной целостности, если товар когда-либо участвовал в товарообороте. Это приведет к "битым" ссылкам в базе данных. Используйте только пометку на удаление.

Резюме

Давайте подведем итог выбора метода:

← На главную