Проверка номенклатуры на имеющиеся ссылки #731317


#0 by LastSoldier
Всем привет! Пытаюсь создать свою первую внешнюю обработку, как сделать отбор для удаления только той номенклатуры на которую не были созданы документы в базе, КРОМЕ "Установки цен номенклатуры"
#1 by busy1
Запросом из регистров по котором документы делают движения. Если движений нет, запрос пустой, тогда номеклатуру удалять.
#2 by Rie
Если вопрос о том, как проверить, какого вида документом создано движение - см. ССЫЛКА.
#3 by ssh2QQ6
> Пытаюсь создать свою первую внешнюю обработку... для удаления Первая обработка и сразу для удаления.
#4 by Cube
СП: Глобальный контекст (Global context) Синтаксис: НайтиПоСсылкам(<СписокСсылок>) Параметры: <СписокСсылок> (обязательный) Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти. Возвращаемое значение: Тип: ТаблицаЗначений. Возвращает ссылки на найденные объекты в виде ТаблицаЗначений. Первая колонка - исходная ссылка. Вторая колонка - ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, олицетворяющее запись необъектной таблицы. Третья колонка - объект метаданных, которому соответствуют данные в которых найдена ссылка. Описание: Осуществляет поиск ссылок на объекты, переданные в параметре <СписокСсылок>.
#5 by LastSoldier
Пока вот что я смог написать
#6 by LastSoldier
а это плохо что первая для удаления? )) или плохой признак?))
#7 by Fish
Это нормально. Главное, чтобы вторая не была для восстановления того, что удалила первая.
#8 by LastSoldier
на тестовой проверим ) Мне надо отобрать только тот товар, на который в базе вообще нет никаких документов или есть только установка цен номенклатуры, остальные не трогать
#9 by Rie
Бред. Проверку на удаление надо не в цикле делать, а непосредственно в запросе. Ну и уж если стоит задача проверить движения - то в запросе же и проверить, были ли они.
#10 by LastSoldier
я еще не спец по запросам, только простое могу написать.
#11 by Rie
Пройдись по метаданным. Собери те виды документов, которые могут трогать номенклатуру. Впихни в запрос. А что делать с теми, на которые были ссылки в "УстановкаЦенНоменклатуры"? Удалить - и получить битые ссылки в результате? Кроме того, на номенклатуру могут ссылаться и объекты, не делающие движений.
#12 by Rie
Ну так учись... Что тут ещё можно сказать? (Насчёт проверки помеченных на удаление - в _конструкторе запросов_ содержится как бы намёк, как проверить).
#13 by Rie
+ И см. .
#14 by LastSoldier
вот как раз начал учиться ) мне не нужные битые ссылки. Надо чтобы только была поставлена пометка на удаление номенклатуры и все, удалю я ее сам потом
#15 by hhhh
в общем обработок писать не надо. Помечаешь всю номенклатуру для удаления. И запускаешь удаление помеченных объектов. Те, которых нет в документах удалятся, те, которые есть, останутся.
#16 by LastSoldier
я уже пробовал, мне такой вариант не подходит, остается номенклатура которая есть только в документах "установка цен", а мне ее то же надо удалить, так как движения по ней вообще в базе нет
#17 by LastSoldier
так Вы говорите, проще все то что мне надо сделать в "Запросе"? там можно и ставить пометку на удаление?
#18 by Rie
А сами документы установки цен удалять не пробовал? А почему? Если удалишь номенклатуру, которая есть в документах установки цен - висячие ссылки пойдут. А это нехорошо.
#19 by LastSoldier
мне их удалять нельзя, так как там есть товар используемый в базе
#20 by Rie
Ставить - нельзя. А проверить - можно. Насчёт проверки вида документа - см. ССЫЛКА. Но! Придётся в запросе справочник Номенклатура соединить со всеми регистрами, где он встречается. И со всеми документами, где он встречается. И со всеми справочниками, где он встречается. Это можно сделать автоматически - пробежаться по метаданным и сформировать часть текста запроса, отвечающую за соединения. Но - см. . Получишь все ссылки. Потом проверишь.
#21 by Rie
"Наш пламенный привет родным и близким. Или, говоря иными словами, родным и близким - наш пламенный привет". Угадай, как будут выглядеть эти документы (которые удалять нельзя) после удаления номенклатуры. Реши, что с ними делать. А уж потом занимайся удалением.
#22 by LastSoldier
еще раз говорю мне надо сделать только пометку на удаление номенклатуры и все. А для документов "Установка цен", у меня уже есть другая обработка которая проверяет, если номенклатура помечена на удаление, то удалить ее из установки цен и перезаписать документ. все 5 документов установки цен
#23 by LastSoldier
Я несколько раз читал Ваше сообщение, но так ничего и не понял, в теории я примерно представляю свою задачу, а вот на практике пока еще нет
#24 by Cube
На вот, готовый инструмент: Пользоваться, примерно так: Указал тип, объекта, поставил галочку "Комментировать", нажал "Пробный поиск", на все вопросы ответил утвердительно.
#25 by LastSoldier
РезультатЗапроса = Запрос.Выполнить.Выбрать; Подскажите, я не пойму почему по этому запросу он начал с буквы "П", а потом "А"? Или он берет первую созданную номенклатуру?
#26 by Rie
А какая хрен разница, с какой буквы он начал? Если надо сортировать по наименованию - так и скажи в запросе.
#27 by Cube
+ Ах да, писал сам, но давно (еще под 8.1, вроде), так что, что там и как - не помню))) Но код открыт, можешь ознакомиться.
#28 by LastSoldier
Извините что не указал ут 11. Готовый эт конечно хорошо, вот только бы понять как самому делать, а то все время на готовом ну я не знаю как должно быть, вот и спросил
#29 by LastSoldier
понял, посмотрю код
#30 by Cube
Запусти свою УТ11 на обычных формах ключом "/RunModeOrdinaryApplication" и пользуйся на здоровье
#31 by Rie
Возьми НайтиСсылки. Выбери из них все, которые не установка цен (а вернее, ещё и не регистр цен). Можно сначала выгрузить во временную таблицу - а затем по ней запросом пройтись.
#32 by LastSoldier
Почему по этому запросу берет группы, мне их трогать нельзя.
#33 by Rie
ГДЕ     НЕ Номенклатура.ЭтоГруппа
#34 by ДенисЧ
а условие на группу поставить? И сортировку:
#35 by LastSoldier
Спасибо, нашел где это в запросе надо было  выбирать
#36 by Serg_1960
(офф) Эх... в былые временя тут бы накидали кучу алгоритмов попоиску не используемых позиций номенклатуры и устроили состязания на тему, чей алгоритм самый быстрый...
#37 by LastSoldier
А можно просмотреть список всех ссылок номенклатуры? Элемент.НайтиСсылки; ну так чет не работает, еще не могу понять где их смотреть. Смотрел в РезультатЗапроса.Ссылка, так там нет установки цен
#38 by Rie
У НайтиСсылки - параметры есть. Ну и не поэлементно искать надо, а сразу массив из всех сунуть в качестве параметра. Не РезультатЗапроса.Ссылка, а в запросе (если документы в запросе перебираешь, а не по НайтиСсылка) - Регистратор ССЫЛКА Документ.УстановкаЦенНоменклатуры.
#39 by LastSoldier
так у меня нет поля "Регистратор", пока не пойму как его добавить
#40 by Cube
Смысл обсасывать в 100500 раз то, что гуглится за 5 минут?
#41 by LastSoldier
ппц, я не там искал сори
#42 by LastSoldier
Как-то так получилось, только тут поругался "НЕ Номенклатура.ЭтоГруппа" (Но можно было игнорить)
#43 by Serg_1960
Смысл.Не, это как бы намёк ТС :)
#44 by Serg_1960
Номенклатура.ЭтоГруппа = ЛОЖЬ
#45 by LastSoldier
Пишет неоднозначное поле "НЕ Номенклатура.ЭтоГруппа", если го удалить, то пишет  неоднозначное поле "ЦеныНоменклатуры.Номенклатура = Номенклатура.Ссылка"
#46 by Rie
Зачем ЛЕВОЕ СОЕДИНЕНИЕ? Замени на ВНУТРЕННЕЕ. И не майся с группой - в регистре их не будет, а если соединение - внутреннее, то и в результат запроса группы не попадут. Ошибка у него в другом - Номенклатура непонятно откуда берётся - но ли это имя таблицы (КАК), то ли имя поля (и из какой таблицы).
#47 by LastSoldier
неоднозначное поле "ПО ЦеныНоменклатуры.Номенклатура = Номенклатура.Ссылка"
#48 by Rie
Всяко неоднозначное. Переименуй таблицу в спрНоменклатура, к примеру. И имена таблиц перед именами полей указывай (через точку).
#49 by LastSoldier
Вот я как раз и не могу понять как получить этот СписокСсылок (не для всех товаров сразу, а для каждого отдельно), для НайтиПоСсылкам(<СписокСсылок>);
#50 by LastSoldier
Пока дела идут успешно, осталось обработать результаты )
#51 by FIXXXL
это лучше под Если ТабСсылок.Количество >0 тогда убрать нифиг базу без толку дергать :)
#52 by LastSoldier
вот, оцените внешнюю обработку и скажите замечания. Она сразу проверяется всю номенклатуру
#53 by LastSoldier
Только она что-то очень долго отрабатывает, можно этот как-то ускорить?
#54 by LastSoldier
Если (ДРегистры="Установка цен номенклатуры")                     или (ДРегистры="Группы значений доступа")                     или (ДРегистры="(не используется) Группы значений доступа") Тогда
#55 by LastSoldier
Подскажите как сделать двойной цикл, мне надо обходить сначала по элементам массива(название номенклатуры), а потом обходить ссылки этой номенклатуры, пробовал так "Для Индекс=МассивСсылок.Найти(Элем) ПО Индекс=Индекс+1 цикл"
#56 by Рэйв
Для Каждого Элемент Из ТвойМассив Цикл      КонецЦикла А как ты собираешься внутри одного названия обходить ссылки? Дубли ищешь чтоли?
#57 by LastSoldier
ну я когда по циклу беру первый элемент (название номенклатуры), потом мне надо по другому циклу обходить его ссылки и смотреть, если они подходят под условие ДРегистры=ТабСсылок.Получить(Индекс).Метаданные.Синоним;                 Если (ДРегистры="Установка цен номенклатуры")                     или (ДРегистры="Группы значений доступа")                     или (ДРегистры="(не используется) Группы значений доступа") Тогда и других ссылок на этот элемент нету, то пометить его на удаление, а если есть другие ссылки, то перейти к следующему элементу и тд
#58 by LastSoldier
Если (ДРегистры="Установка цен номенклатуры")                     или (ДРегистры="Группы значений доступа")                     или (ДРегистры="(не используется) Группы значений доступа") Тогда Просто если брать так, то эта обработка отрабатывает за двое суток примерно, я так и не дождался, я хочу ускорить ее работу, добавив в массив ссылки не 1 элемента, а сразу 100 элементов
#59 by LastSoldier
скажите, в НайтиПоСсылкам(<СписокСсылок>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>) , работают "ИсключитьОбъекты"? а то как не пишу, выдает ошибку Ошибка {Форма.Форма.Форма}: Ошибка при вызове метода контекста (НайтиПоСсылкам) ТабСсылок = НайтиПоСсылкам(МассивЭлементов,,,МассивИскл); по причине: Несоответствие типов (параметр номер '4')
#60 by LastSoldier
Ут 11.1.9.66 1С Предприятие 8.3.5.1383
#61 by LastSoldier
Вот уже готовое решение если кому интересно &НаСервере                 Если (ДРегистры="Установка цен номенклатуры")                     или (ДРегистры="Группы значений доступа")                     или (ДРегистры="(не используется) Группы значений доступа") Тогда
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С