1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

Очистка строк в табличном документе

15.04.2013, 16:53. Показов 29983. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Событие Команды
1C
1
2
3
4
5
6
7
8
9
10
&НаКлиенте
Процедура Команда1(Команда)
   НаСервере();    
КонецПроцедуры
 
&НаСервере
Процедура НаСервере()
    Реквизит=РеквизитФормыВЗначение("Объект");
    Реквизит.МояПроцедура();
КонецПроцедуры
Метод МояПроцедура (расположен в модуле объекта ПоступлениеТоваров)
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Процедура МояПроцедура() Экспорт
    
   ОбъектДок=Ссылка.ПолучитьОбъект();
   ТЧ=ОбъектДок.Товары;
   
   
   Для Каждого Элемент из ТЧ Цикл
       Если Элемент.Цена=0 Тогда
           ТЧ.Удалить(Элемент);
       КонецЕсли;
   КонецЦикла;       
   
   ОбъектДок.Записать();
    
КонецПроцедуры
Моя задача очистки строк из табличной части документа, но
1) Если я открываю форму документа, жму на команду и жму провести, то вылазит ошибка "Данные были изменены или удалены другим пользователем"
2) Меня интересует как создать эффект удаления строк на лету (как при использовании фильтров). А в моем случае форму надо сначала закрыть, потом открыть и смотреть результат. Это неудобно
Миниатюры
Очистка строк в табличном документе  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2013, 16:53
Ответы с готовыми решениями:

Проблемы с кодировкой в табличном документе 1С
Здравствуйте Уважаемые формучане На основании макета формируется табличный документ,куда выводятся...

В табличном документе таблица не умещается по ширине
Добрый день, делаю внешнюю печатную форму, как мне сделать, если таблица не помещается в ширину,...

1с 8.3 Программное определение координат области в табличном документе
Всем привет! Возможно ли программно определить координаты левого верхнего угла области,...

Как сделать чтобы в табличном документе список разбивался при выводе на Подразделения?
Здравствуйте форумчане! У меня есть справочники: Должности, Подразделения и Сотрудники; без...

24
148 / 148 / 3
Регистрация: 05.05.2010
Сообщений: 569
15.04.2013, 18:52 2
Просто Объект.ТЧ.Очистить();
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
15.04.2013, 19:05  [ТС] 3
Похоже Это не то.
За небольшим листингом должно быть читаемо, что строка удаляется если в колонке цена стоит значение 0. Мне не нужно убирать все строки.

И проблема не в том, что строки не удаляются, а в пунктах 1 и 2
0
2954 / 1766 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
15.04.2013, 19:11 4
Диагноз: при удалении сбивается индех и итератор лепит мимо.
Лекарство: (два варианта)
1. Идти с конца
2. выгрузить в массив ссылки на строки (напр., НайтиСтроки()) и по нему цикл
2
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
15.04.2013, 19:28  [ТС] 5
Цитата Сообщение от duk337 Посмотреть сообщение
2. выгрузить в массив ссылки на строки (напр., НайтиСтроки()) и по нему цикл
если это выглядит как
1C
1
2
3
4
5
6
7
8
9
10
11
 ОбъектДок=Ссылка.ПолучитьОбъект();
   ТЧ=ОбъектДок.Товары;       
   
      СтруктураПоиска=Новый Структура("Цена",0);
      МассивСтрок=ТЧ.НайтиСтроки(СтруктураПоиска);
      
      Для каждого Элемент из МассивСтрок Цикл
          ТЧ.Удалить(Элемент);
      КонецЦикла;
         
   ОбъектДок.Записать();
то это ничего не меняет.

Добавлено через 9 минут
Написал так
1C
1
2
3
4
5
6
7
8
9
Процедура МояПроцедура() Экспорт
    
   ОбъектДок=Ссылка.ПолучитьОбъект();
   ТЧ=ОбъектДок.Товары;       
   
     Предупреждение(ТЧ.Количество());   
   
   ОбъектДок.Записать();
КонецПроцедуры
Жму на команду, потом на команду провести и вылазит ошибка (о том, что данные изменены другим пользователем, та что в начале теме описана). Так что здесь имеет место быть что-то другое
0
148 / 148 / 3
Регистрация: 05.05.2010
Сообщений: 569
15.04.2013, 19:44 6
В модуле формы всё нормально работает...
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
15.04.2013, 19:47  [ТС] 7
может dt скинуть?

harmless, я верю, что у вас работает и вижу, что так как делаю я делать ошибочно, потому что как делаю я работает на соплях.
0
148 / 148 / 3
Регистрация: 05.05.2010
Сообщений: 569
15.04.2013, 19:48 8
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
&НаКлиенте
Процедура Команда1(Команда)
    ВыполнитьНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ВыполнитьНаСервере()
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Реквизит2", 0);
    Мас = Объект.ТабличнаяЧасть1.НайтиСтроки(ПараметрыОтбора);
    Для Каждого Эл Из Мас Цикл
        Объект.ТабличнаяЧасть1.Удалить(Эл);
    КонецЦикла;
КонецПроцедуры
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
15.04.2013, 21:41  [ТС] 9
harmless, у меня из команды идет обращение к модулю объекта. Это по заданию так надо. Оттуда вызывается экспортная процедура, которая должна очистить ненужные строки, заданные заданием.

Добавлено через 14 минут
Если я пытаюсь использовать вышеприведенный листинг, то это выглядит как
1C
1
2
3
4
5
6
7
8
9
10
11
12
Процедура МояПроцедура() Экспорт
    
   ОбъектДок=Ссылка.ПолучитьОбъект();
   ТабличнаяЧасть1=ОбъектДок.Товары;
   
   ПараметрОтбора=Новый Структура("Цена",0);
   Мас=ОбъектДок.Товары.НайтиСтроки(ПараметрОтбора);
    Для Каждого Эл Из Мас Цикл
        ОбъектДок.ТабличнаяЧасть1.Удалить(Эл);
    КонецЦикла;
    
КонецПроцедуры
и во время выполнения мне сообщается Поле объекта не обнаружено (ТабличнаяЧасть1)

Добавлено через 4 минуты
Моя первая проблема в
ОбъектДок.Записать()

Я выше писал. Из-за этого метода случается что-то, что вызывает ошибку во время выполнения и выводится сообщение о том, что Данные были изменены или удалены другим пользователем

Добавлено через 1 час 30 минут
С проходом к началу тоже ничего не выходит у меня
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Процедура МояПроцедура() Экспорт
    МойОбъект=Ссылка.ПолучитьОбъект();
    ТЗ=МойОбъект.Товары;
    
    Счетчик=ТЗ.Количество()-1;
    Пока Счетчик>=0 Цикл         
        ТекСтрока=ТЗ.Получить(Счетчик);
           Если ТекСтрока.Цена=0 Тогда
               ТЗ.Удалить(ТекСтрока);
           КонецЕсли;
        Счетчик=Счетчик-1;
    КонецЦикла;
    
//  МойОбъект.Записать(); //ни так
//  ЗначениеВДанныеФормы(ТЗ,МойОбъект.Товары); //ни так
    
КонецПроцедуры
0
Модератор
Эксперт 1С
3721 / 2916 / 574
Регистрация: 10.03.2011
Сообщений: 11,486
Записей в блоге: 1
15.04.2013, 23:13 10
У каждого экземпляра объекта в 1С есть версия! Эта версия считывается при открытии формы, когда ты вызываешь программный метод с сервера Объект.Записать() то запускаешь в БД транзакцию записи объекта что приводит к смене его версии! Форма при записи пытается получить открытую ей версию и не находит ее, тем самым сообщает вам что запись была кем то изменена! То ВАМ в серверном вызове.
Что бы этого избежать, вы из формы должны перечитать объект, или не записывать его и обновлять данные формы...

Как то так.

Добавлено через 54 секунды
Давай dt, посмотрю что не так.

Добавлено через 5 минут
Цитата Сообщение от Dethmontt Посмотреть сообщение
То ВАМ в серверном вызове.
То есть ВАМИ в серверном вызове.


Добавлено через 2 минуты
На самом деле ваша реализация в корне не верна!
Получение объекта из ссылки для вызова метода сильно нагружает систему, инициализирует модуль объекта и полностью погружает объект в оперативную память!
Лучше для таких ситуаций использовать модуль менеджера

Добавлено через 10 минут
Блин...
1C
1
2
3
4
5
6
7
8
9
10
11
12
Процедура МояПроцедура() Экспорт
    
   //ОбъектДок=Ссылка.ПолучитьОбъект(); //Тут объект получать не нужно ТЫ И ТАК В КОНТЕКСТЕ ОБЪЕКТА
   //ТабличнаяЧасть1=ОбъектДок.Товары; //Это тоже не нужно, зачем лишняя переменная
   
   ПараметрОтбора=Новый Структура("Цена",0);
   Мас=Товары.НайтиСтроки(ПараметрОтбора); //Просто товары! подразумевается (ЭтотОбъект.Товары - так тоже будет работать)
    Для Каждого Эл Из Мас Цикл
        Товары.Удалить(Эл);
    КонецЦикла;
    //Т.е. ни чтения ни записи БД в этом методе мы не производим - работаем только в оперативной памяти
КонецПроцедуры
Как то так должна выглядеть твоя процедура...
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
15.04.2013, 23:17  [ТС] 11
Цитата Сообщение от Dethmontt Посмотреть сообщение
На самом деле ваша реализация в корне не верна!
Я обычно не пишу самих заданий, но это напишу

В модуле объекта "ПоступленияТоваров" создайте экспортный метод "очистить строки с незаполненной ценой". Данный метод должен из табличной части документа удалять строки с реквизитом "Цена", равным нулю

и картинка аналогичная моей к заданию прилагается.

На самом деле ваша реализация в корне не верна!
Есть другие предложения?

Вот dt http://fc04.userfiles.me/f/085... aces.ru.dt
0
2954 / 1766 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
15.04.2013, 23:27 12
Цитата Сообщение от daslex Посмотреть сообщение
Есть другие предложения?
строки оставлять! Удалять только по действию юзера, в качестве сервисной кнопки! В проводках не учитывать. По-моему, это общепринято

Добавлено через 1 минуту
процедура экспортная и нет не отличаются. Отличаются принциально на сервере или на клиенте. Вызывайте хоть десяток процедур одну из другой.
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
15.04.2013, 23:28  [ТС] 13
duk337, Спасибо, но я вас не понял.
0
2954 / 1766 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
15.04.2013, 23:29 14
скорее всего, экспортная - подразумевается универсальная, из любого дока, в котором стартует "насервере". передаётся ТЧ
1
Модератор
Эксперт 1С
3721 / 2916 / 574
Регистрация: 10.03.2011
Сообщений: 11,486
Записей в блоге: 1
15.04.2013, 23:32 15
Я бы это сделал через специально отведенный для этого объект "ОБЩИЙ МОДУЛЬ"

1C
1
2
3
4
5
6
7
//Текст модуля формы документа (неважно какого) команда ОчиститьСтрокиСНулевойЦеной
&НаКлиенте
Процедура ОчиститьСтрокиСНулевойЦеной(Команда)
    
    ОбработкаТабличныхЧастейКлиент.УдалитьСтрокиПоУсловию(Объект.Товары,Новый Структура("Цена",0));
    
КонецПроцедуры
И соответственно текст общего модуля
Общий модуль называется - ОбработкаТабличныхЧастейКлиент
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//удаляет строки из табличной части по передаваемым параметрам отбора
Функция УдалитьСтрокиПоУсловию(ТабличнаяЧасть,СтруктураПараметровОтбора) Экспорт 
 
    Перем РезультатРаботыФункции;
    РезультатРаботыФункции = Ложь;
    
    МассивНайденыхСтрок = ТабличнаяЧасть.НайтиСтроки(СтруктураПараметровОтбора);
    Если МассивНайденыхСтрок.Количество() > 0 Тогда 
        Для Каждого СтрокаМас Из МассивНайденыхСтрок Цикл 
            ТабличнаяЧасть.Удалить(СтрокаМас);
        КонецЦикла;
        РезультатРаботыФункции = Истина;
    КонецЕсли;
    
    Возврат РезультатРаботыФункции;
 
КонецФункции
Добавлено через 40 секунд
Галочки модуля - Только клиент Управляемое приложение

Добавлено через 53 секунды
Работа чисто на клиенте, без вызова сервера
1
2954 / 1766 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
15.04.2013, 23:35 16
Цитата Сообщение от daslex Посмотреть сообщение
duk337, Спасибо, но я вас не понял.
в доке На сервере - ОМ.ОчисткаСтрок(Товраы)
1C
1
2
3
4
5
//ОМ
&НаСервере
Процедура ОчисткаСтрок(ТЧ) Экспорт
уды=ТЧ.НайтиСт..()
Для Каждого Уд Из Уды Снестинах Конец
Добавлено через 2 минуты
Цитата Сообщение от Dethmontt Посмотреть сообщение
Добавлено через 53 секунды
Работа чисто на клиенте, без вызова сервера
верно
1
Модератор
Эксперт 1С
3721 / 2916 / 574
Регистрация: 10.03.2011
Сообщений: 11,486
Записей в блоге: 1
15.04.2013, 23:36 17
1C
1
ОбработкаТабличныхЧастейКлиент.УдалитьСтрокиПоУсловию(Объект.ИмяТабличнойЧасти,Новый Структура("КлючПоиска",ЗначениеПоиска));
Т.е. эта строка теперь будет тебе доступна из формы любого "объекта" справочника или документа и т.д.
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
16.04.2013, 00:17  [ТС] 18
Добавлено через 6 минут
Цитата Сообщение от Dethmontt Посмотреть сообщение
Т.е. эта строка теперь будет тебе доступна из формы любого "объекта" справочника или документа и т.д.
Про общий модуль я некоторые представления имею. Спасибо
Цитата Сообщение от duk337 Посмотреть сообщение
в доке На сервере - ОМ.ОчисткаСтрок(Товраы)
Код 1C
//ОМ
&НаСервере
Процедура ОчисткаСтрок(ТЧ) Экспорт
уды=ТЧ.НайтиСт..()
Для Каждого Уд Из Уды Снестинах Конец

Не по теме:

duk - Садист



Все работает.

Добавлено через 27 минут
Dethmontt, Работать-то так работает, но модуль объекта ПоступлениеТоваров теперь вообще не при делах. Там в задании было писано черным по белому, что я должен использовать модуль объекта ПоступлениеТоваров, в котором описывать метод, который.....

Мне почему-то кажется, что ответ, который я получил не тот, который от меня ожидается и еще кажется, что само по себе задание абсурд (это уже вывод по выводу, что у меня в корне неверно)

Хотя я нуб глупый еще и могу заблуждаться
0
Модератор
Эксперт 1С
3721 / 2916 / 574
Регистрация: 10.03.2011
Сообщений: 11,486
Записей в блоге: 1
16.04.2013, 00:25 19
Вот реализация через метод объекта
1C
1
2
3
4
5
6
7
8
9
10
11
12
Процедура МояПроцедура() Экспорт
    
   //ОбъектДок=Ссылка.ПолучитьОбъект(); //Тут объект получать не нужно ТЫ И ТАК В КОНТЕКСТЕ ОБЪЕКТА
   //ТабличнаяЧасть1=ОбъектДок.Товары; //Это тоже не нужно, зачем лишняя переменная
   
   ПараметрОтбора=Новый Структура("Цена",0);
   Мас=Товары.НайтиСтроки(ПараметрОтбора); //Просто товары! подразумевается (ЭтотОбъект.Товары - так тоже будет работать)
    Для Каждого Эл Из Мас Цикл
        Товары.Удалить(Эл);
    КонецЦикла;
    //Т.е. ни чтения ни записи БД в этом методе мы не производим - работаем только в оперативной памяти
КонецПроцедуры
1
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
16.04.2013, 00:29  [ТС] 20

Не по теме:

Ну по-любому тогда задание абсурдное, потому как на картинке, которая к заданию прилагается показано якобы как с Записью. И потому как такая реализация на самом деле неудобная.



Ладно. Спасибо за помощь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2013, 00:29
Помогаю со студенческими работами здесь

Сворачивание записей в табличном документе
Всем доброго времени суток. :) Совсем недавно начала изучать Предприятие 1с 7.7, столкнулась с...

Не печатает нули в табличном документе
В обработке куча строк, но интересующий фрагмент кода ВыводОтчета = Ложь; Если...

Присоединить область в табличном документе
Пытаюсь вывести колонками в ТД через присоединение областей и при выводе выводит после каждой...

Удалить область в табличном документе программно
Ребята, подскажите кто знает, делаю условие на вывод строк только с отрицательным итогом. Вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru