Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Удаление документов
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
SanSay
1С:Предприятие 8.1 (8.1.15.14)
Конфигурация - самописная с нуля

Проблема:
написал процедуру для удаления определенных документов, а она то идеально отрабатывает, то не до конца, т.е. удаляет не все нужные документы

Код:
Сообщить("101");    
    номер = 0; // просто для проверки для подсчета колва проверенных документов
    НайденнаяСсылка2 = Документы.НовыйШтраф;
    НайденноеНарушение = НайденнаяСсылка2.НайтиПоРеквизиту("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
    Док = Документы.НовыйШтраф;
    Сообщить("102");
    Для Каждого Док Из Метаданные.Документы Цикл
        Сообщить("103");
        Выборка = Документы[Док.Имя].Выбрать();
        Пока Выборка.Следующий() Цикл
            
            //заплатка
            Если НайденноеНарушение.Нарушитель.Пустая() Тогда
                НайденноеНарушение = НайденнаяСсылка2.НайтиПоРеквизиту("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
                Сообщить("109");
            КонецЕсли;
                
            Сообщить("104");
            номер = номер + 1;
            Сообщить(номер);
            Сообщить("1" + Выборка.Нарушитель);
            Сообщить("3" + НайденноеНарушение.Нарушитель);
            Если Выборка.Нарушитель = НайденноеНарушение.Нарушитель Тогда
                Сообщить("Удалена запись" + Выборка.ПолучитьОбъект());
                Выборка.ПолучитьОбъект().Удалить();
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;    
    Сообщить("105");

Проблема в том, что иногда после удаления очередного документа слетает переменная НайденноеНарушение и все последующие документы уже не удаляются. Слететь она может и после удаления первого документа и после 2,3 и т.п. - никакой зависимости не прослеживается. Пока для решения проблемы сделал заплатку (в коде выделил //заплатка). Но знаю, что это не правильно и проблема в коде. Даже почти уверен, что код процедуры не идеальный, но я только учусь )

П.С. с заплаткой работает без сбоев.

Помогите разобраться, чтобы работало по человечески без заплаток.
Если надо могу и всю конфигурацию скинуть.
Vofka
Ваш код очень трудно понять. Опишите задачу словами.
SanSay
Есть форма
в верхнем окне выбираем фамилию внизу отображаются документы относящиеся к этой фамилии, при нажатии кнопки "Удалить сотрудника" документы по этому сотруднику должны удалиться.
Код кнопки "Удалить сотрудника" приведен в первом посте.
Vofka
Как-то так, наверное:

ОтборПоСотруднику = Новый Структура("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Документы.НовыйШтраф.Выбрать(,, ОтборПоСотруднику);
Пока Выборка.Следующий() Цикл
   Док = Выборка.Ссылка.ПолучитьОбъект();
   Док.Удалить();
КонецЦикла;
SanSay
При попытке удалить сотрудника:
{ОбщаяФорма.Сотрудники(4)}: Ошибка при вызове метода контекста (Выбрать): Недопустимое значение параметра (параметр номер '3')
Выборка = Документы.НовыйШтраф.Выбрать(,, ОтборПоСотруднику);
по причине:
Недопустимое значение параметра (параметр номер '3')
Vofka
Сфотографируйте структуру документа НовыйШтраф.
SanSay
не знаю, то это или нет:
Vofka
Можно ещё так попробовать:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Док.Ссылка ИЗ Документы.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель";
Запрос.УстановитьПараметр("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Док = Выборка.Ссылка.ПолучитьОбъект();
   Док.Удалить();
КонецЦикла;
SanSay
Цитата(Vofka @ 25.10.13, 10:55) необходимо зарегистрироваться для просмотра ссылки
Можно ещё так попробовать:

еще больше ругается
{ОбщаяФорма.Сотрудники(14)}: Ошибка при вызове метода контекста (Выполнить): {(1, 23)}: Таблица не найдена "Документы.НовыйШтраф"
ВЫБРАТЬ Док.Ссылка ИЗ <<?>>Документы.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель
Выборка = Запрос.Выполнить().Выбрать();
по причине:
{(1, 23)}: Таблица не найдена "Документы.НовыйШтраф"
ВЫБРАТЬ Док.Ссылка ИЗ <<?>>Документы.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель

может проще всю конфу скинуть?
а то Вы наверно стандартные методы предлагаете... а я же самоучка... небось по кривому все пишу )
Vofka
Цитата(SanSay @ 25.10.13, 10:03) необходимо зарегистрироваться для просмотра ссылки
может проще всю конфу скинуть?

Нет, спасибо.

Вот так попробуйте:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Док.Ссылка ИЗ Документ.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель";
Запрос.УстановитьПараметр("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Док = Выборка.Ссылка.ПолучитьОбъект();
   Док.Удалить();
КонецЦикла;
SanSay
Цитата(Vofka @ 25.10.13, 11:09) необходимо зарегистрироваться для просмотра ссылки
Нет, спасибо.

Вот так попробуйте:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Док.Ссылка ИЗ Документ.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель";
Запрос.УстановитьПараметр("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
   Док = Выборка.Ссылка.ПолучитьОбъект();
   Док.Удалить();
КонецЦикла;


вот так работает... и так и сяк по тестировал, не глюкает... спасибо большое!

П.С. хотелось конечно узнать что в моем овнокоде криво срабатывает, но ладно... Ваш корректнее.
Vofka
SanSay, близко к сердцу не принимайте, но то, что вы в первом посте показали - это один большой кусок овнокода, который вообще непонятно как работает и который логическому осмыслению не поддается. Разбираться в нем, соответственно, не представляется никакого интереса (для меня лично) bk.gif . А вообще кто не был молод - тот не был глуп. Запишите где-то себе этот код и посмотрите на него пару лет спустя...
Ardi
Глобальный контекст.НайтиПоСсылкам (Global context.FindByRef)
Глобальный контекст (Global context)
НайтиПоСсылкам (FindByRef)
Синтаксис:

НайтиПоСсылкам(<СписокСсылок>)
Параметры:

<СписокСсылок> (обязательный)

Тип: Массив.
Массив со списком ссылок на объекты, ссылки на которые нужно найти.
Возвращаемое значение:

Тип: ТаблицаЗначений.
Возвращает ссылки на найденные объекты в виде ТаблицаЗначений.
Первая колонка - исходная ссылка.
Вторая колонка - ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, олицетворяющее запись необъектной таблицы.
Третья колонка - объект метаданных, которому соответствуют данные в которых найдена ссылка.
Описание:

Осуществляет поиск ссылок на объекты, переданные в параметре <СписокСсылок>.

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

Сервер, толстый клиент, внешнее соединение.
Примечание:

Поиск осуществляется только в тех данных, которые доступны в рамках текущего сеанса с учетом разделения (условное разделение учитывается).
Пример:

Ссылки = НайтиПомеченныеНаУдаление();
ТабСсылок = НайтиПоСсылкам(Ссылки);
Для Каждого Ссылка из ТабСсылок Цикл
    Сообщить ("" + СокрЛП(Ссылка[0]) + "  " + СокрЛП(Ссылка[1]));
КонецЦикла;

Vofka
Ardi, а это что? Рамдомно скопированный метод из СП? Или ваш уровень телепатии подсказывает, что задача у ТС-а удалить помеченные на удаление документы? smile.gif
SanSay
удалять самого нарушителя так пойдет?
    СтрокаНаименования = ЭлементыФормы.Нарушители.ТекущаяСтрока;
    ФИО = Справочники.ФИО;
    НайденнаяСсылка = ФИО.НайтиПоНаименованию(СтрокаНаименования);
    Если НайденнаяСсылка = СтрокаНаименования Тогда
        Объект = НайденнаяСсылка.ПолучитьОбъект();
        Объект.Удалить();
    КонецЕсли;

или тоже сверх криво?
П.С. код работает
Ardi
Этот метод возвращает список всех объектов которые ссылаются на указанный объект.
А в 0-ом посте идёт перебор абсолютно всех документов.
Vofka
Цитата(Ardi @ 25.10.13, 11:10) необходимо зарегистрироваться для просмотра ссылки
Этот метод возвращает список всех объектов которые ссылаются на указанный объект.

По хорошему да, такая проверка будет не лишней smile.gif
Zaval
Цитата(SanSay @ 25.10.13, 11:07) необходимо зарегистрироваться для просмотра ссылки
удалять самого нарушителя так пойдет?


Сделайте список из Ссылок на справочник ФИО(тип значения в списке - СправочникСсылка.ФИО).
Тогда не нужно ничего искать и проверять нечего )
SanSay
сделал так:
    СтрокаНаименования = ЭлементыФормы.Нарушители.ТекущаяСтрока;
    СтрокаНаименования.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
    Ссылки = НайтиПомеченныеНаУдаление();
    ТабСсылок = НайтиПоСсылкам(Ссылки);
    Для Каждого Ссылка из ТабСсылок Цикл
        Если СтрокаНаименования.Наименование = СокрЛП(Ссылка[0]) Тогда
            Сообщить ("Удален документ на сотрудника: " + СокрЛП(Ссылка[0]) + " - " + СокрЛП(Ссылка[1]));
            //Ссылка[1].ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
            Ссылка[1].ПолучитьОбъект().Удалить();
        КонецЕсли;
    КонецЦикла;
//удаление сотрудника
    ФИО = Справочники.ФИО;
    НайденнаяСсылка = ФИО.НайтиПоНаименованию(СтрокаНаименования);
    Если НайденнаяСсылка = СтрокаНаименования Тогда
        Объект = НайденнаяСсылка.ПолучитьОбъект();
        Сообщить ("Удален сотрудник: " + НайденнаяСсылка);
        Объект.Удалить();
    КонецЕсли;

Добавил проверку на нужного мне сотрудника, т.к. малоли кто поотмечал всякие документы, номенклатуры и т.п. "на удаление".
Код работает.
Непосредственное удаление самого сотрудника пока по старому варианту... т.к.
Цитата(Zaval @ 25.10.13, 12:18) необходимо зарегистрироваться для просмотра ссылки
Сделайте список из Ссылок на справочник ФИО(тип значения в списке - СправочникСсылка.ФИО).Тогда не нужно ничего искать и проверять нечего )


если я правильно понял, то
Цитата(SanSay @ 25.10.13, 10:30) необходимо зарегистрироваться для просмотра ссылки

в верхний список такое значение и имеет.
только не улавливаю, что это значит )... подскажите плиз upset.gif

Блин 19000000.gif догнал
СтрокаНаименования.ПолучитьОбъект().Удалить();


Всем спасибо.
Ardi
А что мы будем делать если в одном документе Штраф было 2 человека, а килляем мы только одного? crazy.gif
Vofka
Цитата(Ardi @ 25.10.13, 13:55) необходимо зарегистрироваться для просмотра ссылки
А что мы будем делать если в одном документе Штраф было 2 человека, а килляем мы только одного?

Такого не может быть., т.к. человек находится в шапке документа.
Ardi
Точно, померещилось.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.