Имя: Пароль:
1C
1С v8
Запрос ко всем документам
0 Eeelena
 
12.09.13
11:54
Здравствуйте, подскажите пожалуйста, как мне перебрать табличные части всех документов и если встречается номенклатура помеченная на удаление в этой табличной части, то удалить ее ?

Вот так выбираю все документы:

МассивДокументов=Метаданные.Документы;
    Для каждого СтрМас Из МассивДокументов Цикл
        ДокТип=СтрМас.Имя;
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    "+ДокТип+".Ссылка
        |ИЗ
        |    Документ."+ДокТип+" КАК "+ДокТип;
        Результат = Запрос.Выполнить();
        ВыборкаДетальныеЗаписи = Результат.Выбрать();
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Сообщить(" "+ВыборкаДетальныеЗаписи.Ссылка);
        КонецЦикла;
    КонецЦикла;

Как мне выбрать только те документы в которых есть номенклатура помеченная на удаление и удалить ее?
1 Maxus43
 
12.09.13
11:56
>>Как мне выбрать только те документы в которых есть номенклатура помеченная на удаление и удалить ее?

кури НайтиПомеченныеНаУдаление + НайтиПоСсылкам
2 Eeelena
 
12.09.13
11:58
а как выбрать табличную часть? они же по разному называются для всех документов?
3 Maxus43
 
12.09.13
11:59
Можешь просто сделать удаление помеченных номенклатур, контроль сам скажет где они есть, в т.ч. и документы какие
4 Eeelena
 
12.09.13
12:00
а как мне потом удалить номенклатуру из этих документов? их же там много? в ручную это очень долго
5 spu79
 
12.09.13
12:00
Запрос не к документам, а к табличным частям (не помню ни одного документа с номенклатурой в шапке). Есть общая процедура проверки, есть ли указанный реквизит в объекте. Дальше совсем просто
| ГДЕ ...Номенклатура.ПометкаУдаления
6 catena
 
12.09.13
12:01
Вот от удаления документов дошли до удаления номенклатуры из документов. Следующая тема будет, видимо, "как удалить из движений" либо "после перепроведения документов изменились остатки"
7 spu79
 
12.09.13
12:01
(4) есть консоль запросов с функцией обработки полученного результата (у меня только под обычное приложение)
8 Eeelena
 
12.09.13
12:03
spu79, подскажите пожалуйста что за процедура проверки?
9 sda553
 
12.09.13
12:05
Несколько запросов в цикле, который формируется по метаданным табличных частей. Заодно можно отбросить все те типизированные ТЧ в которых номенклатуры в принципе быть не может.
10 Maxus43
 
12.09.13
12:07
устанешь запрос сочинять, я реально. Найди просто все помеченный на удалени, отфильтруй оттуда только номенклатуру и НайтиПоссылкам(массив номенклатур)
11 Eeelena
 
12.09.13
12:08
как сделать запрос к табличным частям всех документов?
12 Maxus43
 
12.09.13
12:09
что в лоб, что по лбу. Неверный путь выбрали изначально. Ну как хотите
13 Serg_1960
 
12.09.13
12:09
(0) Eeelena , удаление  помеченных объектов - это есть во всех конфигурациях. Полный интерфейс - Операции - Удаление помеченных объектов. Чем оно тебя не устраивает?
14 Eeelena
 
12.09.13
12:09
мне нужно не просто удалит номенклатуру, а именно из документов
15 Serg_1960
 
12.09.13
12:10
(14) Там есть возможность выбрать только номенклатуру и удалить только из документов.
16 Maxus43
 
12.09.13
12:10
(15) нет там возможности удалить из документов строки с номенклатурой. Или у вас продвинутая версия?
17 Euguln
 
12.09.13
12:12
(14) удалить номенклатуру или строки с номенклатурой?
18 Eeelena
 
12.09.13
12:13
простите, строки номенклатуры из документа
19 Euguln
 
12.09.13
12:15
(18) а как насчет (6)????
20 Eugene_life
 
12.09.13
12:16
(18) А с суммой документа что будет при этом? Был документ на сумму 100 руб и 10 позиций. Вы убираете строку №7 на сумму 15 руб. Сумма документа меняется. И чем вам лучше?
21 Eeelena
 
12.09.13
12:17
дак без разницы что с суммой нужно удалить строку
22 Serg_1960
 
12.09.13
12:20
(16) Упс. Сорри, был не прав. "Погорячился"(с)
23 spu79
 
12.09.13
12:29
(8) МетаданныеОбъекта = Объект.Ссылка.Метаданные();
МетаданныеОбъекта.Реквизиты.Найти(Реквизит) <> Неопределено
проверка на наличие реквизита.
пример из: Общий модуль, ОбщегоНазначенияУТ. конф УТ 11.1.2.8
метод найти (раздел Работа с объектами метаданных)

Найти (Find)
Синтаксис:

Найти(<ИмяПоля>)
Параметры:

<ИмяПоля> (обязательный)

Тип: Строка.
Имя искомого поля ввода по строке.
Возвращаемое значение:

Тип: Поле; Неопределено.
Если не найден, возвращается Неопределено.
Описание:

Осуществляет поиск поле ввода по строке по его имени.

Доступность:

Сервер, толстый клиент, внешнее соединение.
24 Serg_1960
 
12.09.13
12:39
Сорри, имхо методически неверные решения. Сейчас попробую набросать болванку алгоритма.
25 Eeelena
 
12.09.13
12:48
буду очень признательна
26 Serg_1960
 
12.09.13
13:17
Вот такая методика поиска и отбора подходит? Дальше есть смысл писать?

    ТипСсылокПомеченныхНаУдаление = Тип("СправочникСсылка.Номенклатура");
    
    МассивПомеченныхНаУдаление = Новый Массив();
    Для Каждого СсылкаПомеченнаяНаУдаление Из НайтиПомеченныеНаУдаление() Цикл
        Если ТипЗнч(СсылкаПомеченнаяНаУдаление) = ТипСсылокПомеченныхНаУдаление Тогда
            МассивПомеченныхНаУдаление.Добавить(СсылкаПомеченнаяНаУдаление);
        КонецЕсли;
    КонецЦикла;
    
    Для Каждого НайденнаяСсылка Из НайтиПоСсылкам(МассивПомеченныхНаУдаление) Цикл
        Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(НайденнаяСсылка.Данные)) Тогда
            Сообщить("Документ """ + НайденнаяСсылка.Данные + """, содержит ссылку на """ + НайденнаяСсылка.Ссылка + """");
        КонецЕсли;
    КонецЦикла;
27 Eeelena
 
12.09.13
13:38
спасибо большое, вы очень помогли)
28 Eeelena
 
12.09.13
13:43
еще подскажите пожалуйста как мне удалить эту найденную номенклатуру?
29 Serg_1960
 
12.09.13
13:45
Наберись терпения, сейчас допишу (надо ведь ещё базу найти,которую не жалко:)
30 Eeelena
 
12.09.13
13:46
очень жду) только номенклатуру нужно удалить именно из документа
31 Maxus43
 
12.09.13
14:28
(30) сейчас сравни (1) и (26), это одно и тоже
32 Serg_1960
 
12.09.13
14:51
Вот, разродился гадким утёнком. Алгоритм, имхо, - не фонтан. Вы спросите "Почему?".

Потому что мне не понятна позиция автора в случае, когда в табличной части присутствуют несколько колонок с типом справочника Номенклатура. Ну, например, в таблице документа есть колонки "Материал" и "Продукция". И что в таком случае проверять будем? Непонятно :(
33 Serg_1960
 
12.09.13
14:52
ТипСсылокПомеченныхНаУдаление = Тип("СправочникСсылка.Номенклатура");
    
    МассивПомеченныхНаУдаление = Новый Массив();
    Для Каждого СсылкаПомеченнаяНаУдаление Из НайтиПомеченныеНаУдаление() Цикл
        Если ТипЗнч(СсылкаПомеченнаяНаУдаление) = ТипСсылокПомеченныхНаУдаление Тогда
            МассивПомеченныхНаУдаление.Добавить(СсылкаПомеченнаяНаУдаление);
        КонецЕсли;
    КонецЦикла;
    
    Для Каждого НайденнаяСсылка Из НайтиПоСсылкам(МассивПомеченныхНаУдаление) Цикл
        Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(НайденнаяСсылка.Данные)) Тогда
            НадоЗаписать = Ложь;
            Объект = НайденнаяСсылка.Данные.ПолучитьОбъект();
            Для Каждого МетаданныеТабличнаяЧасть Из Объект.Метаданные().ТабличныеЧасти Цикл
                ТабличнаяЧастьОбъекта = Объект[МетаданныеТабличнаяЧасть.Имя];
                Пока Истина Цикл
                    СтрокаТабличнойЧасти = ТабличнаяЧастьОбъекта.Найти(НайденнаяСсылка.Ссылка);
                    Если СтрокаТабличнойЧасти = Неопределено Тогда
                        Прервать;
                    Иначе
                        Сообщить("Документ """ + НайденнаяСсылка.Данные + """, строка № " + СтрокаТабличнойЧасти.НомерСтроки + " содержит ссылку на """ + НайденнаяСсылка.Ссылка + """");
                        ТабличнаяЧастьОбъекта.Удалить(СтрокаТабличнойЧасти);
                        НадоЗаписать = Истина;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
            Если НадоЗаписать Тогда
                Если Объект.Проведен Тогда
                    Объект.Записать(РежимЗаписиДокумента.Проведение);
                Иначе
                    Объект.Записать(РежимЗаписиДокумента.Запись);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат;
34 Eeelena
 
13.09.13
07:20
Serg_1960, спасибо большое)
Программист всегда исправляет последнюю ошибку.