Имя: Пароль:
1C
1С v8
Как перебрать строки реквизита Номенклатура табличной части справочника
0 yabashu
 
29.06.23
16:14
Как перебрать строки реквизита Номенклатура табличной части справочника и узнать, есть ли из этой номенклатуры помеченная на удаление? Помогите джуну плиз
1 Волшебник
 
29.06.23
16:15
используйте цикл Для Каждого или запрос
2 yabashu
 
29.06.23
16:15
Задание такое:
На наличие в табличной части «Материалы и работы» элементов справочника «Номенклатуры», помеченных на удаление. В случае обнаружения помеченных на удаление элементов система должна выдать блокирующее сообщение: «В табличной части «Материалы и работы» в строке <№ строки> указана номенклатура, помеченная на удаление. Укажите корректную номенклатуру». Если строк, содержащих элементы, помеченные на удаление несколько, то они все должны быть указаны в сообщении через запятую: «В табличной части «Материалы и работы» в строках <№ строки 1>, <№ строки 2>,…, указана номенклатура, помеченная на удаление. Укажите корректную номенклатуру». В таком случае статус ресурсной спецификации должен остаться прежним, и карточка не записывается.
3 Волшебник
 
29.06.23
16:17
(2) ищите строки с условием: Номенклатура.ПометкаУдаления = Истина
Должно помочь
4 Donkey_hot
 
29.06.23
17:13
(2) Главное запрос в цикле не пишите, других тонкостей тут вроде нет.
Сначала запросом выберите помеченные на удаление элементы, входящие в ТЧ, затем при обходе выборке формируйте сообщение.
5 Donkey_hot
 
29.06.23
17:14
(4) Ну и Отказ = Истина установить, если выборка не пустая.
6 azernot
 
29.06.23
17:22
Если это задача на собеседовании, то только запрос.
Использование конструкции СтрокаТЧ.Номенклатура.ПометкаУдаления - верный способ завалить собеседование.
Использование конструкции ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТЧ.Номенклатура, "ПометкаУдаления")  - запрос в цикле, тоже не есть гуд.

Остаётся только запрос. Если проверка перед записью, то в запрос должна передаётся ТЗ из ТЧ объекта. Если при записи/проведении, то можно обратиться собственно к ТЧ ссылки.
7 yabashu
 
29.06.23
18:56
(6) (5) (3) Спасибо Вам большое за обратную связь! Я предполагаю этот запрос нужно как-то связать с переборкой номенклатуры? Есть идеи, как это правильно сделать?
8 yabashu
 
29.06.23
18:56
ВЫБРАТЬ
    РесурсныеСпецификацииМатериалыИУслуги.Номенклатура.Ссылка КАК НоменклатураСсылка,
    РесурсныеСпецификацииМатериалыИУслуги.Номенклатура.ПометкаУдаления КАК НоменклатураПометкаУдаления
ИЗ
    Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК РесурсныеСпецификацииМатериалыИУслуги
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.РесурсныеСпецификации КАК РесурсныеСпецификации
        ПО РесурсныеСпецификацииМатериалыИУслуги.Ссылка = РесурсныеСпецификации.Ссылка
ГДЕ
    РесурсныеСпецификацииМатериалыИУслуги.Номенклатура.ПометкаУдаления = &Истина
9 Волшебник
 
29.06.23
19:21
(8) в запросе &Истина замените на ИСТИНА

добавьте условие на конкретный документ/элемент (ресурсную спецификацию)
10 lodger
 
29.06.23
19:42
Получить всю таблицу справочника с колонкой есть внутри проблемные номенклатуры или нет:

ВЫБРАТЬ
    РесурсныеСпецификацииМатериалыИУслуги.Ссылка,
    МАКСИМУМ(РесурсныеСпецификацииМатериалыИУслуги.Номенклатура.ПометкаУдаления) КАК НоменклатураПометкаУдаления
ПОМЕСТИТЬ ТаблицаПоТЧ
ИЗ
    Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК РесурсныеСпецификацииМатериалыИУслуги

СГРУППИРОВАТЬ ПО
    РесурсныеСпецификацииМатериалыИУслуги.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РесурсныеСпецификации.Ссылка,
    ЕСТЬNULL(ТаблицаПоТЧ.НоменклатураПометкаУдаления, ЛОЖЬ) КАК НоменклатураПометкаУдаления
ИЗ
     Справочник.РесурсныеСпецификации КАК РесурсныеСпецификации
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПоТЧ КАК ТаблицаПоТЧ
        ПО ТаблицаПоТЧ.Ссылка = РесурсныеСпецификации.Ссылка
11 lodger
 
29.06.23
19:44
Получить только проблемные элементы справочника

ВЫБРАТЬ РАЗЛИЧНЫЕ
    РесурсныеСпецификацииМатериалыИУслуги.Ссылка
ИЗ
    Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК РесурсныеСпецификацииМатериалыИУслуги
ГДЕ
    РесурсныеСпецификацииМатериалыИУслуги.Номенклатура.ПометкаУдаления = ИСТИНА
12 lodger
 
29.06.23
19:45
з.ы. зато кратко, хотя может быть и не оптимально.
13 timurhv
 
29.06.23
21:16
(6)  Можно использовать:
ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивНоменклатуры, "ПометкаУдаления ")
14 Donkey_hot
 
29.06.23
21:40
(13) Придется тогда все равно поиском по ТЧ бегать, а в запросе можно сразу соединить с номерами строк. Не говорю, что это неправильно, но напрямую запросом как-то изящнее, что ли...
15 uPstart_
 
30.06.23
08:37
(10) Не сработает. По условию у него проверка перед записью документа. Еще по условию надо группировку по номенклатуре, что бы через запятую вывести список номеров строк. Тут нужно выгрузить список номенклатуры в таблицу, свернуть ее. Передать в Запрос для проверки на пометку на удаление и уже выводить сообщение.
16 azernot
 
30.06.23
11:36
(15) Не надо ничего сворачивать. Нужно из ТЧ выгрузить в ТЗ номер строки и номенклатуру, по этой ТЗ сделать временную таблицу в запросе, соединить со справочником номенклатуры, получить номера строк с помеченной на удаление номенклатурой, сформировать из этих номеров сообщение. Всё.
17 yabashu
 
03.07.23
12:33
После ваших комментариев окончательно запутался, может кто-то подсказать, какой механизм дальше реализовывать?

&После("ПередЗаписью")
Процедура ПередЗаписью(Отказ)
    
    ТЗ = ЭтотОбъект.МатериалыИУслуги.Выгрузить();
    
    Для Каждого Номенклатура Из ТЗ Цикл
        ОтобратьПоПометке = Новый Запрос;
        ОтобратьПоПометке.Текст = "
        |ВЫБРАТЬ РАЗЛИЧНЫЕ
        |РесурсныеСпецификацииМатериалыИУслуги.Ссылка
        |ИЗ
        |Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК РесурсныеСпецификацииМатериалыИУслуги
        |ГДЕ
        |РесурсныеСпецификацииМатериалыИУслуги.Номенклатура.ПометкаУдаления = ИСТИНА"
        ;         
    КонецЦикла;
    
КонецПроцедуры
18 АгентБезопасной Нацио
 
03.07.23
12:34
(17) начинайте осваивать отладчик.
19 lodger
 
03.07.23
12:47
(17) а.
ты сейчас написал такой код, будто тебе дали коробку с лего, ты его вытряхнул на пол, взял несколько крупных собранных кусков и просто положил на стол. так игра не заиграет.
20 azernot
 
03.07.23
12:52
(17) Что именно вы хотите? Чтобы кто-то сделал вашу задачу за вас? Медвежью услугу?
Да пожалуйста.

Процедура ПередЗаписью(Отказ)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ДанныеТЧ.НомерСтроки КАК НомерСтроки,
    |    ДанныеТЧ.Номенклатура КАК Номенклатура
    |ПОМЕСТИТЬ ТекущиеДанныеТЧ
    |ИЗ
    |    &ДанныеТЧ КАК ДанныеТЧ
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ТекущиеДанныеТЧ.НомерСтроки КАК НомерСтроки
    |ИЗ
    |    ТекущиеДанныеТЧ КАК ТекущиеДанныеТЧ
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
    |        ПО ТекущиеДанныеТЧ.Номенклатура = СправочникНоменклатура.Ссылка
    |ГДЕ
    |    СправочникНоменклатура.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("ДанныеТЧ", МатериалыИРаботы.Выгрузить());
    
    МассивНомеровСтрок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("НомерСтроки");
    
    Если МассивНомеровСтрок.Количество() > 0 Тогда
        ТекстОшибки = "В табличной части ""Материалы и работы"" в строках "+СтрСоединить(МассивНомеровСтрок,", ") +", указана номенклатура, помеченная на удаление. Укажите корректную номенклатуру
        ОбщегоНазначения.СообщитьПользователю(ТекстОшибки,,,,Отказ);
    КонецЕсли;
КонецПроцедуры
21 Donkey_hot
 
03.07.23
15:33
(20) Абсолютно верно.
22 Donkey_hot
 
03.07.23
15:35
(20) Единственное, наверное, условие на пометку удаления тоже в условия связи перенес бы.
23 CepeLLlka
 
03.07.23
15:41
(20)А что одну колонку нельзя выгрузить, чтобы ВТ не создавать? Передал массив номенклатуры в параметр запроса и просто выбрал из справочника номенклатуры, только ту, что в этом параметре и помечена на удаление.
24 CepeLLlka
 
03.07.23
15:42
Понятно, нужен номер строки
25 lodger
 
03.07.23
15:50
(24) ну можно по вернувшимся результатам сделать скан в ТЧ. думаю, это не так уж напряжно?
26 yabashu
 
03.07.23
16:17
(20) Нет, задача не в том, чтобы кто-то сделал за меня. Хотел просто принцип действия понять, чтобы научиться делать подобное. Большое спасибо за показательный пример. Буду теперь делать следующее задание - дубли искать =)
27 Donkey_hot
 
03.07.23
16:45
(25) Можно, но решение из 20 более наглядно (ИМХО)
28 Donkey_hot
 
03.07.23
16:47
(26) Странно немного Вы пытались понять принцип действия. Все в один голос посоветовали делать что угодно, но только не запрос в цикле. И плодом всех этих советов стал код из (17)
2 + 2 = 3.9999999999999999999999999999999...