Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут! (в рабочие часы)

Ведомость по товарам на складах в ценах номенклатуры в 1С

Первым делом необходимо  добавить в параметры схемы компоновки отчета «ВедомостьПоТоварамНаСкладахВЦенахНоменклатуры» новый параметр — «ВалютаОтчёта», тип — СправочникСсылка.Валюта, используется всегда:

параметры отчета

Добавляем в итоговый запрос новое поле и такую конструкцию :

ВЫБОР
КОГДА &ВалютаОтчёта = ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)
ТОГДА ВидыЦен.ВалютаЦены
ИНАЧЕ &ВалютаОтчёта
КОНЕЦ КАК ВалютаДляОтчёта

Смысл этой конструкции: если валюта не заполнена в параметрах — система будет брать валюту из вида цен.

Для упрощения поместим итоговую таблицу во временную таблицу «ПредИтог», создадим новый запрос, куда поместим всю предыдущую таблицу и две новые виртуальные таблицы: КурсыОтчёта и КурсыЦены (срез последних регистра сведений КурсыВалют):

новая таблицы

Для двух новых временных таблиц вносим параметр — «&Период»:

Получите понятные самоучители по 1С бесплатно:

параметры курсов

Таблица КурсыЦены хранит в себе курс, указанный для данного вида цена, а таблица КурсыОтчёта хранит в себе курс для указанной в отчете валюты.

Свяжем таблицы: таблицу КурсыЦены по полю «Валюта», таблицу КурсыОтчёта по полю «ВалютаДляОтчета»

связи таблиц

Заменим поля сумм «СуммаНачальныйОстаток», «СуммаПриход», «СуммаРасход» и «СуммаКонечныйОстаток» на новые, вычисляемые поля, путём добавления конструкции «* КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс)»:

ПредИтог.СуммаНачальныйОстаток * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаНачальныйОстаток,
ПредИтог.СуммаПриход * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаПриход,
ПредИтог.СуммаРасход * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаРасход,
ПредИтог.СуммаКонечныйОстаток * КурсыЦены.Курс * КурсыОтчёта.Кратность / (КурсыЦены.Кратность * КурсыОтчёта.Курс) КАК СуммаКонечныйОстаток,

С запросом всё, переходим к настройкам отображения отчета.

настройки отчета

 

Включаем новые параметры в пользовательские настройки. Параметру «Период» задаём представление — «Дата курса валюты», для лучшей наглядности.

Заменяем в группировках и выбранных полях поле «Валюта» на «ВалютаДляОтчёта»:

настройки скд

Для реализации требования заполнения поля «Валюты» при выборе типа цены необходимо создать форму отчета по умолчанию и в обработчик «ПриИзменении»:

обработчик выбора валюты

 

Где прописать следующий программный код:
&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПриИзменении(Элемент)

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

КонецПроцедуры

&НаСервере
Функция ВалютаВидаЦены(ВидЦены)
Возврат ВидЦены.ВалютаЦены;
КонецФункции

Скачать получившийся отчет

Решение задачи основано на решении доброго человека Gray, спасибо ему.

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Остались вопросы?

СПРОСИТЕ в комментариях!

Комментариев: 15 на “Ведомость по товарам на складах в ценах номенклатуры в 1С
  1. Необходимо в код еще добавить Попытку-Исключение, иначе ошибки будут при изменении других настроек, так как Настройка.Параметр не определен для всех элементов
    &НаКлиенте
    Процедура КомпоновщикНастроекПользовательскиеНастройкиПриИзменении(Элемент)

    Настройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(Элемент.ТекущаяСтрока);
    Попытка
    Если Настройка Неопределено
    И Настройка.Параметр = Новый ПараметрКомпоновкиДанных(“ВидЦены”) тогда
    НастройкаВалюты = ОбщегоНазначенияУТКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,”ВалютаОтчёта”);
    Если НастройкаВалюты Неопределено Тогда
    НастройкаВалюты.Значение=ВалютаВидаЦены(Настройка.Значение);
    Конецесли;
    КонецЕсли;
    Исключение
    КонецПопытки;
    КонецПроцедуры

    Ответить

  2. Сохранил отчет как внешний. Нажимаю сформировать. Пропадает параметр ВалютаОтчёта из списка параметров на форме. Как это побороть? Наверное это критично?

    Ответить

  3. Функция получить параметр переехала в общий модуль КомпоновкаДанныхКлиентСервер.

    Ответить

  4. решение на 5 баллов 🙂

    Ответить

  5. На УТ Демо — все работает.

    На пустой базе — не работает.

    Какие настройки необходимо делать?
    На экзамене, в демо базе или на пустой?

    Ответить

    • Упаковки номенклатуры в НСИ-Номенклатура галочка стоит?

      Ответить

  6. Поле не найдено «Валюта для отчёта» — это в новой базе.
    В демо версии все работает.
    Почему?

    Ответить

  7. В формулах курс цены умножается на кратность отчета. Это ошибка?

    «Для двух новых временных таблиц вносим параметр – “&Период”:» — следует поправить, таблицы виртуальные, а не временные.

    Совет. Если хотите сохранить отчет как внешний, то в модуле его объекта надо заменить :
    СхемаКомпоновкиДанных = Отчеты.ВедомостьПоТоварамНаСкладахВЦенахНоменклатуры.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);
    На:
    СхемаКомпоновкиДанных = ЭтотОбъект.ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»);

    Ответить

    • Павел, спасибо за дополнение про получение основной схемы компоновки данных, не сразу догадался при поиске решения выходящей ошибки. Наверно, при пересчете цен в запросе полезно еще на возможное деление на ноль или Null проверять (не равны ли им КурсыЦеныКратность и КурсОтчета.Курс и если равны, то на всякий случай приравнивать их единице).

      Ответить

      • Необязательно, в регистре КурсыВалют есть начальные записи от 01.01.1980, где курс и кратность равны 1.

        Ответить

  8. Директиву &НаСервере лучше заменить директивой &НаСервереБезКонтекста, т.к. ни к чему нам лишний раз данные формы гонять на сервер и обратно.
    В УТ 11.1.10.167 функция ПолучитьПараметр лежит в общем модуле ОтчетыКлиентСервер и имеет другой параметр, в итоге будет вызов будет выглядеть как НастройкаВалюты = ОтчетыКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек, «ВалютаОтчёта»);

    Ответить

    • Да, вы верно подметили, спасибо! Где можно использовать «на севере без контекста», лучше использовать его.

      Ответить

  9. ОбщегоНазначенияУТКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,»ВалютаОтчёта») следует заменить на КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,»ВалютаОтчёта»);

    Ответить

  10. У меня программа стала выдавать ошибку при выборе отбора по Номенклатуре. Дело в том, что не у всех ЭлементОтбораКомпоновкиДанных есть Параметр. Безглючный вариант кода для замены валюты по типу цены будет таким:
    Настройка = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(Элемент.ТекущаяСтрока);
    Если Элемент.ТекущиеДанные.Настройка=»Вид цены» Тогда
    НастройкаВалюты = КомпоновкаДанныхКлиентСервер.ПолучитьПараметр(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки,»ВалютаОтчёта»);
    Если НастройкаВалюты Неопределено Тогда НастройкаВалюты.Значение=ВалютаВидаЦены(Настройка.Значение);
    Конецесли;
    КонецЕсли;

    Ответить

Добавить комментарий:

Ваш адрес email не будет опубликован.