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

Заполнение справочника данными из табличной части

Автор Golickoff, 13 мар 2015, 06:29

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

Golickoff

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

Код работает отлично, за исключением одного нюанса: если в исходной таблице Excell встречается номенклатура, которая уже есть в справочнике, то при заполнении справочника создаётся ещё один элемент номенклатуры с таким же названием, но другим количеством. Мне же необходимо, чтобы при заполнении справочника, в случае совпадения имён номенклатуры, новый элемент справочника не создавался, а текущее количество заменялось значением из таблицы.

Пример:
Если в таблице есть номенклатура "Шланг" с количеством "10", то при добавлении в справочнике появится 10 шлангов. Если после этого в таблице появится номенклатура "Шланг" с количеством "5", то в номенклатуре будет запись о 10 шлангах и о 5 шлангах. Мне же необходимо, чтобы после второго заполнения номенклатуры в ней оставался 1 элемент с именем "Шланг", но его количество изменялось с 10 на 5.
Каким образом можно реализовать такую проверку и замену?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

Делайте найти по наименованию, если нашли то получайте объект и заполняйте, если нет, то создавайте.

Golickoff

Цитата: has от 13 мар 2015, 07:05
Делайте найти по наименованию, если нашли то получайте объект и заполняйте, если нет, то создавайте.
Пробую так:
Для Каждого СтрокаТЧ ИЗ Объект.ТабДок Цикл
      Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
      Дубликат = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаТЧ.Номенклатура,ИСТИНА);
      Если Дубликат = "" Тогда
      Номенклатура.Товар = СтрокаТЧ.Товар;
  Номенклатура.Количество = Число(СтрокаТЧ.Количество);
      Иначе
  Дубликат = Дубликат.ПолучитьОбъект();
  Дубликат["Количество"] = Число(СтрокаТЧ.Количество);
      КонецЕсли;
      Номенклатура.Записать();
КонецЦикла;
   
На строке Дубликат = Дубликат.ПолучитьОбъект(); ругается со словами "Элемент не выбран!"
В чём, собственно, проблема?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

Slin

Проблема в том, что Дубликат это пустая ссылка
ваш отрывок лучше переписать такДля Каждого СтрокаТЧ ИЗ Объект.ТабДок Цикл
      Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаТЧ.Номенклатура,ИСТИНА);
      Если Не Номенклатура.Пустая() Тогда
          Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
          Номенклатура.Товар = СтрокаТЧ.Товар;
          Номенклатура.Количество = Число(СтрокаТЧ.Количество);
      Иначе
          Номенклатура = Номенклатура.ПолучитьОбъект();
          Номенклатура["Количество"] = Число(СтрокаТЧ.Количество);
      КонецЕсли;
      Номенклатура.Записать();
КонецЦикла;
skype: slin-dev

Golickoff

Цитата: Slin от 13 мар 2015, 08:00
Проблема в том, что Дубликат это пустая ссылка
ваш отрывок лучше переписать так1 Для Каждого СтрокаТЧ ИЗ Объект.ТабДок Цикл
      2 Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаТЧ.Номенклатура,ИСТИНА);
      3 Если Не Номенклатура.Пустая() Тогда
          4 Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
          5 Номенклатура.Товар = СтрокаТЧ.Товар;
          6 Номенклатура.Количество = Число(СтрокаТЧ.Количество);
     7  Иначе
          8 Номенклатура = Номенклатура.ПолучитьОбъект();
          9 Номенклатура["Количество"] = Число(СтрокаТЧ.Количество);
      10 КонецЕсли;
      11 Номенклатура.Записать();
12 КонецЦикла;

Если я понял принцип работы этого кода верно, то получится что на 3 строке у нас идёт проверка, есть текущий объект в номенклатуре, или нет. И если он есть (НЕ пустая), то мы добавляем его вновь, от чего я изначально пытался избавиться. А если этого объекта нет, то мы пытаемся его найти из ничего и поменять значение реквизита "количество", которого, фактически, в этом случае существовать не будет. Я всё правильно понял?
В любом случае, на 8ю строку он ругается с тем же текстом.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

has

Цитата: Golickoff от 13 мар 2015, 08:11Я всё правильно понял?
В синтакс-помощнике же описан метод.

Цитировать
СправочникМенеджер.<Имя справочника>.НайтиПоНаименованию (CatalogManager.<Имя справочника>.FindByDescription)
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>)
НайтиПоНаименованию (FindByDescription)
Синтаксис:

НайтиПоНаименованию(<Наименование>, <ТочноеСоответствие>, <Родитель>, <Владелец>)

...........................................

Возвращаемое значение:

Тип: СправочникСсылка.<Имя справочника>; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0), то будет возвращено Неопределено.

Golickoff

Цитата: has от 13 мар 2015, 08:19
В синтакс-помощнике же описан метод.
Да, я читал его описание. Даже успел переделать под образец из СП, но результат остался тем же. Сейчас код выглядит так: Для Каждого СтрокаТЧ ИЗ Объект.ТабДок Цикл
Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
СтрокаПоиска = СтрокаТЧ.Товар;
Товар = Справочники.Номенклатура;
Дубликат = Товар.НайтиПоНаименованию(СтрокаПоиска);     
      Если Дубликат = Товар.ПустаяСсылка() Тогда
          Номенклатура.Товар = СтрокаТЧ.Товар;
          Номенклатура.Количество = Число(СтрокаТЧ.Количество);
      Иначе
          Номенклатура = Номенклатура.ПолучитьОбъект();
          Номенклатура["Количество"] = Число(СтрокаТЧ.Количество);
      КонецЕсли;
      Номенклатура.Записать();
КонецЦикла;

Но, как я написал выше, получить объект не получается.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

cska-fanat-kz

В третьей строке уберите " НЕ " и будет вам счастье.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Golickoff

Цитата: cska-fanat-kz от 13 мар 2015, 08:55
В третьей строке уберите " НЕ " и будет вам счастье.
Я сразу так и сделал -- не полетело.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

Дмитрий@

А если так написать
Если Дубликат = Товар.ПустаяСсылка() ИЛИ Дубликат = Неопределено Тогда

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

Рейтинг@Mail.ru

Поиск