Имя: Пароль:
1C
 
функция выборки значения свойства
🠗 (Волшебник 30.10.2017 14:16)
,
0 gurni
 
30.10.17
12:21
Подскажите, где мой косяк

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

сама функция

Функция ПолучитьЗначениеСвойства(Объект,Свойство)
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |  ЗначенияСвойствОбъектов.Значение как ЗначениеСвойства
                 |ИЗ
                 |  РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                 |ГДЕ
                 |  ЗначенияСвойствОбъектов.Объект = &Объект
                 |  И ЗначенияСвойствОбъектов.Свойство = &Свойство";
    
    Запрос.УстановитьПараметр("Объект", Объект);
    Запрос.УстановитьПараметр("Свойство", Свойство);
    Выборка=Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() тогда
        Возврат Выборка.ЗначениеСвойства;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Но значения не получаю
1 Волшебник
 
модератор
30.10.17
12:22
1) неверно заданы параметры
2) в регистре нет этого свойства
2 VladZ
 
30.10.17
12:23
(0) Какой тип должен быть у "Свойство"?
3 yzimin
 
30.10.17
12:24
(0) неверный тип - "Статус"

ПолучитьЗначениеСвойства(Выборка.Номенклатура,"Статус")

надо не строку передавать, а план видов хар-тик
4 gurni
 
30.10.17
12:32
подскажите как мне передать Статус?
5 gurni
 
30.10.17
12:43
(3) подскажите как плиз
6 rudnitskij
 
30.10.17
13:16
(5) Запрос.УстановитьПараметр("Свойство", Свойство);
Свойство должно иметь тип значения ПланыВидовХарактеристик, а не строка, написали же в (3)
7 yzimin
 
30.10.17
13:17
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Статус");
8 gurni
 
30.10.17
13:23
(7) спасибо
9 gurni
 
30.10.17
13:36
хмм только функция не возвращает значение((
все пусто, хотя прогоняю запрос с параметрами значение есть
10 gurni
 
30.10.17
13:48
(7)     
хмм только функция не возвращает значение((
все пусто, хотя прогоняю запрос с параметрами значение есть
11 Волшебник
 
модератор
30.10.17
13:59
(9) Воспользуйтесь Отладчиком.
12 СамыйУмный
 
30.10.17
14:05
(11) А что, так можно?
13 gurni
 
30.10.17
14:05
(11) я посмотрел
в табло
строка Выборка=Запрос.Выполнить().Выбрать();
выдает Ошибка чтения значения
14 Волшебник
 
модератор
30.10.17
14:08
(13) Продолжайте наблюдения.
15 СамыйУмный
 
30.10.17
14:10
(13) Ты забыл - Выборка.Следующий()
16 gurni
 
30.10.17
14:14
(15)    Если Выборка.Следующий() тогда
переходит сразу на КонецЕсли
17 Волшебник
 
модератор
30.10.17
14:16
(16) Значит выборка пустая, т.е. запрос ничего не выбрал, а значит неверные параметры. И мы возвращаемся к (1).
18 yzimin
 
30.10.17
14:17
(16) значит неправильно задал параметры
19 gurni
 
30.10.17
14:18
(17) но ведь в консоле запросов запрос выдал значение, с пармаметрами которые я передаю
20 Волшебник
 
модератор
30.10.17
14:20
(19) Значит не с теми. Чудес не бывает.
21 gurni
 
30.10.17
14:21
Функция ПолучитьЗначениеСвойства(Объект,Свойство)
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |  ЗначенияСвойствОбъектов.Значение как ЗначениеСвойства
                 |ИЗ
                 |  РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                 |ГДЕ
                 |  ЗначенияСвойствОбъектов.Объект = &Объект
                 |  И ЗначенияСвойствОбъектов.Свойство = &Свойство";
    
    Свойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Статус");
    Запрос.УстановитьПараметр("Объект", Объект);
    Запрос.УстановитьПараметр("Свойство", Свойство);
    Выборка=Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() тогда
        Возврат Выборка.ЗначениеСвойства;
   КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Объект у меня в процедуре определяется
НоваяСтрока.ТекущийСтатус = ПолучитьЗначениеСвойства(Выборка.Номенклатура,Свойство);
22 gurni
 
30.10.17
14:25
отличие в строке
Свойство = ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.НайтиПоНаименованию("Статус");

так предлагали
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Статус");

в УТ ДополнительныеРеквизитыИСведения этого нет в ПланыВидовХарактеристик
23 Волшебник
 
модератор
30.10.17
14:33
(21) пахнет запросом в цикле
24 gurni
 
30.10.17
14:42
(23) куда копать?
25 gurni
 
30.10.17
14:54
(23) в процедуре идет заполнение ТЗ
    Пока Выборка.Следующий() Цикл
        НоваяСтрока=Список.Добавить();
        НоваяСтрока.Артикул = Выборка.Артикул;
        НоваяСтрока.Номенклатура = Выборка.Номенклатура;
        НоваяСтрока.ДатаПоследнегоПрихода = Выборка.ДатаПрих;
        НоваяСтрока.ТекущаяДата = ТекДата;
        НоваяСтрока.КолвоДней = (НачалоДня(ТекДата) - НачалоДня(Выборка.ДатаПрих)) / (60 * 60 * 24);
        НоваяСтрока.Склад = Выборка.Склад;
        НоваяСтрока.ТекущийСтатус = ПолучитьЗначениеСвойства(Выборка.Номенклатура,Свойство);
    КонецЦикла;

и из него идет обращение к функции, чтобы получить статус
26 Saari
 
30.10.17
15:22
Попробуй такой запрос:
    Запрос.Текст = "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Значение
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |        ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
    |        ПО ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Объект = &ВыбОбъект
    |    И СвойстваОбъектов.Ссылка = &ВыбСвойство";
    
    Запрос.УстановитьПараметр("ВыбОбъект", ВыбОбъект);
    Запрос.УстановитьПараметр("ВыбСвойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(ВыбСвойство));
27 Saari
 
30.10.17
15:44
Получилось?
28 gurni
 
30.10.17
15:53
(27) нет(
29 Saari
 
30.10.17
15:57
(28) а поконкретнее? у меня этот запрос успешно работает
30 Saari
 
30.10.17
15:58
ВыбОбъект  - это ссылка на элемент справочника.
ВыбСвойство - это наименование свойства элемента справочника (строка)
31 Saari
 
30.10.17
15:59
далее написать:
Выборка = Запрос.Выполнить().Выбрать();
    
Если Выборка.Следующий() Тогда;
Возврат Выборка.Значение;
КонецЕсли;
32 gurni
 
30.10.17
16:00
(31) в функции все так и написано
Функция ПолучитьЗначениеСвойства(Объект,Свойство)
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |  ЗначенияСвойствОбъектов.Значение как ЗначениеСвойства
                 |ИЗ
                 |  РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                 |ГДЕ
                 |  ЗначенияСвойствОбъектов.Объект = &Объект
                 |  И ЗначенияСвойствОбъектов.Свойство = &Свойство";
    
    Запрос.УстановитьПараметр("Объект", Объект);
    Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Статус"));
    Выборка=Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() тогда
        Возврат Выборка.ЗначениеСвойства;
   КонецЕсли;
    
    Возврат Неопределено;
КонецФункции
33 Saari
 
30.10.17
16:02
(32) нет, не так написано.
обрати внимание на мой запрос. Там идет соединение с планом вида характеристик. У тебя не такой запрос.
34 gurni
 
30.10.17
16:06
(33) пусто
Функция ПолучитьЗначениеСвойства(Объект,Свойство)
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                |    ЗначенияСвойствОбъектов.Значение
                |ИЗ
                |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                   |        ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
                   |        ПО ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка
                |ГДЕ
                |  ЗначенияСвойствОбъектов.Объект = &Объект
                |  И СвойстваОбъектов.Ссылка = &Свойство";
    
    Запрос.УстановитьПараметр("Объект", Объект);
    Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Статус"));
    Выборка=Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() тогда
        Возврат Выборка.ЗначениеСвойства;
   КонецЕсли;
    
    Возврат Неопределено;
КонецФункции
35 Saari
 
30.10.17
16:08
свойство объекта должно иметь наименование "Статус". МОжет там пробел лишний (в наименовании свойства)?
у меня эта функция успешно работает. проверено.
36 Saari
 
30.10.17
16:11
(35) Объект - это ссылка на элемент.
37 gurni
 
30.10.17
16:18
(36) вот как у меня это сейчас
в процедуре
Пока Выборка.Следующий() Цикл
        НоваяСтрока=Список.Добавить();
        НоваяСтрока.Артикул = Выборка.Артикул;
        НоваяСтрока.Номенклатура = Выборка.Номенклатура;
        НоваяСтрока.ДатаПоследнегоПрихода = Выборка.ДатаПрих;
        НоваяСтрока.ТекущаяДата = ТекДата;
        НоваяСтрока.КолвоДней = (НачалоДня(ТекДата) - НачалоДня(Выборка.ДатаПрих)) / (60 * 60 * 24);
        НоваяСтрока.Склад = Выборка.Склад;
        НоваяСтрока.ТекущийСтатус = ПолучитьЗначениеСвойства(Выборка.Номенклатура,Свойство);
    КонецЦикла;
идет обращение к функции
Функция ПолучитьЗначениеСвойства(Объект,Свойство)
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                |    ЗначенияСвойствОбъектов.Значение
                |ИЗ
                |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                   |        ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
                   |        ПО ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка
                |ГДЕ
                |  ЗначенияСвойствОбъектов.Объект = &Объект
                |  И СвойстваОбъектов.Ссылка = &Свойство";
    
    Запрос.УстановитьПараметр("Объект", Объект);
    Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Статус"));
    Выборка=Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() тогда
        Возврат Выборка.ЗначениеСвойства;
   КонецЕсли;
    
    Возврат Неопределено;
КонецФункции
38 gurni
 
30.10.17
16:19
может беда в том, что мой объект имеет конкретное значение а не ссылку
39 gurni
 
30.10.17
16:19
как тогда сделать?
40 Saari
 
30.10.17
16:22
(39) Выборка.Номенклатура - это что? ссылка, объект, наименование (строка)?
Нужен текст запроса, который формирует Выборку, по которой цикл происходит.
41 gurni
 
30.10.17
16:24
в процедуре сделал так
ссылкаНом = Справочники.Номенклатура.НайтиПоНаименованию(Выборка.Номенклатура).Ссылка;
        НоваяСтрока.ТекущийСтатус = ПолучитьЗначениеСвойства(ссылкаНом,Свойство);
и все пошло
42 gurni
 
30.10.17
16:27
(40) А есть функция для записи свойства?
с функцией чтения с Вашей помощью разобрался
43 Saari
 
30.10.17
16:29
(42) готового решения нет.
44 gurni
 
30.10.17
16:33
(43) а по такому принципу получиться?
ВидСвойства = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(ИмяСвойства);
Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
Запись.Прочитать();
Запись.Объект = Номенклатура;
Запись.Свойство = ВидСвойства;
Запись.Значение = ExcelЛист.Cells(Row, сч).Value;
Запись.Записать();
45 Saari
 
30.10.17
16:37
(44) могу только сказать: попробуй.
46 gurni
 
30.10.17
16:48
(45) если будет напряг напишу
спасибо за советы
47 gurni
 
30.10.17
17:36
сделал без функции
Процедура ДействияФормыСменить(Кнопка)
    // Вставить содержимое обработчика.
    Для ТекСтрока = 0 По ЭлементыФормы.Список.Значение.Количество() Цикл
          арт = Список[ТекСтрока].Артикул;
          наим = Список[ТекСтрока].Номенклатура;
          стат = Список[ТекСтрока].ТекущийСтатус;
          дней = Список[ТекСтрока].КолвоДней;
          смен = Список[ТекСтрока].Замена;
            Если
                 стат = "Новинка" и дней > 15 и смен = Истина
            Тогда
                ВидСвойства = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Статус");
                Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
                Запись.Прочитать();
                Запись.Объект = Справочники.Номенклатура.НайтиПоНаименованию(наим).Ссылка;
                Запись.Свойство = ВидСвойства;
                Запись.Значение = "Базовый";
                Запись.Записать();                
            КонецЕсли;
    КонецЦикла;  
КонецПроцедуры
но в конце работы выдает ошибку
{ВнешняяОбработка.АнализСтатусаНоменклатуры.Форма.Форма.Форма(94)}: Индекс находится за границами массива
          арт = Список[ТекСтрока].Артикул;
48 gurni
 
31.10.17
09:44
все сделал
Для ТекСтрока = 0 По ЭлементыФормы.Список.Значение.Количество()-1 Цикл

надо было так
Программист всегда исправляет последнюю ошибку.