Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=15084)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.1 (8.0) _ Удаление документов

Автор: SanSay 25.10.13, 8:20

1С:Предприятие 8.1 (8.1.15.14)
Конфигурация - самописная с нуля

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

Код:

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

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

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

Помогите разобраться, чтобы работало по человечески без заплаток.
Если надо могу и всю конфигурацию скинуть.

Автор: Vofka 25.10.13, 8:23

Ваш код очень трудно понять. Опишите задачу словами.

Автор: SanSay 25.10.13, 8:30

Есть форма
в верхнем окне выбираем фамилию внизу отображаются документы относящиеся к этой фамилии, при нажатии кнопки "Удалить сотрудника" документы по этому сотруднику должны удалиться.
Код кнопки "Удалить сотрудника" приведен в первом посте.

Автор: Vofka 25.10.13, 8:37

Как-то так, наверное:

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

Автор: SanSay 25.10.13, 8:42

При попытке удалить сотрудника:
{ОбщаяФорма.Сотрудники(4)}: Ошибка при вызове метода контекста (Выбрать): Недопустимое значение параметра (параметр номер '3')
Выборка = Документы.НовыйШтраф.Выбрать(,, ОтборПоСотруднику);
по причине:
Недопустимое значение параметра (параметр номер '3')

Автор: Vofka 25.10.13, 8:45

Сфотографируйте структуру документа НовыйШтраф.

Автор: SanSay 25.10.13, 8:50

не знаю, то это или нет:

Автор: Vofka 25.10.13, 8:55

Можно ещё так попробовать:

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

Автор: SanSay 25.10.13, 9:03

Цитата(Vofka @ 25.10.13, 10:55) *
Можно ещё так попробовать:

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

может проще всю конфу скинуть?
а то Вы наверно стандартные методы предлагаете... а я же самоучка... небось по кривому все пишу )

Автор: Vofka 25.10.13, 9:09

Цитата(SanSay @ 25.10.13, 10:03) *
может проще всю конфу скинуть?

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

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

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

Автор: SanSay 25.10.13, 9:18

Цитата(Vofka @ 25.10.13, 11:09) *
Нет, спасибо.

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

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


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

П.С. хотелось конечно узнать что в моем овнокоде криво срабатывает, но ладно... Ваш корректнее.

Автор: Vofka 25.10.13, 9:48

SanSay, близко к сердцу не принимайте, но то, что вы в первом посте показали - это один большой кусок овнокода, который вообще непонятно как работает и который логическому осмыслению не поддается. Разбираться в нем, соответственно, не представляется никакого интереса (для меня лично) bk.gif . А вообще кто не был молод - тот не был глуп. Запишите где-то себе этот код и посмотрите на него пару лет спустя...

Автор: Ardi 25.10.13, 9:56

Глобальный контекст.НайтиПоСсылкам (Global context.FindByRef)
Глобальный контекст (Global context)
НайтиПоСсылкам (FindByRef)
Синтаксис:

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

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

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

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

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

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

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

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

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


Автор: Vofka 25.10.13, 10:02

Ardi, а это что? Рамдомно скопированный метод из СП? Или ваш уровень телепатии подсказывает, что задача у ТС-а удалить помеченные на удаление документы? smile.gif

Автор: SanSay 25.10.13, 10:07

удалять самого нарушителя так пойдет?

    СтрокаНаименования = ЭлементыФормы.Нарушители.ТекущаяСтрока;
    ФИО = Справочники.ФИО;
    НайденнаяСсылка = ФИО.НайтиПоНаименованию(СтрокаНаименования);
    Если НайденнаяСсылка = СтрокаНаименования Тогда
        Объект = НайденнаяСсылка.ПолучитьОбъект();
        Объект.Удалить();
    КонецЕсли;

или тоже сверх криво?
П.С. код работает

Автор: Ardi 25.10.13, 10:10

Этот метод возвращает список всех объектов которые ссылаются на указанный объект.
А в 0-ом посте идёт перебор абсолютно всех документов.

Автор: Vofka 25.10.13, 10:17

Цитата(Ardi @ 25.10.13, 11:10) *
Этот метод возвращает список всех объектов которые ссылаются на указанный объект.

По хорошему да, такая проверка будет не лишней smile.gif

Автор: Zaval 25.10.13, 10:18

Цитата(SanSay @ 25.10.13, 11:07) *
удалять самого нарушителя так пойдет?


Сделайте список из Ссылок на справочник ФИО(тип значения в списке - СправочникСсылка.ФИО).
Тогда не нужно ничего искать и проверять нечего )

Автор: SanSay 25.10.13, 11:21

сделал так:

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

Добавил проверку на нужного мне сотрудника, т.к. малоли кто поотмечал всякие документы, номенклатуры и т.п. "на удаление".
Код работает.
Непосредственное удаление самого сотрудника пока по старому варианту... т.к.
Цитата(Zaval @ 25.10.13, 12:18) http://pro1c.org.ua/index.php?act=findpost&pid=76856

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

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


Всем спасибо.

Автор: Ardi 25.10.13, 12:55

А что мы будем делать если в одном документе Штраф было 2 человека, а килляем мы только одного? crazy.gif

Автор: Vofka 25.10.13, 12:59

Цитата(Ardi @ 25.10.13, 13:55) *
А что мы будем делать если в одном документе Штраф было 2 человека, а килляем мы только одного?

Такого не может быть., т.к. человек находится в шапке документа.

Автор: Ardi 25.10.13, 13:05

Точно, померещилось.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua