Как удалить доп. реквизит в карточке номенклатуры?

1. user1998894 28.10.23 17:21 Сейчас в теме
Делаю внешнюю обработку, которая при выборе доп. реквизита (например: цвет) должна очистить его значение (например: черный) во всех карточках номенклатуры. Разобрался как удалить сам реквизит и само значение реквизита из плана вида характеристик. Но нужно чтобы при выборе доп. реквизита удалялся не сам реквизит, а только строка в карточке номенклатуры, т.е. допустим присваивалось пустое значение. Не знаю как это сделать. Прошу помощи!
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
7. Alex_E 2383 28.10.23 19:37 Сейчас в теме
(3)
Процедура ВыбратьНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    НоменклатураДополнительныеРеквизиты.Ссылка КАК НоменклатураСсылка
    |ИЗ
    |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    |ГДЕ
    |    НоменклатураДополнительныеРеквизиты.Значение = &Значение";    
    Запрос.УстановитьПараметр("Значение", Объект.ДопРеквизит);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий()Тогда          
       НоменклатураОбъект = Выборка.Ссылка.ПолучитьОбъект();
       МассивДР = НоменклатураОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Значение", Объект.ДопРеквизит)); //можно просто Найти использовать или в цикле перебрать, тут уж как удобнее
       стрДР = МассивДР[0]; //Исходим из того, что строка одна
       СтрДР.Удалить(); //Если надо удалить всю строку с ДР
       //СтрДР.Значение = ""; //если просто очистить значение
    КонецЕсли; 
    
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Alex_E 2383 28.10.23 17:50 Сейчас в теме
В запросе первой строкой получить ссылку на элемент справочника Номенклатура - в результах запроса получить объект надо именно этой ссылки, потом найти в табличной части ДополнительныеРеквизиты строку с нужным доп. рекизитом, и или удалить её или очистить значение, после чего записать номенклатуру (если бы код был представлен в виде текста, а не картинки, показал бы код, а набирать всё честно говоря лень)
3. user1998894 28.10.23 18:10 Сейчас в теме
Процедура ВыбратьНаСервере()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	НоменклатураДополнительныеРеквизиты.Значение.Наименование КАК ЗначениеНаименование
	|ИЗ
	|	Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
	|ГДЕ
	|	НоменклатураДополнительныеРеквизиты.Значение = &Значение";	
	Запрос.УстановитьПараметр("Значение", Объект.ДопРеквизит);
	
	РезультатЗапроса = Запрос.Выполнить();
	Если Не РезультатЗапроса.Пустой() Тогда  
		
		Выборка = РезультатЗапроса.Выбрать();
		Пока Выборка.Следующий() Цикл 
			Реквизит = Выборка.Ссылка.ПолучитьОбъект();
			Реквизит.Удалить();
			
		КонецЦикла;
	КонецЕсли; 
	
КонецПроцедуры
Показать


Вот код) помогите разобраться пожалуйста
4. user1826630 28.10.23 18:33 Сейчас в теме
(3) Сам-то разобрался чего написал? Или нам это надо?
Тебе надо удалить весь элемент, или какую-то строку из его табличной части?

Киров, ну ёпрст!
5. user1998894 28.10.23 18:43 Сейчас в теме
6. user1826630 28.10.23 18:47 Сейчас в теме
(5) Тогда расскажи нам - зачем тут ПолучитьОбъект()? И тут же его весь удалить...

Прав был Николай Морилов (зам из кировского Коммунэнерго), когда на мою просьбу поднять зарплату, сказал: "Все умные из Кирова давно уехали, а дуракам платить никто не собирается".
Через 3 недели я работал на швейцарском заводе в Костромской области. С повышением ЗП почти в 3 раза.
7. Alex_E 2383 28.10.23 19:37 Сейчас в теме
(3)
Процедура ВыбратьНаСервере()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    НоменклатураДополнительныеРеквизиты.Ссылка КАК НоменклатураСсылка
    |ИЗ
    |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
    |ГДЕ
    |    НоменклатураДополнительныеРеквизиты.Значение = &Значение";    
    Запрос.УстановитьПараметр("Значение", Объект.ДопРеквизит);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий()Тогда          
       НоменклатураОбъект = Выборка.Ссылка.ПолучитьОбъект();
       МассивДР = НоменклатураОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Значение", Объект.ДопРеквизит)); //можно просто Найти использовать или в цикле перебрать, тут уж как удобнее
       стрДР = МассивДР[0]; //Исходим из того, что строка одна
       СтрДР.Удалить(); //Если надо удалить всю строку с ДР
       //СтрДР.Значение = ""; //если просто очистить значение
    КонецЕсли; 
    
КонецПроцедуры
Показать
8. Vinzor 111 28.10.23 19:58 Сейчас в теме
(7) 1. В запросе свойство тоже надо описывать в "Где"
2. Получив массив допреквизитов, лучше обойти их с конца вперёд в цикле, удаляя каждую строку.
Ибо действительно, строк может быть более одной.
Перестраховка не помешает.
10. Alex_E 2383 29.10.23 06:11 Сейчас в теме
(8)
В запросе свойство тоже надо описывать в "Где"
- Добавить в запрос ещё одно условие для отбора конкретного свойства можно, почему нет? Но, стесняюсь спросить, а кому это "надо"? Вы считаете табличной части "Дополнительные реквизиты" могут быть повторяющиеся значения разных свойств? Нет, я конечно понимаю, что может быть несколько разных дополнительных реквизитов типа "Цвет утром", "Цвет вечером" и "Ещё какой то цвет" и все они будут иметь одно значение "Черный"...вот только утилитарная ценность таких данных вызывает некоторое сомнение.
лучше обойти их с конца вперёд в цикле
- а вот тут налицо непонимание процесса удаления - обход с конца необходим только в случае перебора табличной части (таблицы значений, массива итп) только в том случае, когда удаляем строки из этого же объекта (количество строк цикла будет уменьшаться, и при "прямом" обходе получим ошибку) - а тут получаем массив строк к удалению, и просто удаляем их из ТЧ - ничего не рушится, потому что нет перебора строк - удаляется конкретная строка(и)...
9. user1998894 28.10.23 20:49 Сейчас в теме
(7) Большое спасибо, вы меня выручили!)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот