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