Помогите, пожалуйста.
Смотрите, есть документ калькуляция. Есть цены на определенные услуги, которые заполняет бухгалтерия, но в калькуляциях они сами не изменяются. Было решено сделать Кнопку "Пересчет", которая пересчитывала бы цены.
То есть заходим в документ, цены старые, нажимаем "Пересчитать" и цены новые.
написал обработку для этой кнопки, но не работает, помогите, в чем может быть проблема
Смотрите, есть документ калькуляция. Есть цены на определенные услуги, которые заполняет бухгалтерия, но в калькуляциях они сами не изменяются. Было решено сделать Кнопку "Пересчет", которая пересчитывала бы цены.
То есть заходим в документ, цены старые, нажимаем "Пересчитать" и цены новые.
написал обработку для этой кнопки, но не работает, помогите, в чем может быть проблема
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Калькуляция.Ссылка КАК Ссылка
|ИЗ
| Документ.Калькуляция КАК Калькуляция
|ГДЕ
| Калькуляция.Проведен = &Проведен" ;
Запрос.УстановитьПараметр("Проведен", Истина);
СписокДокументов=Запрос.Выполнить().Выбрать();
Пока СписокДокументов.Следующий() Цикл
ДокОбъект = СписокДокументов.Ссылка.ПолучитьОбъект();
Для Каждого Стр из ДокОбъект.Услуги Цикл
Запрос= Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КалькуляцияУслуги.Ссылка КАК Ссылка,
| КалькуляцияУслуги.Номенклатура КАК Номенклатура,
| КалькуляцияУслуги.Цена КАК Цена,
| ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаНовая
|ИЗ
| Документ.Калькуляция.Услуги КАК КалькуляцияУслуги
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО КалькуляцияУслуги.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|ГДЕ
| КалькуляцияУслуги.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СписокДокументов.Ссылка);
СписокНовыхЦен=Запрос.Выполнить().Выгрузить();
Номенклатура=Стр.Номенклатура;
Цена = Стр.Цена;
НайденнаяСтрока = СписокНовыхЦен.Найти(Номенклатура,"Номенклатура");
Если НайденнаяСтрока<>Неопределено Тогда
НоваяЦена=НайденнаяСтрока.ЦенаНовая;
Иначе
НоваяЦена=0;
КонецЕсли;
Если Цена<>НоваяЦена Тогда
Стр.Цена = НоваяЦена;
Стр.Сумма = НоваяЦена * Стр.Количество * Стр.Периодичность;
ПересчитатьСуммуНДС(Стр, ДокОбъект.СуммаВключаетНДС);
КонецЕсли;
КонецЦикла;
ДокОбъект.Записать();
КонецЦикла;
ПоказатьПо теме из базы знаний
- Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки
- Последовательное проведение документов по НДФЛ (при подготовке сведений для формы 6-НДФЛ)
- Перенос документов 1С из одной базы в другую
- Ускорим проведение в 1С:Управление холдингом
- Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Запрос в цикле это конечно фи.
Вы перебираете табличную часть документа и для каждой строки ищите цены номенклатуры для все табличной части. Зачем вам второй запрос вообще.
В первом запросе вытащите документ, номенклатуру и новую цену сразу.
Вы перебираете табличную часть документа и для каждой строки ищите цены номенклатуры для все табличной части. Зачем вам второй запрос вообще.
В первом запросе вытащите документ, номенклатуру и новую цену сразу.
(3)
(5)
Теперь ругается на запрос
(5)
СписокДокументов=Запрос.Выполнить().Выбрать();
Пока СписокДокументов.Следующий() Цикл
ДокОбъект = СписокДокументов.Ссылка.ПолучитьОбъект();
Для Каждого Стр из ДокОбъект.Услуги Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КалькуляцияУслуги.Ссылка КАК Ссылка,
| КалькуляцияУслуги.Цена КАК Цена,
| КалькуляцияУслуги.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК НоваяЦена
|ИЗ
| Документ.Калькуляция.Услуги КАК КалькуляцияУслуги
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО КалькуляцияУслуги.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|ГДЕ
| КалькуляцияУслуги.Ссылка.Проведен
| И КалькуляцияУслуги.Ссылка = &Ссылка" ;
Запрос.УстановитьПараметр("Проведен", Истина);
//Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Ссылка", СписокДокументов.Ссылка);
СписокНовыхЦен=Запрос.Выполнить().Выгрузить();
Номенклатура=Стр.Номенклатура;
Цена = Стр.Цена;
НайденнаяСтрока = СписокНовыхЦен.Найти(Номенклатура,"Номенклатура");
Если НайденнаяСтрока<>Неопределено Тогда
НоваяЦена=НайденнаяСтрока.ЦенаНовая;
Иначе
НоваяЦена=0;
КонецЕсли;
Если Цена<>НоваяЦена Тогда
Стр.Цена = НоваяЦена;
Стр.Сумма = НоваяЦена * Стр.Количество * Стр.Периодичность;
ПересчитатьСуммуНДС(Стр, ДокОбъект.СуммаВключаетНДС);
КонецЕсли;
КонецЦикла;
ДокОбъект.Записать();
КонецЦикла;
ПоказатьТеперь ругается на запрос
А задача какая? Перезаполнить все документы Калькуляция актуальными ценами? А для чего все это? Перезаписать документы за всю историю работы. Это может быть довольно затратная по времени операция. Молчу уже про запрос в цикле...
Ошибки навскидку не видно. Единственное замечание - переменная НоваяЦена не инициализирована и участвует в операции сравнения.
Отладчиком пройдитесь.
Ошибки навскидку не видно. Единственное замечание - переменная НоваяЦена не инициализирована и участвует в операции сравнения.
Отладчиком пройдитесь.
Много вопросов и мало ответов:
1) На основании каких выводов вы решили, что у вас не работает?
2) Говорили, что в документе нажимаете кнопку "Пересчитать". Так зачем эта кнопка пересчитывает все проведенные документы, а не только текущий?
Далее не критичные, но все-таки ошибки:
3) Два запроса можно слить в один и да, запрос в цикле - это жесть
4) Вместо "Калькуляция.Проведен = &Проведен" пишите просто "Калькуляция.Проведен" и дополнительный параметр для запроса не придется устанавливать
Отладчиком умеете пользоваться?
1) На основании каких выводов вы решили, что у вас не работает?
2) Говорили, что в документе нажимаете кнопку "Пересчитать". Так зачем эта кнопка пересчитывает все проведенные документы, а не только текущий?
Далее не критичные, но все-таки ошибки:
3) Два запроса можно слить в один и да, запрос в цикле - это жесть
4) Вместо "Калькуляция.Проведен = &Проведен" пишите просто "Калькуляция.Проведен" и дополнительный параметр для запроса не придется устанавливать
Отладчиком умеете пользоваться?
(11)
БП3,0
СписокДокументов=Запрос.Выполнить().Выбрать();
Пока СписокДокументов.Следующий() Цикл
ДокОбъект = СписокДокументов.Ссылка.ПолучитьОбъект();
Для Каждого Стр из ДокОбъект.Услуги Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КалькуляцияУслуги.Ссылка КАК Ссылка,
| КалькуляцияУслуги.Цена КАК Цена,
| КалькуляцияУслуги.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК НоваяЦена
|ИЗ
| Документ.Калькуляция.Услуги КАК КалькуляцияУслуги
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО КалькуляцияУслуги.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|ГДЕ
| КалькуляцияУслуги.Ссылка.Проведен
| И КалькуляцияУслуги.Ссылка = &Ссылка" ;
Запрос.УстановитьПараметр("Проведен", Истина);
//Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Ссылка", СписокДокументов.Ссылка);
СписокНовыхЦен=Запрос.Выполнить().Выгрузить();
Номенклатура=Стр.Номенклатура;
Цена = Стр.Цена;
НайденнаяСтрока = СписокНовыхЦен.Найти(Номенклатура,"Номенклатура");
Если НайденнаяСтрока<>Неопределено Тогда
НоваяЦена=НайденнаяСтрока.ЦенаНовая;
Иначе
НоваяЦена=0;
КонецЕсли;
Если Цена<>НоваяЦена Тогда
Стр.Цена = НоваяЦена;
Стр.Сумма = НоваяЦена * Стр.Количество * Стр.Периодичность;
ПересчитатьСуммуНДС(Стр, ДокОбъект.СуммаВключаетНДС);
КонецЕсли;
КонецЦикла;
ДокОбъект.Записать();
КонецЦикла;
ПоказатьБП3,0
(12)Нет, нужно сразу учиться стандартизированному программированию. Четко понимать, что, к чему и почему. Тут написан треш, парень говорит, что пишет для документА, при этом использует запрос для получиния документов. Запрос в цикле, использует метод найти, если хотя бы в этом запросе в цикле можно было бы передать параметр номенклатура. Я бы даже интерном не брал.
Реализовывать нужно одним запросом.
Реализовывать нужно одним запросом.
Ребят, Хелп.
вот рабочий запрос, помогите все это к кнопке привязать
"ВЫБРАТЬ
| КалькуляцияУслуги.Цена КАК Цена,
| КалькуляцияУслуги.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК НоваяЦена,
| Калькуляция.Ссылка КАК Ссылка
|ИЗ
| Документ.Калькуляция.Услуги КАК КалькуляцияУслуги
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО КалькуляцияУслуги.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Калькуляция КАК Калькуляция
| ПО КалькуляцияУслуги.Ссылка = Калькуляция.Ссылка
|ГДЕ
| КалькуляцияУслуги.Ссылка.Проведен"
Показатьвот рабочий запрос, помогите все это к кнопке привязать
(33) вот пример для ТЧ Товары
&НаСервере
Процедура Расш1_Команда1ПослеНаСервере()
ВидЦены = Объект.ВидЦены;
ТЗТовары = Объект.Товары.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура В (&ТЗТовары)
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("ТЗТовары", ТЗТовары);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
ТЗ_Цены = Запрос.Выполнить().Выгрузить();
Для каждого СтрокаТоваров Из Объект.Товары Цикл
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.Цена;
//ну и дальше еще что надо заполнить.
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Расш1_Команда1После(Команда)
Расш1_Команда1ПослеНаСервере();
КонецПроцедуры
Показать
(34)
ВидЦены = Объект.ВидЦены;
ТЗТовары = Объект.Товары.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура В (&ТЗТовары)
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("ТЗТовары", ТЗТовары);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
ТЗ_Цены = Запрос.Выполнить().Выгрузить();
Для каждого СтрокаТоваров Из Объект.Товары Цикл
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.Цена;
//ну и дальше еще что надо заполнить.
КонецЕсли;
КонецЦикла; Показать
все равно не работает
а так, спасибо за помощь
а не за бестолковые отписки
ВидЦены = Объект.ВидЦены;
ТЗТовары = Объект.Товары.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура В (&ТЗТовары)
| И ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних";
Запрос.УстановитьПараметр("ТЗТовары", ТЗТовары);
Запрос.УстановитьПараметр("ВидЦены", ВидЦены);
ТЗ_Цены = Запрос.Выполнить().Выгрузить();
Для каждого СтрокаТоваров Из Объект.Товары Цикл
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.Цена;
//ну и дальше еще что надо заполнить.
КонецЕсли;
КонецЦикла;
все равно не работает
а так, спасибо за помощь
а не за бестолковые отписки
(36)
Когда хочу посчитать сумму, программа зацикливается
Помогите, пожалуйста, добить до конца
Когда хочу посчитать сумму, программа зацикливается
ТЗУслуги = Объект.Услуги.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
| КалькуляцияУслуги.Количество КАК Количество
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних,
| Документ.Калькуляция.Услуги КАК КалькуляцияУслуги";
ТЗ_Цены = Запрос.Выполнить().Выгрузить();
//ТЗ_Ном = Запрос.Выполнить().Выгрузить();
Для каждого СтрокаТоваров Из ТЗУслуги Цикл
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
СтрТЗ_Коли = ТЗ_Цены.Найти(СтрокаТоваров.Количество, "Количество");
//СтрТЗ_Пер = ТЗ_Пер.Найти(СтрокаТоваров.Периодичность, "Периодичность");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.цена;
СтрокаТоваров.Кол = СтрТЗ_Коли.Количество;
СтрокаТоваров.Сумма = СтрТЗ_Цен.цена * СтрТЗ_Коли.Количество;//СтрТЗ_Ном.Количество; //* СтрТЗ_Пер.Периодичность;
КонецЕсли;
ПоказатьПомогите, пожалуйста, добить до конца
(38) может вам чем-то другим заняться?
Для каждого СтрокаТоваров Из ТЗУслуги Цикл
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.цена;
//Количество не меняется!!!
СтрокаТоваров.Сумма = СтрокаТоваров.Кол * СтрокаТоваров.Цена;
КонецЕсли;
Показать
(39)
Хочу изучать 1с)
Для каждого СтрокаТоваров Из ТЗУслуги Цикл
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.цена;
//Количество не меняется!!!
СтрокаТоваров.Сумма = СтрокаТоваров.Кол * СтрокаТоваров.Цена;
КонецЕсли;
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.цена;
//Количество не меняется!!!
СтрокаТоваров.Сумма = СтрокаТоваров.Кол * СтрокаТоваров.Цена;
КонецЕсли;
Хочу изучать 1с)
(42)
{Документ.Калькуляция.Форма.ФормаДокумента.Форма(1829)}: Поле объекта не обнаружено (Цена)
СтрокаТоваров.Цена = СтрТЗ_Цен.Цена;
ТЗУслуги = Объект.Услуги.Выгрузить(,"Номенклатура");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних";
ТЗ_Цены = Запрос.Выполнить().Выгрузить();
Для каждого СтрокаТоваров Из ТЗУслуги Цикл
СтрТЗ_Цен = ТЗ_Цены.Найти(СтрокаТоваров.Номенклатура, "Номенклатура");
Если СтрТЗ_Цен = Неопределено Тогда
Продолжить;
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.Цена;
СтрокаТоваров.Сумма = СтрокаТоваров.Количество * СтрТЗ_Цен.Цена;
КонецЕсли;
Показать{Документ.Калькуляция.Форма.ФормаДокумента.Форма(1829)}: Поле объекта не обнаружено (Цена)
СтрокаТоваров.Цена = СтрТЗ_Цен.Цена;
(42)
Друг, помоги еще раз, пожалуйста
Смотри, нужно пересчитать СуммуНДС, есть процедура для этого, но из кнопки она не вызывается(
Это вставляем в кнопку,
А это сама процедура, ругается на это
{Документ.Калькуляция.Форма.ФормаДокумента.Форма(1831)}: Поле объекта не обнаружено (СуммаВключаетНДС)
ПересчитатьСуммуНДС(СтрокаТоваров, ТЗУСЛУГИ.СуммаВключаетНДС);
Друг, помоги еще раз, пожалуйста
Смотри, нужно пересчитать СуммуНДС, есть процедура для этого, но из кнопки она не вызывается(
ПересчитатьСуммуНДС(СтрокаТоваров, ТЗУСЛУГИ.СуммаВключаетНДС);
&НаСервере
Процедура ПересчитатьСуммуНДС(Строка, СуммаВключаетНДС, ПрименяютсяСтавки4и2 = Ложь, НалоговыйАгентПоФЗ335 = Ложь) Экспорт
Сумма = Строка.Сумма;
Если НалоговыйАгентПоФЗ335 Тогда
Строка.СуммаНДС = 0;
Иначе
Строка.СуммаНДС = УчетНДСКлиентСервер.РассчитатьСуммуНДС(Сумма, СуммаВключаетНДС, УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(Строка.СтавкаНДС, ПрименяютсяСтавки4и2));
КонецЕсли;
//Строка.Всего = Сумма + ?(СуммаВключаетНДС, 0, Строка.СуммаНДС);
КонецПроцедуры
ПоказатьА это сама процедура, ругается на это
{Документ.Калькуляция.Форма.ФормаДокумента.Форма(1831)}: Поле объекта не обнаружено (СуммаВключаетНДС)
ПересчитатьСуммуНДС(СтрокаТоваров, ТЗУСЛУГИ.СуммаВключаетНДС);
(48) И про запись... По хорошему вместо записи надо устанавливать модифицированность.
ЭтаФорма.Модифицированность = Истина;
А записывать документ или нет, принимает решение пользователь.
Иначе
СтрокаТоваров.Цена = СтрТЗ_Цен.Цена;
СтрокаТоваров.Сумма = СтрокаТоваров.Количество * СтрТЗ_Цен.Цена;
ПересчитатьСуммуНДС(СтрокаТоваров, Объект.СуммаВключаетНДС)
КонецЕсли;
ЭтаФорма.Модифицированность = Истина;
А записывать документ или нет, принимает решение пользователь.
(50)
Спасибо!
Но решил по-другому
ПересчитатьСуммуНДС(СтрокаТоваров, Объект.СуммаВключаетНДС)
Спасибо!
Но решил по-другому
ЗначениеСтавкиНДС = УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтрокаТоваров.СтавкаНДС);
СтрокаТоваров.СуммаНДС = УчетНДСКлиентСервер.РассчитатьСуммуНДС(СтрокаТоваров.Сумма, Объект.СуммаВключаетНДС, ЗначениеСтавкиНДС);
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот