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

Программное добавление элемента справочника

Автор Golickoff, 14 окт 2015, 12:58

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

Golickoff

Всем привет.
Есть некий код внешней обработки:
Имущество = Справочники.Имущество.СоздатьЭлемент();
Для ТекущаяЯчейка=0 по МассивСтрок.Количество()-1 Цикл
ДлинаСтроки = СтрДлина(МассивСтрок[ТекущаяЯчейка]);
ТекущееИмущество = СтрЗаменить(Лев(МассивСтрок[ТекущаяЯчейка],ДлинаСтроки-6),Символы.НПП, " ");
Если Справочники.Имущество.НайтиПоНаименованию(ТекущееИмущество) = Справочники.Имущество.ПустаяСсылка() Тогда
Имущество.Наименование = ТекущееИмущество;
Имущество.Вес = Число(Прав(МассивСтрок[ТекущаяЯчейка],5));
Имущество.Записать();
КонецЕсли;
КонецЦикла;

Наверняка, вам покажется смешным то, какую нелепую ошибку я допустил, но я не вижу её в упор. Почему не создаются элементы справочника?
Наименование не ограничено по длине (=0), вес -- число (ЧЦ=10; ЧДЦ=3).
Если остановить цикл в любой момент времени, получаю что-то типа
ТекущееИмущество = Костюм летний полевой расцветки "Цифра", брюки; Текст.
Число(Прав(МассивСтрок[ТекущаяЯчейка],5)) = 0,630; Число.
То есть, типы соответствуют.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

ferrari314

ИМХО Некорректный код.
Элемент создается один раз, Затем что-то происходит в цикле, при определенных условиях объект записывается.
Либо это продиктовано некими внешними условиями которые вы не описали, либо это говнокод.
Если вы редактируете элементы в теле цикла, то и создание должно быть в теле.
Если вы записываете объект только при определенных условиях, то и создание должно быть в них - иначе это бессмыслица.
Вот вы и получаете кашу вида:
Объект создается, но может не записаться. А может вообще должно было записаться несколько объектов? тогда создание должно быть в цикле.
Разбирайте логику.



Golickoff

Цитата: ferrari314 от 14 окт 2015, 13:17
ИМХО Некорректный код.
Элемент создается один раз, Затем что-то происходит в цикле, при определенных условиях объект записывается.
Либо это продиктовано некими внешними условиями которые вы не описали, либо это говнокод.
Если вы редактируете элементы в теле цикла, то и создание должно быть в теле.
Если вы записываете объект только при определенных условиях, то и создание должно быть в них - иначе это бессмыслица.
Вот вы и получаете кашу вида:
Объект создается, но может не записаться. А может вообще должно было записаться несколько объектов? тогда создание должно быть в цикле.
Разбирайте логику.
Вот я индеец...
Переместил строку Имущество = Справочники.Имущество.СоздатьЭлемент(); в тело цикла и всё заработало.
Для ТекущаяЯчейка=0 по МассивСтрок.Количество()-1 Цикл
Имущество = Справочники.Имущество.СоздатьЭлемент();
ДлинаСтроки = СтрДлина(МассивСтрок[ТекущаяЯчейка]);
ТекущееИмущество = СтрЗаменить(Лев(МассивСтрок[ТекущаяЯчейка],ДлинаСтроки-6),Символы.НПП, " ");
Если Справочники.Имущество.НайтиПоНаименованию(ТекущееИмущество) = Справочники.Имущество.ПустаяСсылка() Тогда
Имущество.Наименование = ТекущееИмущество;
Имущество.Вес = Число(Прав(МассивСтрок[ТекущаяЯчейка],5));
Имущество.Записать();
КонецЕсли;
КонецЦикла;

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

ferrari314

Потом вам потребуется доработать модуль, и у вас будет непонятный баг, когда элемент не записывается :) .
Запихайте вы уже его как надо:
Для ТекущаяЯчейка=0 по МассивСтрок.Количество()-1 Цикл
        ДлинаСтроки = СтрДлина(МассивСтрок[ТекущаяЯчейка]);
        ТекущееИмущество = СтрЗаменить(Лев(МассивСтрок[ТекущаяЯчейка],ДлинаСтроки-6),Символы.НПП, " ");
        Если Справочники.Имущество.НайтиПоНаименованию(ТекущееИмущество) = Справочники.Имущество.ПустаяСсылка() Тогда
            Имущество = Справочники.Имущество.СоздатьЭлемент();
            Имущество.Наименование = ТекущееИмущество;
            Имущество.Вес = Число(Прав(МассивСтрок[ТекущаяЯчейка],5));
            Имущество.Записать();
        КонецЕсли;
    КонецЦикла;

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

Теги: справочник 

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

Рейтинг@Mail.ru

Поиск