Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 сен 2021, 18:57

Помогите дописать запрос Удаление строки из ТЧ.

Автор Pavel779, 28 июн 2012, 15:28

0 Пользователей и 1 гость просматривают эту тему.

Pavel779

Написал запрос. Он выбирает строку где цена не заполнена. Потом Создал команду на форме она должна удалять строки ТЧ где цена не заполнена. Он он почему то удаляет саму номенклатуру где цена не заполнена, причем удаляет с концами из "Базы". Скажите что не так.

&НаСервере
Процедура ПроверкаСтроки(Ссылка)

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПоступлениеТоваровТовары.Цена,
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.НомерСтроки
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
| И ПоступлениеТоваровТовары.Цена = 0";

Запрос.УстановитьПараметр("Ссылка", Ссылка);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ВыборкаДетальныеЗаписи.Номенклатура.ПолучитьОбъект().Удалить();

КонецЦикла; ;




КонецПроцедуры

LexaK

попробуйте это

//Сначала запросом получаем номера строк где цена = 0. подумайте почему я сделал сортировку по убыванию?
запрос = новый запрос;
Запрос.Текст = "
|Выбрать
|док.НомерСтроки
|из
|Документ.ПоступлениеТоваров.Товары КАК док
|ГДЕ
|док.Ссылка = &Ссылка и док.цена = 0
|упорядочить по 1 убыв
|";
Запрос.УстановитьПараметр("Ссылка",Ссылка);

выборка = запрос.выполнить().выбрать();

//подумайте зачем здесь эта проверка
Если выборка.Количество()=0 Тогда
//нет строчек с пустой ценой, удалять нечего, выходим
возврат;
КонецЕсли;

Документ = Ссылка.ПолучитьОбъект();
Пока выборка.Следующий() Цикл
   Документ.товары.удалить(Выборка.НомерСтроки-1);
КонецЦикла;
Документ.Записать();

ответ Понравился? (в смысле пригодился?)

Pavel779


Dethmontt

1. Я не понимаю зачем проверка Выборка.Количество() (Выборка.Следующий() вернет ложь если там нет записей)
2. Зачем получать объект и записывать его? "Документ = Ссылка.ПолучитьОбъект();Документ.Записать();" ? А если пользователь ошибся при нажатии на кнопку и хочет отменить?
3. В такой ситуации запрос не оправдан!!! Ссылки может и не быть (если документ не записан)!!!  Достаточна простого обхода циклом Табличной Части

З.Ы.
(Учитесь писать правильно...)
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Pavel779

Dethmontt можете доделать мой запрос, меня интересует как это сделать с помощью запроса.

Dethmontt

Ты на форме документа сделал кнопку?
&НаКлиенте
Процедура КомандаНажатие(Команда)
    Для Каждого Строка Из Объект.Товары Цикл
        Если Строка.Цена = 0 Тогда
            Объект.Товары.Удалить(Строка);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Dethmontt

блиииннн форум не жрет символы ТАБУЛЯЦИИ

Не нужен тут ЗАПРОС!

(Мысли в слух....
Вот когда действительно нужно пользоваться запросами, ВАС не заставишь!!!, когда они не нужны - НАЧИНАЮТ просить "Мне нужно через запрос")
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Pavel779

Кнопку на форме сделал.

Встроенным языком эту задачу я решил, и хочется решить запросом. Если не сложно то помогите решить!!!!

Pavel779

Данную задачу оптимально решать вот так.

В модуле объекта пишем:


Процедура ОчиститьСтрокиСПустойЦеной() Экспорт

    Отбор = Новый Структура("Цена",0 );

МассивСтрок = Товары.НайтиСтроки(Отбор);

  Для каждого Строка Из МассивСтрок Цикл
 
  Товары.Удалить(Строка);
 
  КонецЦикла;

КонецПроцедуры


Потом описываем действие команды
&НаКлиенте
Процедура ОчиститьСтрокиСПустойЦеной(Команда)
ОчиститьСтрокиСПустойЦенойНаСервере();
КонецПроцедуры



&НаСервере
Процедура ОчиститьСтрокиСПустойЦенойНаСервере()

ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ОчиститьСтрокиСПустойЦеной();
ЗначениеВРеквизитФормы(ДокОбъект,"Объект");


КонецПроцедуры

LexaK

Dethmontt, как постановку озвучил Павел так я ему пример кода и написал.
то что вы не понимаете элементарных вещей, ваши проблемы.
попытаюсь конечно вам разъяснить.
во первых такую обработку неоптимально писать под один документ, однако по условию Павла у него есть Ссылка на документ, который надо обработать. Возможен такой вариант, в форме обработки, в поле, пользователь выбирает документ и нажимает кнопку выполнить. И в выбранном документе происходит удаление строк где цена = 0.
теперь по вашим пунктам
1.Выборка.Количество() нужна для того что бы не полнять дальше кусок программы. По вашему если все равно Выборка.Следующий() вернет ложь и мы не попадем в цикл, то до цикла и после цикла будут выполнены две комманды
Документ = Ссылка.ПолучитьОбъект();
...
Документ.Записать();
которые совсем не нужны в данном случае, и которые сами по себе очень медленные. представтье себе что эту обработку вы модернизируете для обработки 1000 документов и половина из них не содержит строк с ценой=0?
(вот такие как вы и пишут тормознутые конфигурации, когда все в 1С висит)
2.3. уже обсудили выше, считалось что это отдельная обработка, в этом случае запрос один из методов получения данных документа.

если же вопрос стоит из формы документа удалять строчки где цена = 0
то действительно запрос не нужен, достаточно обхода по циклу
...
Для каждого Строка Из Товары Цикл
   Если Строка.Цена = 0 Тогда   
   ... // :-) Сюда надо вставить нужный код
   КонецЕсли
КонецЦикла;

если же там кто-то упорствует что необходим именно запрос, да если учесть еще, что документ может быть незаписан, то можно из через запрос выполнить. Табличную часть Товары выгрузить в ТаблицуЗначений и ее ввиде параметра передать в запрос.
ответ Понравился? (в смысле пригодился?)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск