Ведомость по товарам на складах в ценах номенклатуры в 1С
Первым делом необходимо добавить в параметры схемы компоновки отчета «ВедомостьПоТоварамНаСкладахВЦенахНоменклатуры» новый параметр — «ВалютаОтчёта», тип — СправочникСсылка.Валюта, используется всегда:
Добавляем в итоговый запрос новое поле и такую конструкцию :
ВЫБОР
КОГДА &ВалютаОтчёта = ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
ТОГДА ВидыЦен.ВалютаЦены
ИНАЧЕ &ВалютаОтчёта
КОНЕЦ КАК ВалютаДляОтчёта
Смысл этой конструкции: если валюта не заполнена в параметрах — система будет брать валюту из вида цен.
Для упрощения поместим итоговую таблицу во временную таблицу «ПредИтог», создадим новый запрос, куда поместим всю предыдущую таблицу и две новые виртуальные таблицы: КурсыОтчёта и КурсыЦены (срез последних регистра сведений КурсыВалют):
Для двух новых временных таблиц вносим параметр — «&Период»:
Получите понятные самоучители по 1С бесплатно:
Таблица КурсыЦены хранит в себе курс, указанный для данного вида цена, а таблица КурсыОтчёта хранит в себе курс для указанной в отчете валюты.
Свяжем таблицы: таблицу КурсыЦены по полю «Валюта», таблицу КурсыОтчёта по полю «ВалютаДляОтчета»
Заменим поля сумм «СуммаНачальныйОстаток», «СуммаПриход», «СуммаРасход» и «СуммаКонечныйОстаток» на новые, вычисляемые поля, путём добавления конструкции «* КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс)»:
ПредИтог.СуммаНачальныйОстаток * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаНачальныйОстаток,
ПредИтог.СуммаПриход * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаПриход,
ПредИтог.СуммаРасход * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаРасход,
ПредИтог.СуммаКонечныйОстаток * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаКонечныйОстаток,
С запросом всё, переходим к настройкам отображения отчета.
Включаем новые параметры в пользовательские настройки. Параметру «Период» задаём представление — «Дата курса валюты», для лучшей наглядности.
Заменяем в группировках и выбранных полях поле «Валюта» на «ВалютаДляОтчёта»:
Для реализации требования заполнения поля «Валюты» при выборе типа цены необходимо создать форму отчета по умолчанию и в обработчик «ПриИзменении»:
Где прописать следующий программный код:
&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПриИзменении(Элемент)
Настройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(Элемент.ТекущаяСтрока);
Если Настройка <> Неопределено
И Настройка.Параметр = Новый ПараметрКомпоновкиДанных(«ВидЦены») тогда
НастройкаВалюты = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,»ВалютаОтчёта»);
Если НастройкаВалюты <> Неопределено Тогда
НастройкаВалюты.Значение=ВалютаВидаЦены(Настройка.Значение);
Конецесли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВалютаВидаЦены(ВидЦены)
Возврат ВидЦены.ВалютаЦены;
КонецФункции
Решение задачи основано на решении доброго человека Gray, спасибо ему.
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Евгений:
Необходимо в код еще добавить Попытку-Исключение, иначе ошибки будут при изменении других настроек, так как Настройка.Параметр не определен для всех элементов
&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПриИзменении(Элемент)
Настройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(Элемент.ТекущаяСтрока);
Попытка
Если Настройка Неопределено
И Настройка.Параметр = Новый ПараметрКомпоновкиДанных(“ВидЦены”) тогда
НастройкаВалюты = ОбщегоНазначенияУТКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,”ВалютаОтчёта”);
Если НастройкаВалюты Неопределено Тогда
НастройкаВалюты.Значение=ВалютаВидаЦены(Настройка.Значение);
Конецесли;
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
Александр:
Сохранил отчет как внешний. Нажимаю сформировать. Пропадает параметр ВалютаОтчёта из списка параметров на форме. Как это побороть? Наверное это критично?
Александр:
Функция получить параметр переехала в общий модуль КомпоновкаДанныхКлиентСервер.
Александр:
решение на 5 баллов 🙂
Денис:
На УТ Демо — все работает.
На пустой базе — не работает.
Какие настройки необходимо делать?
На экзамене, в демо базе или на пустой?
Андрей:
Упаковки номенклатуры в НСИ-Номенклатура галочка стоит?
Денис:
Поле не найдено «Валюта для отчёта» — это в новой базе.
В демо версии все работает.
Почему?
Павел:
В формулах курс цены умножается на кратность отчета. Это ошибка?
«Для двух новых временных таблиц вносим параметр – “&Период”:» — следует поправить, таблицы виртуальные, а не временные.
Совет. Если хотите сохранить отчет как внешний, то в модуле его объекта надо заменить :
СхемаКомпоновкиДанных = Отчеты.ВедомостьПоТоварамНаСкладахВЦенахНоменклатуры.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
На:
СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
Айрат:
Павел, спасибо за дополнение про получение основной схемы компоновки данных, не сразу догадался при поиске решения выходящей ошибки. Наверно, при пересчете цен в запросе полезно еще на возможное деление на ноль или Null проверять (не равны ли им КурсыЦеныКратность и КурсОтчета.Курс и если равны, то на всякий случай приравнивать их единице).
Павел:
Необязательно, в регистре КурсыВалют есть начальные записи от 01.01.1980, где курс и кратность равны 1.
Александр:
Директиву &НаСервере лучше заменить директивой &НаСервереБезКонтекста, т.к. ни к чему нам лишний раз данные формы гонять на сервер и обратно.
В УТ 11.1.10.167 функция ПолучитьПараметр лежит в общем модуле ОтчетыКлиентСервер и имеет другой параметр, в итоге будет вызов будет выглядеть как НастройкаВалюты = ОтчетыКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек, «ВалютаОтчёта»);
Кирилл:
Да, вы верно подметили, спасибо! Где можно использовать «на севере без контекста», лучше использовать его.
Иван Драга:
ОбщегоНазначенияУТКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,»ВалютаОтчёта») следует заменить на КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,»ВалютаОтчёта»);
Кирилл:
Спасибо, поправил
Candle:
У меня программа стала выдавать ошибку при выборе отбора по Номенклатуре. Дело в том, что не у всех ЭлементОтбораКомпоновкиДанных есть Параметр. Безглючный вариант кода для замены валюты по типу цены будет таким:
Настройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(Элемент.ТекущаяСтрока);
Если Элемент.ТекущиеДанные.Настройка=»Вид цены» Тогда
НастройкаВалюты = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,»ВалютаОтчёта»);
Если НастройкаВалюты Неопределено Тогда НастройкаВалюты.Значение=ВалютаВидаЦены(Настройка.Значение);
Конецесли;
КонецЕсли;