Как убрать ненужный ключ из структуры при методе НайтиСтроки()?

1. user1632413 19.09.22 16:06 Сейчас в теме
Как убрать "Количество" из структуры при методе НайтиСтроки?
Приведу пример для чего это нужно:
Например, при загрузке данных код, наименование и количество уже есть, но во второй раз пользователь захотел поменять количество. И чтобы не было дублей, нужно просто заменить значение в ключе "Количество", а не менять всю строку ТЧ.

Первая загрузка:
123 Деталь 3
Вторая загрузка:
123 Деталь 5
В итоге должно остаться:
123 Деталь 5

ТЗ = Объект.СтруктураИзделия.Выгрузить();

Структура = Новый Структура;
Структура.Вставить("КодДетали", "");
Структура.Вставить("НаименованиеДетали", "");
Структура.Вставить("Количество", 0);

Попытка

Если СокрЛП(ОбластьСтруктураИзделия.Область(15,2,15,2).Текст) = "Код детали, сборочного узла*" Тогда
Структура.КодДетали = СокрЛП(ОбластьСтруктураИзделия.Область(15,3,15,3).Текст);
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось загрузить данные, так как неверно указаны данные в колонке ""Общие сведения"" в строке 15";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
Если СокрЛП(ОбластьСтруктураИзделия.Область(16,2,16,2).Текст) = "Наименование детали, сборочного узла*" Тогда
Структура.НаименованиеДетали = СокрЛП(ОбластьСтруктураИзделия.Область(16,3,16,3).Текст);
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось загрузить данные, так как неверно указаны данные в колонке ""Общие сведения"" в строке 16";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
Если СокрЛП(ОбластьСтруктураИзделия.Область(17,2,17,2).Текст) = "Количество в составе изделия*" Тогда
Структура.Количество = Число(ОбластьСтруктураИзделия.Область(17,3,17,3).Текст);
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось загрузить данные, так как неверно указаны данные в колонке ""Общие сведения"" в строке 17";
Сообщение.Сообщить();
Возврат;
КонецЕсли;


МассивСтрок = ТЗ.НайтиСтроки(Структура);

Если МассивСтрок.Количество() = 0 Тогда
СтрокаДанных = ТЗ.Добавить();
Иначе
СтрокаДанных = МассивСтрок[0];
КонецЕсли;

ЗаполнитьЗначенияСвойств(СтрокаДанных, Структура);

Если НЕ ЗначениеЗаполнено(СтрокаДанных.УИДСтроки) Тогда
УИД = Новый УникальныйИдентификатор;
СтрокаДанных.УИДСтроки = УИД;
КонецЕсли;

Объект.СтруктураИзделия.Загрузить(ТЗ);

Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не удалось загрузить данные: " + ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
По теме из базы знаний
Найденные решения
14. user1632413 19.09.22 16:36 Сейчас в теме
(11)Написал так:

СтруктураОтбор = Новый Структура;
СтруктураОтбор.Вставить("КодДетали", Структура.КодДетали);
СтруктураОтбор.Вставить("НаименованиеДетали", Структура.НаименованиеДетали);

МассивСтрок = ТЗ.НайтиСтроки(СтруктураОтбор);
СтруктураБезКоличества.Вставить("Количество", Структура.Количество);
Если МассивСтрок.Количество() = 0 Тогда
СтрокаДанных = ТЗ.Добавить();
Иначе
СтрокаДанных = МассивСтрок[0];
КонецЕсли;

ЗаполнитьЗначенияСвойств(СтрокаДанных, СтруктураОтбор);

Всё равно создаются дубли
15. nomad_irk 81 19.09.22 16:43 Сейчас в теме
(14)что нужно-то в итоге получить для КодДетали1, НаименованиеДетали1?

Вот есть в источнике данные:

КодДетали1, наименованиеДетали1, Количество1
КодДетали1, наименованиеДетали1, Количество2
..............
КодДетали1, наименованиеДетали1, КоличествоN

Судя по описанию, должно остаться КодДетали1, НаименованиеДетали1, КоличествоN.

Отбор = Новый Структура("КодДетали, НаименованиеДетали", СтрокаИсходныхДанных.КодДетали, СтрокаИсходныхДанных.НаименованиеДетали);

МассивСтрок = ТЗ.НайтиСтроки(Отбор);
Если ЗначениеЗаполнено(МассивСтрок) Тогда
     СтрокаТЗ = МассивСтрок[0];
Иначе
     СтрокаТЗ = ТЗ.Добавить();
КонецЕсли;

ЗаполнитьЗначенияСвойств(СтрокаТЗ, СтрокаИсходныхДанных, "Количество");
Показать


Если дубли все равно есть, значит МассивСтрок - пустой, такое может быть в том случае, когда значения КодДетали/НаименованиеДетали обрезаются в колонках ТЗ до какой-то определенной длины, заведомо меньшей, чем длина исходного значения.
16. user1632413 20.09.22 09:54 Сейчас в теме
(14)В итоге просто КодДетали был 12, а в реквизите было максимальное 10, поэтому создавались дубли
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. nomad_irk 81 19.09.22 16:16 Сейчас в теме
(1)В Синтаксис-помощнике все предельно четко написано:

Структура.Удалить("Ключ")


Что мешает сделать отдельную структуру для отбора в ТЗ?
6. user1632413 19.09.22 16:19 Сейчас в теме
(4)Если удалить из структуры ключ "Количество", то как запишется количество второй раз?
10. nomad_irk 81 19.09.22 16:22 Сейчас в теме
(6) внезапно: после поиска в ТЗ добавить ключ заново, либо искать в ТЗ без ключа "Количество" и добавить его для дальнейшей обработки
8. user1632413 19.09.22 16:21 Сейчас в теме
(4) СтруктураБезКоличества = Новый Структура;
СтруктураБезКоличества.Вставить("КодДетали", Структура.КодДетали);
СтруктураБезКоличества.Вставить("НаименованиеДетали", Структура.НаименованиеДетали);

МассивСтрок = ТЗ.НайтиСтроки(СтруктураБезКоличества);
Вы это имеете ввиду?
11. nomad_irk 81 19.09.22 16:23 Сейчас в теме
(8)Да, назвать ее Отбор, чтобы не путаться в "Структура......"
14. user1632413 19.09.22 16:36 Сейчас в теме
(11)Написал так:

СтруктураОтбор = Новый Структура;
СтруктураОтбор.Вставить("КодДетали", Структура.КодДетали);
СтруктураОтбор.Вставить("НаименованиеДетали", Структура.НаименованиеДетали);

МассивСтрок = ТЗ.НайтиСтроки(СтруктураОтбор);
СтруктураБезКоличества.Вставить("Количество", Структура.Количество);
Если МассивСтрок.Количество() = 0 Тогда
СтрокаДанных = ТЗ.Добавить();
Иначе
СтрокаДанных = МассивСтрок[0];
КонецЕсли;

ЗаполнитьЗначенияСвойств(СтрокаДанных, СтруктураОтбор);

Всё равно создаются дубли
15. nomad_irk 81 19.09.22 16:43 Сейчас в теме
(14)что нужно-то в итоге получить для КодДетали1, НаименованиеДетали1?

Вот есть в источнике данные:

КодДетали1, наименованиеДетали1, Количество1
КодДетали1, наименованиеДетали1, Количество2
..............
КодДетали1, наименованиеДетали1, КоличествоN

Судя по описанию, должно остаться КодДетали1, НаименованиеДетали1, КоличествоN.

Отбор = Новый Структура("КодДетали, НаименованиеДетали", СтрокаИсходныхДанных.КодДетали, СтрокаИсходныхДанных.НаименованиеДетали);

МассивСтрок = ТЗ.НайтиСтроки(Отбор);
Если ЗначениеЗаполнено(МассивСтрок) Тогда
     СтрокаТЗ = МассивСтрок[0];
Иначе
     СтрокаТЗ = ТЗ.Добавить();
КонецЕсли;

ЗаполнитьЗначенияСвойств(СтрокаТЗ, СтрокаИсходныхДанных, "Количество");
Показать


Если дубли все равно есть, значит МассивСтрок - пустой, такое может быть в том случае, когда значения КодДетали/НаименованиеДетали обрезаются в колонках ТЗ до какой-то определенной длины, заведомо меньшей, чем длина исходного значения.
16. user1632413 20.09.22 09:54 Сейчас в теме
(14)В итоге просто КодДетали был 12, а в реквизите было максимальное 10, поэтому создавались дубли
2. user1203706 15 19.09.22 16:13 Сейчас в теме
(1)
Структура.Вставить("Количество", НужноеКоличествоВоВторойРаз);
3. user1632413 19.09.22 16:15 Сейчас в теме
(2)В том-то и дело, что нужное количество неизвестно,т.к. данные берутся из загружаемого файла Excel
5. user1203706 15 19.09.22 16:16 Сейчас в теме
(3)
Структура.Вставить("Количество", НужноеКоличествоВоВторойРазИзФайлаExcel);
7. user1203706 15 19.09.22 16:21 Сейчас в теме
(6) у вас и в первый раз, там всегда 0, ибо нет в коде нового присвоения количества, так что, особо ничего не поменяется
9. user1632413 19.09.22 16:22 Сейчас в теме
(7)Ошибаетесь, есть
Структура.Количество = Число(ОбластьСтруктураИзделия.Область(17,3,17,3).Текст);
12. user1203706 15 19.09.22 16:28 Сейчас в теме
(9) ну, ищи тогда просто своё изделие, без количества в ТЗ, потом уже количество устанавливай.

И да, для этой задачи, ТЗ вообще не нужна, всё можно сделать в самой ТЧ. Там есть все те же методы.
13. user1632413 19.09.22 16:29 Сейчас в теме
(12)Думаю, не совсем хорошо сразу в ТЧ всё грузить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот