[ Вопрос дня ] Как передавать заполненные пользовательские настройки в открываемую форму отчета на СКД?

Доброго дня, коллеги!

Тренер курса Профессиональная разработка отчетов в 1С 8.3 на СКД на протяжении уже нескольких лет ежедневно отвечает на многочисленные и разнообразные вопросы слушателей по теме СКД. Неудивительно, что он с полуслова понимает суть заданных вопросов, формулировки которых бывают теми еще задачками!

Вопрос:

Добрый день! Вопрос по отборам в СКД. Предположим, у нас следующая задача. Есть УТ11, Справочник Номенклатура. Дополнительные реквизиты уже “связаны” в настройках справочника. Есть дополнительный реквизит, например “Доп Первый“. Выводим в табличный документ список справочника Номенклатура с отбором по доп.реквизиту. Какой ключ указать в Отборе? На ключ “Ссылка.[Доп Первый]” возникает ошибка. На ключ, указанный как значение в доп. реквизите для технического специалиста – не отбирает, судя по всему не находит такой ключ. Я так понимаю, что это из-за того, что доп.реквизит для справочника Номенклатура создан в пользовательском режиме. Но ведь на какой-то стадии формирования отчета на СКД он его видит. Если открою просто отчет в режиме пользователя, то доп.реквизит в списке присутствует, его можно включить в отборы. Выглядит он именно как “Ссылка.[Доп Первый]“. Есть ли какие особенности отбора по доп.реквизитам?

Ответ:

Добрый день! 1С: УТ 11 – типовая конфигурация, поэтому в ней можно подсмотреть, как решается подобная задача. В курсе рассматривается похожий пример из 1С: УТ 11. В уроке рассматривается прием, как передавать заполненные пользовательские настройки в открываемую форму отчета. А в пользовательских настройках размещаем отбор по доп.реквизиту.

Пример:

В демобазе 1С:УТ 11 есть доп.реквизит “Расчетная масса (кг/км)”:

Расчетная масса (кг/км)

Доработаем программный код из типовой 1C:УТ, чтобы открывалась ведомость по товарам на складах для тех номенклатур, у которых Расчетная масса (кг/км) = 82:

&НаКлиенте
Процедура ОткрытьВедомостьПоТоварамНаСкладах(Команда)   
    Форма = ПолучитьФорму("Отчет.ВедомостьПоТоварамНаСкладах.Форма");     
    КомпоновщикНастроекКомпоновкиДанных = Форма.Отчет.КомпоновщикНастроек;
    ПользовательскиеНастройки = КомпоновщикНастроекКомпоновкиДанных.ПользовательскиеНастройки;   
    НастройкаНоменклатура = Новый Структура;
    НастройкаНоменклатура.Вставить("ВидСравнения",ВидСравненияКомпоновкиДанных.Равно);
    НастройкаНоменклатура.Вставить("ПравоеЗначение", 82);
    НастройкаНоменклатура.Вставить("Использование", Истина);   
    УстановитьПользовательскуюНастройку(КомпоновщикНастроекКомпоновкиДанных,
        ПользовательскиеНастройки,
        "Номенклатура.[Расчетная масса (кг/км)]",
        НастройкаНоменклатура);   
    ПараметрыФормы = Новый Структура("СформироватьПриОткрытии, ПользовательскиеНастройки",
        Истина,
        ПользовательскиеНастройки);
    ОткрытьФорму("Отчет.ВедомостьПоТоварамНаСкладах.Форма", ПараметрыФормы);   
КонецПроцедуры

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

Сформируется вот такой отчет:

Ведомость по товарам на складах

Вопрос слушателя:

Спасибо за ответ :) Вот только на новом, не типовом отчете УТ, отбор не срабатывает. Как я думаю, надо выполнить еще какие-то настройки компоновки. Но какие, понять не могу.

Ответ тренера:

Обратите внимание, что в типовом отчете ВедомостьПоТоварамНаСкладах отбор вынесен в пользовательские настройки:

ВедомостьПоТоварамНаСкладах

Не только отбор по конкретному полю (Склад или Номенклатура), а отбор отчета в целом добавлен в пользовательские настройки. Именно эта особенность используется в программном коде – выполняется проверка наличия отбора в пользовательских настройках:

Если ТипЗнч(Элемент) = Тип("ОтборКомпоновкиДанных") Тогда

Добавить отбор в пользовательские настройки можно следующим образом:

Добавить отбор в пользовательские настройки

Попробуйте такую настройку выполнить для своего отчета.

Это пример разобранного вопроса из Мастер-группы курса
Профессиональная разработка отчетов в 1С 8.3 на СКД.

Описание курса и примеры видео

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.