1С:Предприятие 8.1 (8.1.15.14)
Конфигурация - самописная с нуля
Проблема:
написал процедуру для удаления определенных документов, а она то идеально отрабатывает, то не до конца, т.е. удаляет не все нужные документы
Код:
Сообщить("101");
номер = 0; // просто для проверки для подсчета колва проверенных документов
НайденнаяСсылка2 = Документы.НовыйШтраф;
НайденноеНарушение = НайденнаяСсылка2.НайтиПоРеквизиту("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Док = Документы.НовыйШтраф;
Сообщить("102");
Для Каждого Док Из Метаданные.Документы Цикл
Сообщить("103");
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
//заплатка
Если НайденноеНарушение.Нарушитель.Пустая() Тогда
НайденноеНарушение = НайденнаяСсылка2.НайтиПоРеквизиту("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Сообщить("109");
КонецЕсли;
Сообщить("104");
номер = номер + 1;
Сообщить(номер);
Сообщить("1" + Выборка.Нарушитель);
Сообщить("3" + НайденноеНарушение.Нарушитель);
Если Выборка.Нарушитель = НайденноеНарушение.Нарушитель Тогда
Сообщить("Удалена запись" + Выборка.ПолучитьОбъект());
Выборка.ПолучитьОбъект().Удалить();
КонецЕсли;
КонецЦикла;
КонецЦикла;
Сообщить("105");
Ваш код очень трудно понять. Опишите задачу словами.
Есть форма
в верхнем окне выбираем фамилию внизу отображаются документы относящиеся к этой фамилии, при нажатии кнопки "Удалить сотрудника" документы по этому сотруднику должны удалиться.
Код кнопки "Удалить сотрудника" приведен в первом посте.
Как-то так, наверное:
ОтборПоСотруднику = Новый Структура("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Документы.НовыйШтраф.Выбрать(,, ОтборПоСотруднику);
Пока Выборка.Следующий() Цикл
Док = Выборка.Ссылка.ПолучитьОбъект();
Док.Удалить();
КонецЦикла;
При попытке удалить сотрудника:
{ОбщаяФорма.Сотрудники(4)}: Ошибка при вызове метода контекста (Выбрать): Недопустимое значение параметра (параметр номер '3')
Выборка = Документы.НовыйШтраф.Выбрать(,, ОтборПоСотруднику);
по причине:
Недопустимое значение параметра (параметр номер '3')
Сфотографируйте структуру документа НовыйШтраф.
не знаю, то это или нет:
Можно ещё так попробовать:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Док.Ссылка ИЗ Документы.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель";
Запрос.УстановитьПараметр("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Док = Выборка.Ссылка.ПолучитьОбъект();
Док.Удалить();
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Док.Ссылка ИЗ Документ.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель";
Запрос.УстановитьПараметр("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Док = Выборка.Ссылка.ПолучитьОбъект();
Док.Удалить();
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Док.Ссылка ИЗ Документ.НовыйШтраф КАК Док ГДЕ Док.Нарушитель = &Нарушитель";
Запрос.УстановитьПараметр("Нарушитель", Справочники.ФИО.НайтиПоНаименованию(ЭлементыФормы.Нарушители.ТекущаяСтрока));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Док = Выборка.Ссылка.ПолучитьОбъект();
Док.Удалить();
КонецЦикла;
SanSay, близко к сердцу не принимайте, но то, что вы в первом посте показали - это один большой кусок овнокода, который вообще непонятно как работает и который логическому осмыслению не поддается. Разбираться в нем, соответственно, не представляется никакого интереса (для меня лично) . А вообще кто не был молод - тот не был глуп. Запишите где-то себе этот код и посмотрите на него пару лет спустя...
Глобальный контекст.НайтиПоСсылкам (Global context.FindByRef)
Глобальный контекст (Global context)
НайтиПоСсылкам (FindByRef)
Синтаксис:
НайтиПоСсылкам(<СписокСсылок>)
Параметры:
<СписокСсылок> (обязательный)
Тип: Массив.
Массив со списком ссылок на объекты, ссылки на которые нужно найти.
Возвращаемое значение:
Тип: ТаблицаЗначений.
Возвращает ссылки на найденные объекты в виде ТаблицаЗначений.
Первая колонка - исходная ссылка.
Вторая колонка - ссылка на объект, если найденная ссылка соответствует объектной таблице или значение, олицетворяющее запись необъектной таблицы.
Третья колонка - объект метаданных, которому соответствуют данные в которых найдена ссылка.
Описание:
Осуществляет поиск ссылок на объекты, переданные в параметре <СписокСсылок>.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Примечание:
Поиск осуществляется только в тех данных, которые доступны в рамках текущего сеанса с учетом разделения (условное разделение учитывается).
Пример:
Ссылки = НайтиПомеченныеНаУдаление();
ТабСсылок = НайтиПоСсылкам(Ссылки);
Для Каждого Ссылка из ТабСсылок Цикл
Сообщить ("" + СокрЛП(Ссылка[0]) + " " + СокрЛП(Ссылка[1]));
КонецЦикла;
Ardi, а это что? Рамдомно скопированный метод из СП? Или ваш уровень телепатии подсказывает, что задача у ТС-а удалить помеченные на удаление документы?
удалять самого нарушителя так пойдет?
СтрокаНаименования = ЭлементыФормы.Нарушители.ТекущаяСтрока;
ФИО = Справочники.ФИО;
НайденнаяСсылка = ФИО.НайтиПоНаименованию(СтрокаНаименования);
Если НайденнаяСсылка = СтрокаНаименования Тогда
Объект = НайденнаяСсылка.ПолучитьОбъект();
Объект.Удалить();
КонецЕсли;
Этот метод возвращает список всех объектов которые ссылаются на указанный объект.
А в 0-ом посте идёт перебор абсолютно всех документов.
сделал так:
СтрокаНаименования = ЭлементыФормы.Нарушители.ТекущаяСтрока;
СтрокаНаименования.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
Ссылки = НайтиПомеченныеНаУдаление();
ТабСсылок = НайтиПоСсылкам(Ссылки);
Для Каждого Ссылка из ТабСсылок Цикл
Если СтрокаНаименования.Наименование = СокрЛП(Ссылка[0]) Тогда
Сообщить ("Удален документ на сотрудника: " + СокрЛП(Ссылка[0]) + " - " + СокрЛП(Ссылка[1]));
//Ссылка[1].ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
Ссылка[1].ПолучитьОбъект().Удалить();
КонецЕсли;
КонецЦикла;
//удаление сотрудника
ФИО = Справочники.ФИО;
НайденнаяСсылка = ФИО.НайтиПоНаименованию(СтрокаНаименования);
Если НайденнаяСсылка = СтрокаНаименования Тогда
Объект = НайденнаяСсылка.ПолучитьОбъект();
Сообщить ("Удален сотрудник: " + НайденнаяСсылка);
Объект.Удалить();
КонецЕсли;
СтрокаНаименования.ПолучитьОбъект().Удалить();
А что мы будем делать если в одном документе Штраф было 2 человека, а килляем мы только одного?
Точно, померещилось.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua