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

Получить значение даты из регистра сведений

Автор Antonio, 06 мар 2023, 11:03

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

Antonio

Пожалуйста подскажите, как в данном случае правильно обратиться к дате документа при поиске цены в регистре по дате. Задача учебная. Код функции написан в общем модуле, код процедуры в модуле формы документа. Регистр подчинен регистратору, периодический. По ссылке - скриншот ошибки. Суть задачи найти цену номенклатуры по дате документа, подставить в поле

http://joxi.ru/8AnL6P0UKGx6Rm

&НаСервере
  Функция ДатаПриИзмененииНаСервере(Номенклатура, ВидЦены, Валюта,Дата) Экспорт     
      Отбор = Новый Структура();
      Отбор.Вставить("Номенклатура",Номенклатура);
      Отбор.Вставить("ВидЦены", ВидЦены);
      Отбор.Вставить("Валюта", Валюта);
      Отбор.Вставить("Период", Дата);
      Цена = РегистрыСведений.ЦеныНоменклатуры.Получить(Документы.УстановкаЦенНоменклатуры.Дата,Отбор).Цена;
      Возврат Цена;
     
   
 
  КонецФункции


&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
Номенклатура = Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура;
ВидЦены = Элементы.СписокНоменклатуры.ТекущиеДанные.ВидЦены;
Валюта = Элементы.СписокНоменклатуры.ТекущиеДанные.Валюта;
Дата = Объект.Дата;
Элементы.СписокНоменклатуры.ТекущиеДанные.Цена = РаботаСоСправочниками.ДатаПриИзмененииНаСервере(Номенклатура, ВидЦены, Валюта,Дата);
   
КонецПроцедуры



antoneus

Вроде так

Отбор = Новый Структура();
Отбор.Вставить("Номенклатура",Номенклатура);
Отбор.Вставить("ВидЦены", ВидЦены);
Отбор.Вставить("Валюта", Валюта);
Срез = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних(Дата, Отбор);
Если Срез.Количество() <> 0 Тогда
    Возврат Срез[0].Цена
КонецЕсли;

LexaK

Antonio, при изменении даты документа, лучше/оптимальнее сразу для всех товаров ТЧ получить новые цены,
а не только для текущего!

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

&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
    лкСтр = Элементы.СписокНоменклатуры.ТекущиеДанные;//оидн раз определяем
    Если лкСтр <> Неопределено Тогда
        //есть текущая Строка, обрабатываем
        лкСтр.Цена = ПолучитьЦенуНаСервере(лкСтр.Номенклатура, лкСтр.ВидЦены, лкСтр.Валюта, Дата);
    КонецЕсли;
//Номенклатура = Элементы.СписокНоменклатуры.ТекущиеДанные.Номенклатура;
//ВидЦены = Элементы.СписокНоменклатуры.ТекущиеДанные.ВидЦены;
//Валюта = Элементы.СписокНоменклатуры.ТекущиеДанные.Валюта;
//Дата = Объект.Дата;
//Элементы.СписокНоменклатуры.ТекущиеДанные.Цена = РаботаСоСправочниками.ДатаПриИзмененииНаСервере(Номенклатура, ВидЦены, Валюта,Дата);
   
КонецПроцедуры

если помогло нажмите: Спасибо!

Antonio

LexaK, antoneus, Спасибо, попытался применить оба случая, ошибок при изменении даты теперь нет, но в поле цена возвращает 0. Наверное неправильно сформирован запрос(. Занимаюсь недавно, пока не все понимаю в том как нужно формировать запрос. В аналогичных случаях создавал структуру, по ее элементам искал значение в регистре, но с поиском даты как то не выходит.
Если правильно понял, в процедуре последним параметром в функции нужно все таки писать "Объект.Дата"? http://joxi.ru/12MGDaQT8bbPMr

&НаСервереБезКонтекста
   Функция ПолучитьЦенуНаСервере(Номенклатура, ВидЦены, Валюта, Дата) Экспорт   


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
"ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
|ГДЕ
| ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура
| И ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены
| И ЦеныНоменклатурыСрезПоследних.Валюта = &Валюта
| И ЦеныНоменклатурыСрезПоследних.Период = &Дата";

Запрос.УстановитьПараметр("Валюта", Валюта);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);

РезультатЗапроса = Запрос.Выполнить().Выбрать();

Выборка = РезультатЗапроса.Выбрать();

Если Выборка.Следующий() Тогда
Возврат Выборка.Цена;
Иначе
Возврат 0
КонецЕсли;


КонецФункции

&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
    лкСтр = Элементы.СписокНоменклатуры.ТекущиеДанные;   
Если лкСтр <> Неопределено Тогда
       
        лкСтр.Цена = ПолучитьЦенуНаСервере(лкСтр.Номенклатура, лкСтр.ВидЦены, лкСтр.Валюта, объект.Дата);
    КонецЕсли;   
КонецПроцедуры

LexaK

Antonio, да, конечно, если Объект это ДокументОбъект реквизит формы
если помогло нажмите: Спасибо!

Antonio

LexaK, Спасибо, понял. Но пока не могу понять в чем проблема, почему возвращает 0 в цену. На искомые даты проведенные документы о ценах в регистре тоже есть

LexaK

Antonio, проверьте что у вас с текущей строке?
какие ВидЦены и Валюта? какой тип данных у них и Номенклатуры? (любая мелочь имеет значение)
попробуйте этот же запрос в консоли запросов! есть у вас такая обработка?
если помогло нажмите: Спасибо!

Теги:

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

Рейтинг@Mail.ru

Поиск