Всем привет!
Расскажу, что было сделано в очередном проекте по зачистке задвоенной /затроенной характеристики.
Дам ссылки на полезные ресурсы. Можете использовать как инструкцию к действию.
Для скачивания никаких обработок не будет - только теория. Добро пожаловать!
Кратко - были предприняты следующие разработки:
1. Для тестирования, проверки и просто удобства работы - в окно карточки номенклатуры добавлен отбор по свойствам - рис. 1 и 2 (подробно смотрите здесь //infostart.ru/public/1043307/
рис. 1.
рис. 2.
2. При изменении (редактировании) характеристики - проверяю обороты по документам. И если характеристика участвует в документообороте, то запрещаю редактирование для всех пользователей, кроме имеющих соответствующую роль "РаботаСХарактеристиками". Случалось такое, что после проведения заказа покупателя характеристика менялась, и в реализацию садилась другая.
Данную возможность реализовал через КритерийОтбора (рис.3), также смотрите листинг процедуры ПередЗаписью() объекта Характеристика.
рис. 3.
Процедура ПередЗаписью(Отказ)
//доработка+
Если ОбменДанными.Загрузка Тогда
Возврат; //ничего не проверяем
КонецЕсли;
Если Не РольДоступна("РаботаСХарактеристиками")
И (ПометкаУдаления ИЛИ НеИспользовать) Тогда
ОбщегоНазначения.СообщитьОбОшибке("У вас нет прав удалять/скрывать характеристики", Отказ);
Возврат;
КонецЕсли;
Если НЕ ОбменДанными.Загрузка
И НЕ Владелец.ВестиУчетПоХарактеристикам Тогда
ОбщегоНазначения.СообщитьОбОшибке(
"Для номенклатуры """ + Владелец + """ не ведется учет по характеристикам.
|Характеристика """ + Наименование + """ не может быть записана.",
Отказ);
КонецЕсли;
Если НЕ Отказ И ЭтоНовый() Тогда
Автор = глЗначениеПеременной("глТекущийПользователь");
КонецЕсли;
Если НЕ Отказ И НЕ ЭтоНовый() Тогда
//проверим на документооборот
//при наличии ключевых документов, редактировать хар-ку нельзя!
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ХарактеристикаВДокументах.Ссылка
|ИЗ
| КритерийОтбора.ХарактеристикаВДокументах(&Характеристика) КАК ХарактеристикаВДокументах
|ГДЕ
| ХарактеристикаВДокументах.Ссылка.Проведен
| И (ХарактеристикаВДокументах.Ссылка ССЫЛКА Документ.ЗаказПоставщику
| ИЛИ ХарактеристикаВДокументах.Ссылка ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ИЛИ ХарактеристикаВДокументах.Ссылка ССЫЛКА Документ.РеализацияТоваровУслуг)";
Запрос.УстановитьПараметр("Характеристика", Ссылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Если Не РольДоступна("РаботаСХарактеристиками") Тогда
ОбщегоНазначения.СообщитьОбОшибке("Нельзя перезаписывать характеристику, когда она проведена в документах", Отказ);
Возврат;
Иначе
ОбщегоНазначения.СообщитьОбОшибке("Внимание! Вы перезаписываете характеристику, которая проведена в документах",,,СтатусСообщения.Информация);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
3. Запретил помечать на удаление характеристики всем пользователям, кроме имеющих роль "РаботаСХарактеристиками" - проверяю это перед записью характеристики - см. выше листинг.
4. Разделил сущности "ПомеченныеНаУдаление" и "НеИспользовать" - добавил в справочник Характеристики новый признак "Не использовать" - как раз для задвоенных/затроенных (см. рис. 4)
рис. 4.
5. При подборе характеристики в документ и в окне выбора не показываю характеристики, помеченные на удаление и с признаком "Не использовать". Право видеть "скрытые" есть только у пользователя с ролью "РаботаСХарактеристиками" (рис. 5).
рис. 5.
Процедура ОтобратьХарактеристики()
Процедура ОтобратьХарактеристики()
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ВладелецХарактеристики", ПараметрВыборПоВладельцу);
//доработка+
Если ПоказыватьСкрытые Тогда
//как было
Запрос.Текст = "ВЫБРАТЬ
| ХарактеристикиНоменклатуры.ПометкаУдаления КАК ПометкаУдаления,
| ХарактеристикиНоменклатуры.Характеристика КАК Характеристика
|ИЗ
| (ВЫБРАТЬ
| ХарактеристикиНоменклатуры.ПометкаУдаления КАК ПометкаУдаления,
| ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
| ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
| ГДЕ
| ХарактеристикиНоменклатуры.Владелец = &ВладелецХарактеристики) КАК ХарактеристикиНоменклатуры";
Иначе
//как стало
Запрос.Текст = "ВЫБРАТЬ
| ХарактеристикиНоменклатуры.ПометкаУдаления КАК ПометкаУдаления,
| ХарактеристикиНоменклатуры.Характеристика КАК Характеристика
|ИЗ
| (ВЫБРАТЬ
| ХарактеристикиНоменклатуры.ПометкаУдаления КАК ПометкаУдаления,
| ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
| ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
| ГДЕ
| ХарактеристикиНоменклатуры.Владелец = &ВладелецХарактеристики
| И ХарактеристикиНоменклатуры.НеИспользовать = ЛОЖЬ
| И ХарактеристикиНоменклатуры.ПометкаУдаления = ЛОЖЬ) КАК ХарактеристикиНоменклатуры";
КонецЕсли;
Для каждого Строка Из ОбработкаОбъектЗначенияСвойств.СвойстваИЗначения Цикл
Если ЗначениеЗаполнено(Строка.Значение) Тогда
Индекс = ОбработкаОбъектЗначенияСвойств.СвойстваИЗначения.Индекс(Строка);
Запрос.УстановитьПараметр("Свойство" + Индекс, Строка.Свойство);
Запрос.УстановитьПараметр("Значение" + Индекс, Строка.Значение);
Запрос.Текст = Запрос.Текст + "
|ВНУТРЕННЕЕ СОЕДИНЕНИЕ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов" + Индекс + "
|
|ПО
| ЗначенияСвойствОбъектов" + Индекс + ".Объект = ХарактеристикиНоменклатуры.Характеристика
| И
| ЗначенияСвойствОбъектов" + Индекс + ".Свойство = &Свойство" + Индекс +"
| И
| ЗначенияСвойствОбъектов" + Индекс + ".Значение = &Значение" + Индекс +"
|";
КонецЕсли;
КонецЦикла;
Характеристики = Запрос.Выполнить().Выгрузить();
КонецПроцедуры
6. Запретил создавать одинаковые характеристики - проверяю не по свойствам и значениям, а по наименованиям. Запоминаю также автора новой характеристики (см. пункт 4 выше).
Наименование формируется автоматом согласно свойствам и значениям, но у пользователя есть право редактировать наименование. Чаще всего никто специально наименование не изменяет.
Запрет на создание новой характеристики реализовал так - смотрите листиниг.
Процедура ХарактеристикиПередНачаломДобавления()
Процедура ХарактеристикиПередНачаломДобавления(Элемент, Отказ, Копирование)
Отказ = Истина;
//доработка+
//было
//ВвестиНовуюХарактеристику();
//стало
Если Характеристики.Количество()>0 Тогда
ОбщегоНазначения.СообщитьОбОшибке("Имеются нужные характеристики товара! Выберите имеющиеся или уточните фильтр свойств!", Отказ);
Возврат;
Иначе
ВвестиНовуюХарактеристику();
КонецЕсли;
КонецПроцедуры
7. Все выше было предварительной подготовкой подсистемы учета характеристик. Осталось только почистить имеющиеся характеристики от задвоенности. Для этого я использовал обработку Сергея Старых //infostart.ru/public/14986/
Я добавил свой алгоритм в его алгоритм определения правильных элементов - для неправильных я установил признак "Не использовать", а для правильных - признак "Часто используемый" - см. листинг.
Процедура ОпределитьПравильныеЭлементы()
...
Для каждого Строка Из мРезультатыПоиска Цикл
...
Об = Строка.Ссылка.ПолучитьОбъект();
Об.НеИспользовать = Истина;
Об.Записать();
...
КонецЦикла;
Для каждого СтрокаПравильного Из СтрокиПравильных Цикл
СтрокаПравильного.Значение.Правильный = Истина;
Об = СтрокаПравильного.Значение.Ссылка.ПолучитьОбъект();
Об.ЧастоИспользуемый = Истина;
Об.НеИспользовать = Ложь;
Об.Записать();
КонецЦикла;
...
8. Часто используемые характеристики выделяю жирным шрифтом в списках (смотрите рисунки выше)
Процедура ХарактеристикиПриВыводеСтроки()
Процедура ХарактеристикиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки = Неопределено Тогда
Возврат;
КонецЕсли;
Если ДанныеСтроки.Ссылка.ЧастоИспользуемый Тогда
ОформлениеСтроки.Шрифт = Новый Шрифт(,,Истина);
КонецЕсли;
КонецПроцедуры
Работа была проведена на "Управление торговлей", редакция 10.3 (10.3.50.1), 1С:Предприятие 8.3 (8.3.9.2084).
Если вы не используете характеристики в 1С (все свойства заложены в названии номенклатуры), но хотите начать использовать, тогда вы можете воспользоваться Загрузчиком характеристик из эксель.
Всем добра! :)