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

Удаление текущей строки после ЗаполнитьЗначениеСвойств

Автор Mro, 26 окт 2016, 18:29

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

ilyay

вот так, у вас же все уже есть:

ТекСтрока = Элементы.ТЧ.ТекущиеДанные;
УдаляемаяСтрока=Объект.ТЧ.НайтиПоИдентификатору(Элементы.ТЧ.ТекущаяСтрока);
   
    СтрокаНовая=Объект.ТЧ.Добавить();
   
    ЗаполнитьЗначенияСвойств(СтрокаНовая,ТекСтрока);
   
    СтрокаНовая.Количество=1;
   
    СтрокаНовая.Номер = Параметр.Номер;
Объект.ТЧ.Удалить(УдаляемаяСтрока);

Добавлено: 28 окт 2016, 10:37


А если надо несколько строк добавлять, то через параметр сразу несколько и передавайте.

Mro

Цитата: ilyay от 28 окт 2016, 10:37
вот так, у вас же все уже есть:

ТекСтрока = Элементы.ТЧ.ТекущиеДанные;
УдаляемаяСтрока=Объект.ТЧ.НайтиПоИдентификатору(Элементы.ТЧ.ТекущаяСтрока);
   
    СтрокаНовая=Объект.ТЧ.Добавить();
   
    ЗаполнитьЗначенияСвойств(СтрокаНовая,ТекСтрока);
   
    СтрокаНовая.Количество=1;
   
    СтрокаНовая.Номер = Параметр.Номер;
Объект.ТЧ.Удалить(УдаляемаяСтрока);

Добавлено: 28 окт 2016, 10:37


А если надо несколько строк добавлять, то через параметр сразу несколько и передавайте.

так я пробовал,

в итоге выходит ошибка:

{Документ.Тест.Форма.ФормаДокумента.Форма(17)}: Ошибка при вызове метода контекста (НайтиПоИдентификатору)
   УдаляемаяСтрока=Объект.ТЧ.НайтиПоИдентификатору(Элементы.ТЧ.ТекущаяСтрока);
по причине:
Несоответствие типов (параметр номер '1')

ilyay

Если Элементы.ТЧ.ТекущаяСтрока - это число, тогда код верный, а если ссылка на строку, тогда не надо от нее получать уникальный идентификатор.

Mro

Цитата: ilyay от 28 окт 2016, 11:48
Если Элементы.ТЧ.ТекущаяСтрока - это число, тогда код верный, а если ссылка на строку, тогда не надо от нее получать уникальный идентификатор.

Кстати, вот какой прикол обнаружил в отладке, код в обработке:

&НаКлиенте
Процедура Перенос(Команда)

    Для каждого     Стр из Объект.ЧТО Цикл
       
        СтруктураОповещения = Новый Структура;
        СтруктураОповещения.Вставить("Номер",Стр.Номер);
       
        Оповестить("ПередачаНомеров",СтруктураОповещения,"ОбработкаЗаполнения");
       
    КонецЦикла;
   
    Закрыть();

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


передает структуру оповещения ровно столько раз, сколько строк в форме обработки.

К примеру, если у меня две строки, запускаю процедуру "Перенос (Команда)" первый раз цикл отрабатывает нормально, а вот на второй выходит ошибка.

И только на втором витке цикла вываливается ошибка.
Добавлено: 28 окт 2016, 12:02


Цитата: ilyay от 28 окт 2016, 11:48Элементы.ТЧ.ТекущаяСтрока

в отладчике Элементы.ТЧ.ТекущаяСтрока тип Число, значение 0.

Однако уже на втором витке цикла

и Элементы.ТЧ.ТекущиеДанные
и Элементы.ТЧ.ТекущаяСтрока

Тип - Неопределено, значение - пустое.

ilyay

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

Цитировать
Однако уже на втором витке цикла

и Элементы.ТЧ.ТекущиеДанные
и Элементы.ТЧ.ТекущаяСтрока

Тип - Неопределено, значение - пустое.
потому что текущая строка удалена, а никакая другая еще не выбрана.


Добавлено: 28 окт 2016, 12:27


Не знаю, зачем мучаетесь с оповещением. Сделали бы подчиненную форму.

Mro

Цитата: ilyay от 28 окт 2016, 12:24
ЦитироватьИ только на втором витке цикла вываливается ошибка.
Я писал про это, что нужно в параметр загонять все строки, потому что после их обработки текущая строка удалиться.

Цитировать
Однако уже на втором витке цикла

и Элементы.ТЧ.ТекущиеДанные
и Элементы.ТЧ.ТекущаяСтрока

Тип - Неопределено, значение - пустое.
потому что текущая строка удалена, а никакая другая еще не выбрана.


Добавлено: 28 окт 2016, 12:27


Не знаю, зачем мучаетесь с оповещением. Сделали бы подчиненную форму.

чтобы в параметр загнать все строки пробую массив:

&НаКлиенте
Процедура Перенос(Команда)

МассивНомеров=Новый Массив;

Для каждого Стр из Объект.ЧТО Цикл

Номер=Стр.Номер;
МассивНомеров.Добавить(Номер);

СтруктураОповещения = Новый Структура;
СтруктураОповещения.Вставить("Номер",МассивНомеров);
       
Оповестить("ПередачаНомеров",СтруктураОповещения,"ОбработкаЗаполнения");
       
КонецЦикла;
   
Закрыть();

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


в документе:

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если Источник = "ОбработкаЗаполнения" И ИмяСобытия = "ПередачаНомеров" Тогда
Для каждого Стр из Объект.ТЧ Цикл
Стр.Номер = Параметр.Номер;
КонецЦикла;
КонецЕсли;

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


немного изменил логику - теперь изначально в документе не дробим одну строку, а имеем ровно столько-же, сколько будет в обработке.

Но, я опять что-то делаю не так.

В итоге мои строки вместо значений массива через параметр почему-то получают слово "Массив"

прикрепил для наглядности.

Получается, строки через параметр получают значение "Массив" с типом "Массив" вместо значений элементов массива.

ilyay

Оповещение следует вынести вниз за цикл.

В обработчике оповещения в параметре получили массив, значит надо по массиву бежать циклом и создавать строки. А цикла у вас там нет.

Mro

Цитата: ilyay от 28 окт 2016, 15:26Оповещение следует вынести вниз за цикл.

Да, так и есть, скопировал до того, как поставил в нужное место.))

Цитата: ilyay от 28 окт 2016, 15:26
В обработчике оповещения в параметре получили массив, значит надо по массиву бежать циклом и создавать строки. А цикла у вас там нет.

тут начинаю плыть.(

Если я буду создавать новые строки - и получать для них значения из массива, то поле "Номенклатура" будет-же пустым. А мне нужно чтобы оно было заполнено.)

ilyay

Вам необходимо там, где вы в массив данные кладете, класть не только номера, но и наименования, т.е. полный набор данных для создания новой строки. Создавайте структуру, помещайте туда наименование и номер. Структуры складываете в массив. А при получении массива используя эти структуры создаете строки, например так: ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Структура).
Добавлено: 28 окт 2016, 15:58


Либо так: в запомненной строке для удаления у вас есть номенклатура, пока её не удалили.

Mro

Цитата: ilyay от 28 окт 2016, 15:57
Вам необходимо там, где вы в массив данные кладете, класть не только номера, но и наименования, т.е. полный набор данных для создания новой строки. Создавайте структуру, помещайте туда наименование и номер. Структуры складываете в массив. А при получении массива используя эти структуры создаете строки, например так: ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Структура).
Добавлено: 28 окт 2016, 15:58


Либо так: в запомненной строке для удаления у вас есть номенклатура, пока её не удалили.

как я в итоге попробовал и вроде работает:

Документ:

&НаКлиенте
Процедура Обработка(Команда)

ОткрытьФорму("Обработка.ДляПередачи.Форма.Форма",,ЭтаФорма,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если Источник = "ОбработкаЗаполнения" И ИмяСобытия = "ПередачаНомеров" Тогда

Повторения = Параметр.Номер.Количество();
Счетчик = 0;

Для каждого Стр из Объект.ТЧ Цикл

Если Счетчик > Повторения Тогда
Прервать;
КонецЕсли;
Стр.Номер = Параметр.Номер[Счетчик];
Счетчик = Счетчик + 1;
КонецЦикла;
КонецЕсли;
КонецПроцедуры


Обработка:

&НаКлиенте
Процедура Перенос(Команда)

МассивНомеров=Новый Массив;

Для каждого Стр из Объект.ЧТО Цикл

Номер=Стр.Номер;
МассивНомеров.Добавить(Номер);

КонецЦикла;


СтруктураОповещения = Новый Структура;
СтруктураОповещения.Вставить("Номер",МассивНомеров);
       
Оповестить("ПередачаНомеров",СтруктураОповещения,"ОбработкаЗаполнения");
           
КонецПроцедуры


но чет есть ощущение, что что-то не так.)))

Теги:

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

Рейтинг@Mail.ru

Поиск