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

Кнопка Перерасчет Цен

Автор zuro, 14 мая 2025, 10:41

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

zuro

Ребята, подскажите, как сделать кнопку Перерасчета цен в РасходнаяНакладная
Нужно, чтобы с помощью запроса менялись цены в табличной части СписокНоменклатуры документа из регистра сведений ЦеныНоменклатуры
Я уже что только не пересмотрел, не понимаю как это сделать

alexandr_ll


antoneus

Хоть как-нибудь реализовать пробовал уже?

zuro

antoneus,
У меня есть еще автозаполнение цен номенклатуры, который берет цены с регистра ЦеныНоменклатуры и стоит непереодический и работает этот код

&НаКлиенте
Процедура СписокНоменклатурыНоменклатураПриИзменении(Элемент)
   
   СтрокаРасчета = Элементы.СписокНоменклатуры.ТекущиеДанные;
   СтрокаРасчета.Цена = ПолучитьЦену(СтрокаРасчета.Номенклатура);
   СписокНоменклатурыЦенаПриИзменении(Элемент);
   Элементы.СписокНоменклатуры.ТекущиеДанные.ВТомЧислеНДС = Объект.СписокНоменклатуры.Итог("Сумма")/100*Объект.НДС
КонецПроцедуры

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

И есть вот код, который я пытался сделать для кнопки
перерасчета цен, но он не проводится если стоит непереодический регистр сведений и я не знаю как быть, вот код, который на перерасчет цен, но он тоже не меняет цены в табличной части, но выводит сообщение о том, что цены пересчитаны

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

   Запрос.УстановитьПараметр("ДатаДокумента", Объект.Дата);
   Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры);

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

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

   Пока Выборка.Следующий() Цикл
      Для каждого СтрокаСписок из Объект.СписокНоменклатуры Цикл
         Если СтрокаСписок.Номенклатура = Выборка.Номенклатура Тогда
            СтрокаСписок.Цена = Выборка.Цена;
            СтрокаСписок.Сумма = СтрокаСписок.Цена * СтрокаСписок.Количество;
            Прервать;          КонецЕсли;
      КонецЦикла;
   КонецЦикла;

       Элементы.СписокНоменклатуры.Обновить();
   Сообщить("Цены пересчитаны.");
КонецПроцедуры

&НаКлиенте
Процедура ПерерасчетЦен(Команда)
   ПерерасчетЦенНаСервере();
КонецПроцедуры


antoneus

Ну значит надо делать выборку не из СрезПоследних, а просто из РегистрСведений.ЦеныНоменклатуры.

И цены не циклом в цикле в тч заносить, а в цикле по выборке искать строку ТЧ и писать цену туда.

zuro

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

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

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

У меня выходит так же сообщение цены пересчитаны, но по итогу ничего не меняется


antoneus

А что должно меняться-то? Цены надо еще в табличную часть положить.

zuro


zuro

antoneus, Подскажите, пожалуйста, как сделать, я просто недавно начал изучать, не совсем понимаю

antoneus

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

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

Теги:

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

Рейтинг@Mail.ru

Поиск