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