Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Удаление документов , то удаляет, то нет 2 страниц V   1 2 >          
SanSay Подменю пользователя
сообщение 25.10.13, 8:20
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

Спасибо сказали: SanSay,

SanSay Подменю пользователя
сообщение 25.10.13, 8:30
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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

Vofka Подменю пользователя
сообщение 25.10.13, 8:37
Сообщение #4

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

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

SanSay Подменю пользователя
сообщение 25.10.13, 8:42
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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

Vofka Подменю пользователя
сообщение 25.10.13, 8:45
Сообщение #6

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

SanSay Подменю пользователя
сообщение 25.10.13, 8:50
Сообщение #7

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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

Vofka Подменю пользователя
сообщение 25.10.13, 8:55
Сообщение #8

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

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

SanSay Подменю пользователя
сообщение 25.10.13, 9:03
Сообщение #9

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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

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

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

Vofka Подменю пользователя
сообщение 25.10.13, 9:09
Сообщение #10

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

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

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

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

Спасибо сказали: SanSay,

SanSay Подменю пользователя
сообщение 25.10.13, 9:18
Сообщение #11

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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

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

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


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

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

Vofka Подменю пользователя
сообщение 25.10.13, 9:48
Сообщение #12

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

Ardi Подменю пользователя
сообщение 25.10.13, 9:56
Сообщение #13

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

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

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

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

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

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

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

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

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

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

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



Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Спасибо сказали: SanSay,

Vofka Подменю пользователя
сообщение 25.10.13, 10:02
Сообщение #14

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

SanSay Подменю пользователя
сообщение 25.10.13, 10:07
Сообщение #15

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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

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

Ardi Подменю пользователя
сообщение 25.10.13, 10:10
Сообщение #16

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

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


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Vofka Подменю пользователя
сообщение 25.10.13, 10:17
Сообщение #17

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

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

Zaval Подменю пользователя
сообщение 25.10.13, 10:18
Сообщение #18

Крутой
Иконка группы
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0

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


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

Сообщение отредактировал Zaval - 25.10.13, 10:19

SanSay Подменю пользователя
сообщение 25.10.13, 11:21
Сообщение #19

Говорящий
***
Группа: Пользователи
Сообщений: 55
Из: Наб.Челны
Спасибо сказали: 1 раз
Рейтинг: 0

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

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


если я правильно понял, то
Цитата(SanSay @ 25.10.13, 10:30) *

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

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


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

Ardi Подменю пользователя
сообщение 25.10.13, 12:55
Сообщение #20

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

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


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 20:03
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!