Вход | Регистрация

1С:Предприятие ::

Метки:

Не могу программно изменить реквизит существующего элемента справочника

Я
   Lyolik
 
06.12.04 - 12:53
Не могу понять, можно ли программно изменить реквизит существующего элемента справочника?
 
 
   miki
 
1 - 06.12.04 - 12:54
Да
   povar
 
2 - 06.12.04 - 12:54
можно
   laeg
 
3 - 06.12.04 - 12:55
Пример:
спр.СоздатьОбъект("Справочник.Товары");
спр.НайтиПоНаименованию("Мой товар",0,1);
спр.Наименование = "Твой Товар";
спр.Записать();

Для периодических реквизитов использовать спр.Цена.Установить()
   Lyolik
 
4 - 06.12.04 - 13:18
Конф-я ТиС для Украины.
Процедура Выполнить()
                             
    СпрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");
    СпрЕдиниц = СоздатьОбъект("Справочник.Единицы"); 
    СпрНоменклатура.ВыбратьЭлементы();
    Пока СпрНоменклатура.ПолучитьЭлемент() = 1 Цикл
        Если СпрНоменклатура.ЭтоГруппа() = 1 Тогда
            Продолжить;
        КонецЕсли;
        Если  СпрНоменклатура.ПометкаУдаления() = 1 Тогда
            Продолжить
        КонецЕсли;
       // Код

        Товар = СпрНоменклатура.ТекущийЭлемент();
        Ед = Товар.БазоваяЕдиница;
        СпрЕдиниц.ИспользоватьВладельца(Товар);
        Если СпрЕдиниц.НайтиПоРеквизиту("Единица", Ед, 0) = 0 Тогда
            Сообщить("По товару" + Товар + " ед. - " + Ед + " ненайдена");
        Иначе
            Сообщить("Нашли " + Товар + " - " + СпрЕдиниц.ТекущийЭлемент());
            Товар.ЕдиницаПоУмолчанию = СпрЕдиниц.ТекущийЭлемент();
        КонецЕсли;
        СпрНоменклатура.Записать();
    КонецЦикла;
КонецПроцедуры

Далее заходим в справочник Номенклатура а ЕдиницаПоУмолчанию незаполнена. Что я делаю нетак?
   miki
 
5 - 06.12.04 - 13:20
Одному присваиваешь, а другого записываешь.
   Lyolik
 
6 - 06.12.04 - 13:22
Товар это текущий элемент СпрНоменклатура. А что надо сделать Товар.Записать() ?
   miki
 
7 - 06.12.04 - 13:24
Попробуй:
СпрНоменклатура.ЕдиницаПоУмолчанию = СпрЕдиниц.ТекущийЭлемент();
   laeg
 
8 - 06.12.04 - 13:48
(6)
СпрНоменклатура.ЕдиницаПоУмолчанию = СпрЕдиниц.ТекущийЭлемент();

Если не поможет то:
Заведи еще одну переменную типа Справочник.Номенклатура

спрНом = СоздатьОбъект("Справочник.Номенклатура");
...
...
Если СпрЕдиниц.НайтиПоРеквизиту("Единица", Ед, 0) = 0 Тогда
  Сообщить("По товару" + Товар + " ед. - " + Ед + " ненайдена");
Иначе
  Сообщить("Нашли " + Товар + " - " + СпрЕдиниц.ТекущийЭлемент());
  спрНом.НайтиЭлемент(СпрНоменклатура.ТекущийЭлемент());
  спрНом.ЕдиницаПоУмолчанию = СпрЕдиниц.ТекущийЭлемент();
  спрНом.Записать();
КонецЕсли;
   Lyolik
 
9 - 06.12.04 - 13:53
Только что проверил тоже самое с текстовым реквизитом - все работает, значит проблема в ссылке на другой справочник, но где именно...?
   laeg
 
10 - 06.12.04 - 13:56
(9)
ЕдиницаПоУмолчанию - непериодический ли случайно реквизит ?
 
 
   Lyolik
 
11 - 06.12.04 - 14:21
(8) а вот теперь все работает нормально. Но почему так?
   Lyolik
 
12 - 06.12.04 - 14:22
(10) - непериодический.
   laeg
 
13 - 06.12.04 - 14:23
(11)
Как работает нормально ?
Как в (7) или в (8) в начале
или (8) в конце
???
   Lyolik
 
14 - 06.12.04 - 14:27
(8) в конце
   laeg
 
15 - 06.12.04 - 14:30
Нарушается выборка.
   Lyolik
 
16 - 06.12.04 - 14:36
т.е. первый элемент должен записыватся?
   GrayT
 
17 - 06.12.04 - 14:39
Записываться должен каждый измененный.
А чтоб в догадки не играть покажи полный код на текущий момент
   Lyolik
 
18 - 06.12.04 - 15:15
// Товар -ссылка на СпрНоменклатура.ТекущийЭламент()

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

Процедура ЗаполнитьЕдиницы(Товар)    
    Перем ЕдиницыТовара;
        
    спрНом = СоздатьОбъект("Справочник.Номенклатура");
    ЕдиницыТовара = СоздатьОбъект("Справочник.Единицы");
    ЕдиницыТовара.ИспользоватьДату("01.01.1980");
    ЕдиницыТовара.ИспользоватьВладельца(Товар);
    Сообщить("ЕдиницыТовара - "+строка(Товар.БазоваяЕдиница)); 
    Если ЕдиницыТовара.НайтиПоРеквизиту("Единица",Товар.БазоваяЕдиница,0) = 0 Тогда
        Сообщить("ЕдиницыТовара - "+строка(Товар.БазоваяЕдиница.Наименование)+" для "+Товар+" ненайден"); 
        ЕдиницыТовара.Новый();
        ЕдиницыТовара.Наименование = строка(Товар.БазоваяЕдиница.Наименование);
        ЕдиницыТовара.Коэффициент = 1;
        ЕдиницыТовара.Единица = Товар.БазоваяЕдиница;
        ЕдиницыТовара.Записать();
    Иначе
         Сообщить("ЕдиницыТовара - "+строка(Товар.БазоваяЕдиница.Наименование)+" для "+Товар+" нашли"); 
КонецЕсли;
 спрНом.НайтиЭлемент(Товар); 
 спрНом.ЕдиницаПоУмолчанию = ЕдиницыТовара.ТекущийЭлемент(); 
 спрНом.Записать();
    
КонецПроцедуры
   laeg
 
19 - 06.12.04 - 15:34
(18)
Смысл каждый раз записывать ? Не проще ли в условие поставить когда сделали изменения тогда и записали.
   GrayT
 
20 - 06.12.04 - 15:39
Не нравиться мне то что ты в первой процедуре перебераешь элементы справочника, а во второй еще раз что там двигаешь(ищешь) и пишешь. Может и не прав.
Сделал бы так:
ЗаполнитьЕдиницы(СпрНоменклатура); 
*************************************
ЕдиницыТовара.ИспользоватьВладельца(Товар.ТекущийЭлемент);
******** Поиск уже не нужен - работаю со справочником без перепозиционирования
Товар.Записать()


Список тем форума
 
Ошибка? Это не ошибка, это системная функция.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует