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



функция выборки значения свойства

↓ [Волшебник, 30.10.17 - 14:16]
функция выборки значения свойства
Я
   gurni
 
30.10.17 - 12:21
Подскажите, где мой косяк

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

сама функция

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

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

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

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

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

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

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

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

    Для ТекСтрока = 0 По ЭлементыФормы.Список.Значение.Количество() Цикл
          арт = Список[ТекСтрока].Артикул;
          наим = Список[ТекСтрока].Номенклатура;
          стат = Список[ТекСтрока].ТекущийСтатус;
          дней = Список[ТекСтрока].КолвоДней;
          смен = Список[ТекСтрока].Замена;
            Если 
                 стат = "Новинка" и дней > 15 и смен = Истина
            Тогда
                ВидСвойства = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Статус"); 
                Запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
                Запись.Прочитать(); 
                Запись.Объект = Справочники.Номенклатура.НайтиПоНаименованию(наим).Ссылка;
                Запись.Свойство = ВидСвойства; 
                Запись.Значение = "Базовый"; 
                Запись.Записать();                
            КонецЕсли;
    КонецЦикла;   
КонецПроцедуры
 но в конце работы выдает ошибку
{ВнешняяОбработка.АнализСтатусаНоменклатуры.Форма.Форма.Форма(94)}: Индекс находится за границами массива
          арт = Список[ТекСтрока].Артикул;
   gurni
 
48 - 31.10.17 - 09:44
все сделал
Для ТекСтрока = 0 По ЭлементыФормы.Список.Значение.Количество()-1 Цикл

надо было так


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