Сдавал пару лет назад, попался этот билет.
Я готовился по российским билетам, они совпадают почти полностью, мой не исключение.
Краткое изложение заданияВ качестве исходной использовать типовую конфигурацию «Управление торговлей» Необходимо ввести в перечень существующих номенклатурных цен понятие «УправленческаяЦена». Использование ее предполагается для суммовых оценок остатков и движения товаров. Причем предполагается, что данные вид цен может довольно часто изменяться (но не чаще одного раза в день). Т.е. необходимо обеспечить оформление отчетов, связанных с остатками и движениями товаров по еще одному показателю «СуммаУправленческая». Показатель рассчитывается как: «УправленческаяЦена»*Количество.
Как минимум, данные отчеты должны формироваться из универсальных «ОтчетОстаткиИОбороты» и «ОтчетДиаграмма».
Концепция решения:ЦенуХ можно хранить в периодическом регистре сведений «ЦеныНоменклатуры» (периодичность день). Для этого необходимо добавить в справочник «ТипыЦенНоменклатуры» предопределенный тип «ЦенаХ». Далее, документом «УстановкаЦенНоменклатуры» установить ценыХ для номенклатуры. Необходимо изменить запросы отчетов «ОстаткиИОбороты» и «СписокКроссТаблица» таким образом, чтобы соединять записи регистра накопления, по которому формируется отчет, с регистром сведений «ЦеныНоменклатуры» и получать тем самым СуммуХ. Причем, получать суммуХ нужно только для тех регистров, в которых есть измерение типа «СправочникСсылка.Номенклатура».
Последовательность решения:1. Добавляем в справочник «ТипыЦенНоменклатуры» предопределенный элемент «ЦенаХ».
2. Документом «УстановкаЦенНоменклатуры» регистрируем цены с типом «ЦенаХ».
3. Общий модуль «Отчеты», процедура «ЗаполнитьНачальныеНастройкиПоМетаданнымРегистра».
В цикле по измерениям ставим условие на тип измерения и пишем кусок кода из цикла по ресурсам, меняя только ИмяПоля, ПредставлениеПоля, ОписаниеПоля,ФорматнуюСтроку и Валюту:
Если МетаданныеРегистра.Измерения[Инд].Тип.СодержитТип(Тип("СправочникСсылка.Номенклатура")) Тогда
ИмяПоля = "СуммаХ";
ПредставлениеПоля = "СуммаХ";
ОписаниеПоля = "ЦенаХ * Количество#";
ВклПоУмолчанию = Истина;
ФорматнаяСтрока = "ЧЦ=15; ЧДЦ=2";
СтрИзмерения = "";
СтдВалюта = "УПР";
Если ТипОтчета = "СписокКроссТаблица" Тогда
Контекст.мСтруктураСвязиПоказателейИИзмерений.Вставить(ИмяПоля, Новый Структура(СтрИзмерения));
КонецЕсли;
Если ПустаяСтрока(ОписаниеПоля) Тогда
ОписаниеПоля = ИмяПоля;
КонецЕсли;
Если (ТипОтчета = "СписокКроссТаблица") ИЛИ (ТипОтчета = "Диаграмма") Тогда
ТекстПоляПоказатели = ТекстПоляПоказатели + ",
| " + СтрЗаменить("СУММА("+ОписаниеПоля+")","#", ТипПоляРегистра) + " КАК " + ИмяПоля;
ТекстПоляИтоговЗапроса = ТекстПоляИтоговЗапроса + ",
| СУММА(" + ИмяПоля + ")";
ТекстПоляУпорядочивания = ТекстПоляУпорядочивания + ",
| " + ИмяПоля;
СтруктураПредставлениеПолей.Вставить(ИмяПоля, ПредставлениеПоля);
ИначеЕсли ТипОтчета = "ОстаткиИОбороты" Тогда
ТекстПоляПоказатели = ТекстПоляПоказатели + ",
| " + СтрЗаменить("СУММА("+ОписаниеПоля+")","#", "НачальныйОстаток") + " КАК " + ИмяПоля + "НачальныйОстаток,
| " + СтрЗаменить("СУММА("+ОписаниеПоля+")","#", "КонечныйОстаток") + " КАК " + ИмяПоля + "КонечныйОстаток,
| " + СтрЗаменить("СУММА("+ОписаниеПоля+")","#", "Приход") + " КАК " + ИмяПоля + "Приход,
| " + СтрЗаменить("СУММА("+ОписаниеПоля+")","#", "Расход") + " КАК " + ИмяПоля + "Расход";
ТекстПоляИтоговЗапроса = ТекстПоляИтоговЗапроса + ",
| СУММА(" + ИмяПоля + "НачальныйОстаток),
| СУММА(" + ИмяПоля + "КонечныйОстаток),
| СУММА(" + ИмяПоля + "Приход),
| СУММА(" + ИмяПоля + "Расход)";
ТекстПоляУпорядочивания = ТекстПоляУпорядочивания + ",
| " + ИмяПоля + "НачальныйОстаток,
| " + ИмяПоля + "КонечныйОстаток,
| " + ИмяПоля + "Приход,
| " + ИмяПоля + "Расход";
СтруктураПредставлениеПолей.Вставить(ИмяПоля+"НачальныйОстаток", ПредставлениеПоля + " нач.ост.");
СтруктураПредставлениеПолей.Вставить(ИмяПоля+"КонечныйОстаток", ПредставлениеПоля + " кон.ост." );
СтруктураПредставлениеПолей.Вставить(ИмяПоля+"Приход", ПредставлениеПоля+" приход");
СтруктураПредставлениеПолей.Вставить(ИмяПоля+"Расход", ПредставлениеПоля+" расход");
КонецЕсли;
// Показатели заносятся в специальную таблицу
СтрПоказатели = Контекст.мТаблицаПоказатели.Добавить();
СтрПоказатели.ИмяПоля = ИмяПоля;
СтрПоказатели.ПредставлениеПоля = ПредставлениеПоля;
СтрПоказатели.ФорматнаяСтрока = ФорматнаяСтрока;
// ... и добавляются в список
Показатель = Контекст.Показатели.Добавить();
Показатель.Имя = ИмяПоля;
Показатель.Представление = ПредставлениеПоля;
Показатель.Использование = ВклПоУмолчанию;
КонецЕсли;
4. Общий модуль «Отчеты», процедура «ЗаполнитьНачальныеНастройкиПоМетаданнымРегистра» делаем левое соединение с регистром сведений «ЦеныНоменклатуры», причем соединяем не только по номенклатуре, но и обязательно по характеристикам. Накладываем условие на регистр по типу цен «ЦенаХ».
|ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Цена КАК ЦенаХ,
| ЦеныНоменклатурыСрезПоследних.Номенклатура КАК НоменклатураХ,
| ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаХ
| ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКон, ТипЦен = &Упр) КАК ЦеныНоменклатурыСрезПоследних) КАК ВложенныйЗапрос
| ПО ВложенныйЗапрос.НоменклатураХ = ТаблицаРегистра.Номенклатура и ВложенныйЗапрос.ХарактеристикаХ = ТаблицаРегистра.ХарактеристикаНоменклатуры
|//СОЕДИНЕНИЯ";
5. Устанавливаем необходимые параметры построителю отчета:
ПостроительОтчета.Параметры.Вставить("Упр",Справочники.ТипыЦенНоменклатуры.Управленческая);
Получил 5-