Изменение реквизита справочника номенклатуры

1. OMOIVA 28.09.20 16:22 Сейчас в теме
Прошу помощи с написанием внешней обработки на обычной форме.
Уровень написания - начинающий.
Есть справочник - CMS1C_Номенклатура
Есть реквизит - URL
Необходимо: форма с выбором конечной группы номенклатуры (CMS1C_Номенклатура), с товаром в ней и подпапках (если есть).
На товарах в этом справочнике есть реквизит - URL.
Форму создал, процедуру частично написал.
Как в цикле сделать перезапись реквизита URL, перезапись будет выглядеть так:
(Через универсальную обработку с возможностью выполнения своего алгоритма, с отобранными элементами я делаю след. образом)
Объект.URL = "";
Объект.Записать();
И после все отобранные элементы, обновляют свой реквизит исходя из наименования, так нужно, когда в 1С поменяли наименование товара, а URL его остаётся старый. Делать через универсальную обработку каждый раз сложновато.
Итог, создал внешнюю обработку, на обычной форме, добавил реквизит (поле выбора группы) и кнопку выполнения функции.
&НаСервере
Процедура ВыполнитьНажатие(Элемент)
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 5
|   CMS1C_Номенклатура.url
| ИЗ
|	Справочник.CMS1C_Номенклатура КАК CMS1C_Номенклатура";

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
     Сообщить(Выборка.url);
	 
 КонецЦикла;	
КонецПроцедуры
Показать

Пока что добился только того, что могу вывести реквизит 5-ых пяти элементов номенклатуры в "Сообщить".
Необходимо, в запрос добавить, чтобы группа подставлялась из реквизита формы, т.е. допустим, необходимо обновить URL товаров группы - унитазы, в форме я выбираю эту группу и нажимаю выполнить, после в цикле идёт перезапись реквизита URL.
Сколько я не пытался использовать уже введенные данные - пока ничего не выходит.
Прикрепленные файлы:
ВнешняяОбработка4.epf
По теме из базы знаний
Найденные решения
30. VictorRGB2 13 28.09.20 18:48 Сейчас в теме
(29) так ткните во владельца, что у него за тип?
если владелец, это Спр.Номенклатура, все упростится до
"ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.CMS1C_Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Владелец В ИЕРАРХИИ(&ГруппаНоменклатуры)";
32. VictorRGB2 13 28.09.20 19:04 Сейчас в теме
(31) Выгрузить это метод
правильно будет
РезультатЗапроса = Запрос.Выполнить().Выгрузить();

хоть СП читайте...не все же за вас делать то...
33. OMOIVA 28.09.20 19:25 Сейчас в теме
(32) Спасибо БОЛЬШОЕ, всё работает.

ВОЛШЕБНЫЙ КОД
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. keyn5565` 18 28.09.20 16:30 Сейчас в теме
5. OMOIVA 28.09.20 16:34 Сейчас в теме
Реквизит URL, формируется автоматически исходя из наименования, например:
Есть товар, его наименование = Радиатор стальной трубчатый Параллели В 1-300-3
Реквизит URL в справочнике CMS1C_Номенклатура, формируется автоматически исходя
из наименования = radiator-stalnoj-trubchatyj-paralleli-v-1-300-3.
Т.е чтобы реквизит URL, обновился, достаточно его перезаписать на ничего - Объект.URL = "";
8. keyn5565` 18 28.09.20 16:36 Сейчас в теме
(5)
просто очистить url при измерении наименования?
3. VictorRGB2 13 28.09.20 16:32 Сейчас в теме
как-то не понятно задача описана
в Группа номенклатуры что выбирается?
а url откуда берется?
приведенный запрос что делает, почему именно 5 первых?

по хорошему надо отобрать ЧТО переписывать и выбрать НА ЧТО переписывать, уже потом жмакать Выполнить
а пока не понятно, что к чему
9. OMOIVA 28.09.20 16:38 Сейчас в теме
В группе номенклатуры, выбирается группа номенклатуры, условно папка с товаром в ней.
Товар имеет наименование, а из наименования формируется реквизит URL.
Формирует его 1С автоматически при создании товара.
Если наименование товара было изменено, нужно менять и URL (нужно для выгрузки на сайт).
Приведенный запрос должен отбирать элементы с определенной группы, которая выбирается в диалоговом окне.
Далее с отобранными элементами нужно произвести процедуру перезаписи реквизита URL.
Перезапись выглядит просто, нужно уже существующий реквизит, перезаписать на "НИЧЕГО", т.е. Объект.URL = "";
12. VictorRGB2 13 28.09.20 16:41 Сейчас в теме
(9) по идее тогда должна быть связь между Спр.Номенклатура и Спр.CMS1C_Номенклатура
или это один и тот же справочник?
13. OMOIVA 28.09.20 16:42 Сейчас в теме
Разные справочники, но они между собой синхронизируются.
Т.е. если создается элемент в Номенклатуре, то он автоматически создается в CMS1C_Номенклатура.
15. DanDy 52 28.09.20 16:43 Сейчас в теме
(13)Ну так и посмотрите есть ли в CMS1C_Номенклатура ссылка на элемент справочника Номенклатура
4. alalsl 11 28.09.20 16:34 Сейчас в теме
6. keyn5565` 18 28.09.20 16:34 Сейчас в теме
объясните какую задачу обработка должна решать. а то сколько не перечитываю ни как не пойму цель этой обработки...
11. OMOIVA 28.09.20 16:40 Сейчас в теме
Должно быть диалоговое окно с выбором группы с товаром (папка с товаром).
В отобранном товаре, есть реквизит URL, его надо перезаписать на "НИЧЕГО".
Всё.
17. VictorRGB2 13 28.09.20 16:45 Сейчас в теме
(11) оо ... не обновились данные
ну вот, так понятнее стало

Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 5
|   CMS1C_Номенклатура.Ссылка
| ИЗ
|    Справочник.CMS1C_Номенклатура КАК CMS1C_Номенклатура
|ГДЕ 
|   CMS1C_Номенклатура.Ссылка В ИЕРАРХИИ (&ДанныеРеквизитаСформы) ";
Запрос.УстановитьПараметр("ДанныеРеквизитаСформы", ГруппаНоменклатуры);

РезультатЗапроса = Запрос.Выполнить().Выгрузить;
Для Каждого элементСсылка Из РезультатЗапроса  Цикл
    элементОбъект = элементСсылка.Ссылка.ПолучитьОбъект();
    элементОбъект.url = "";
    элементОбъект.Записать();     
 КонецЦикла;
Показать
22. OMOIVA 28.09.20 17:51 Сейчас в теме
Попробовал так, как Вы написали, итог:
Код

Ошибка
7. SGordon1 28.09.20 16:35 Сейчас в теме
Использовать ПолучитьОбъект пробовали?
10. DanDy 52 28.09.20 16:39 Сейчас в теме
В запросе на вкладке условия добавьте условие
CMS1C_Номенклатура.Ссылка ВИерархии &ГруппаФормы

Запрос будет выглядеть примерно так

"ВЫБРАТЬ
	|	CMS1C_Номенклатура..Ссылка КАК Ссылка,
        |       CMS1C_Номенклатура.url
	|ИЗ
	|	Справочник.CMS1C_Номенклатура КАК CMS1C_Номенклатура
	|ГДЕ
	|	CMS1C_Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаСФормы)"
14. DanDy 52 28.09.20 16:42 Сейчас в теме
Ну а далее уже циклом перезаполняйте url

Запрос.УстановитьПараметр("ГруппаСФормы",<РеквизитФормыСГруппой>)
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
     НомОбъект=Выборка.Ссылка.ПолучитьОбъект()
     НомОбъект.url="";
     НомОбъект.Записать();
 КонецЦикла;    
КонецПроцедуры
Показать



(10)
ГруппаСФормы
27. OMOIVA 28.09.20 18:40 Сейчас в теме
(14) Немного непонятна эта строка:
Запрос.УстановитьПараметр("ГруппаСФормы",)

Что такое ГруппаСФормы и РеквизитФормыСГруппой?
16. keyn5565` 18 28.09.20 16:44 Сейчас в теме
Запрос = Новый Запрос();
	//тут указываем имя реквизита группы номенклатуры
	Запрос.УстановитьПараметр("ГруппаНоменклатуры", ГруппаНоменклатуры);
	ТекстЗапроса =
	"ВЫБРАТЬ
	|	Номенклатура.Ссылка КАК Ссылка,
	|	Номенклатура.Наименование КАК Наименование
	|ИЗ
	|	Справочник.CMS1C_Номенклатура КАК Номенклатура
	|ГДЕ
	|	Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
	|	И НЕ Номенклатура.ЭтоГруппа
	|	И НЕ Номенклатура.ПометкаУдаления";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		ЭлементОбъект = Выборка.Ссылка.ПолучитьОбъект();
		ЭлементОбъект.url = "";
		ЭлементОбъект.Записать();
		
	КонецЦикла;
Показать
Прикрепленные файлы:
ВнешняяОбработка4.epf
18. OMOIVA 28.09.20 16:55 Сейчас в теме
{ВнешняяОбработка.URL.Форма.Форма.Форма(17)}: Ошибка при вызове метода контекста (Выполнить)
Выборка = Запрос.Выполнить().Выбрать();
по причине:
{(1, 1)}: Ожидается выражение "ВЫБРАТЬ"
19. VictorRGB2 13 28.09.20 17:13 Сейчас в теме
(18) вот люди...
за них все сделали, код написали, в обработку оформили, даже подумать не хотите найти ошибку самому...

"ТекстЗапроса =" заменить на "Запрос.Текст = "
keyn5565`; +1 Ответить
20. OMOIVA 28.09.20 17:26 Сейчас в теме
(19) Извиняюсь, я в этом полный 0. :)
21. OMOIVA 28.09.20 17:40 Сейчас в теме
(19) Выбрал группу, нажал кнопку - ничего не происходит.
&НаСервере
Процедура ВыполнитьНажатие(Элемент)
Запрос = Новый Запрос();
    //тут указываем имя реквизита группы номенклатуры
    Запрос.УстановитьПараметр("ГруппаНоменклатуры", ГруппаНоменклатуры);
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.CMS1C_Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        ЭлементОбъект = Выборка.Ссылка.ПолучитьОбъект();
		Сообщить(ЭлементОбъект.url);
        ЭлементОбъект.url = "";
        ЭлементОбъект.Записать();
        
    КонецЦикла;
КонецПроцедуры
Показать
23. VictorRGB2 13 28.09.20 17:55 Сейчас в теме
(21) ответ в (13)
справочники разные, НО не связанные между собой
запрос надо модифицировать
как-то так
точнее уже в конструкторе запроса в конфе

Запрос.УстановитьПараметр("ГруппаНоменклатуры", ГруппаНоменклатуры);
Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Наименование КАК НоменклатураНаименование
|ПОМЕСТИТЬ втНомеклатура
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
|    И НЕ Номенклатура.ЭтоГруппа
|;
|ВЫБРАТЬ
|    CMS1C_Номенклатура.Ссылка КАК Ссылка
|    CMS1C_Номенклатура.Наименование КАК Наименование
|ИЗ
|    втНомеклатура КАК втНомеклатура 
|    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.CMS1C_Номенклатура КАК CMS1C_Номенклатура 
|    ПО CMS1C_Номенклатура.Наименование = втНомеклатура.НоменклатураНаименование
|ГДЕ 
|    НЕ CMS1C_Номенклатура.Ссылка ЕСТЬ NULL
";
Показать
24. OMOIVA 28.09.20 18:03 Сейчас в теме
Спасибо за ответ, но зачем подключать обычную номенклатуру?
В запросе достаточно использовать только CMS1C_Номенклатура, чтобы изменить URL.
Изменение этого реквизита, никак не касается обычного справочника Номенклатура.
Этот реквизит есть только в справочнике CMS1C_Номенклатура.
И Ваш вариант выдал следующее:
{ВнешняяОбработка.URL.Форма.Форма.Форма(25)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить().Выгрузить;
по причине:
{(12, 5)}: Синтаксическая ошибка "CMS1C_Номенклатура.Наименование"
<<?>>CMS1C_Номенклатура.Наименование КАК Наименование
25. VictorRGB2 13 28.09.20 18:11 Сейчас в теме
(24) а же пишу, это примерно как должен выглядеть запрос, не готовое решение
у меня нет вашей конфигурации, чтобы его написать правильно
ошибка показывает, что у CMS1C_Номенклатура нет реквизита Наименование

а зачем подключать обычную Номенклатуру? так затем чтобы найти наименования товаров для изменения url, которые в CMS1C_Номенклатура, который никак с Номенклатурой не связан (я так понимаю), кроме как по наименованиям
но, возможно я ошибаюсь и связь таки есть, но только вы сами тогда сможете ее определить, т.к. увидите ее в конфигурации и тогда достаточно подменить в запросе условие соединения на верную связь
26. OMOIVA 28.09.20 18:34 Сейчас в теме
(25) В конструкторе есть такой реквизит.
Прикрепленные файлы:
28. VictorRGB2 13 28.09.20 18:41 Сейчас в теме
(26) а Владелец это что?
не Номенклатура случаем?
29. OMOIVA 28.09.20 18:45 Сейчас в теме
(28) Возможно.
В месте ошибки подставил CMS1C_Номенклатура.Владелец.Наименование
И CMS1C_Номенклатура.Владелец, та же ошибка.
Прикрепленные файлы:
30. VictorRGB2 13 28.09.20 18:48 Сейчас в теме
(29) так ткните во владельца, что у него за тип?
если владелец, это Спр.Номенклатура, все упростится до
"ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Ссылка,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.CMS1C_Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Владелец В ИЕРАРХИИ(&ГруппаНоменклатуры)";
31. OMOIVA 28.09.20 18:53 Сейчас в теме
(30) Владелец - это спр.Номенклатура.
Упростил по вашему примеру:
{ВнешняяОбработка.URL.Форма.Форма.Форма(14)}: Поле объекта не обнаружено (Выгрузить)
РезультатЗапроса = Запрос.Выполнить().Выгрузить;
32. VictorRGB2 13 28.09.20 19:04 Сейчас в теме
(31) Выгрузить это метод
правильно будет
РезультатЗапроса = Запрос.Выполнить().Выгрузить();

хоть СП читайте...не все же за вас делать то...
33. OMOIVA 28.09.20 19:25 Сейчас в теме
(32) Спасибо БОЛЬШОЕ, всё работает.

ВОЛШЕБНЫЙ КОД
Оставьте свое сообщение

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