И так с чего начинается реализация задачи? Конечно же, с постановки ТЗ!
ТЗ или техническое задание:
1. Написать отчет на СКД для отображения ответственных инженеров по группам номенклатуры.
2. При отборе сотрудника, который будет увольняться, нужно выдать информацию по группам номенклатуры, в которых он присутствует, но без его отображения в отчете и чтобы там были параллельно назначенные ответственные.
Что имеем:
Под рукой у нас конфигурация УСО 8.2 на обычном интерфейсе, УСО можно принять за конфигурацию УПП, т.к. они очень похожи.
Для удобства разработки была внедрена Подсистема "Инструменты разработчика", за что отдельное спасибо автору разработки. Рекомендую ознакомиться с её функционалом, заметно облегчит вам жизнь разработчика.
В конфигурации присутствует новый документ "Назначение ответственного на группу номенклатуры" и соответствующий регистр сведений, формирующий движения для построения отчета.
Решение задачи:
Теперь имея все карты на руках, смело приступаем к разработке отчета!
1 часть ТЗ реализуется достаточно просто, а вот над 2 частью пришлось повозиться, что и послужило результатом для публикации.
Задачу разбил на 5 пакетов запросов. И так по порядку.
Первый пакет запроса:
ВЫБРАТЬ
Номенклатура.Ссылка
ПОМЕСТИТЬ ВТГруппыНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ИСТИНА
;
////////////////////////////////////////////////////////////////////////////////Этот запрос создает виртуальную таблицу, в которую загрузим группы номенклатуры.
Второй пакет запроса:
ВЫБРАТЬ
ОтветственныеНаГруппах.ГруппаИерархия,
ОтветственныеНаГруппах.Должность,
ОтветственныеНаГруппах.Сотрудник
ПОМЕСТИТЬ ВТОтветственныеНаГруппах
ИЗ
(ВЫБРАТЬ
ВТГруппыНоменклатуры.Ссылка КАК ГруппаИерархия,
НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Должность КАК Должность,
НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Сотрудник КАК Сотрудник
ИЗ
ВТГруппыНоменклатуры КАК ВТГруппыНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НазначениеОтветственныхГруппамНоменклатуры.СрезПоследних КАК НазначениеОтветственныхГруппамНоменклатурыСрезПоследних
ПО ВТГруппыНоменклатуры.Ссылка = НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Группа
ГДЕ
НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Действующий = ИСТИНА) КАК ОтветственныеНаГруппах
;
////////////////////////////////////////////////////////////////////////////////
Здесь используем смесь метода
"СрезПоследних" для регистра сведений и виртуальных таблиц.
"СрезПоследних" нужен для того чтобы в отчете были сотрудники,
которые только на текущий момент назначены на группы номенклатуры.
Третий пакет запроса:
ВЫБРАТЬ
ВТОтветственныеНаГруппах.ГруппаИерархия КАК ГруппаНоменклатуры,
ВТОтветственныеНаГруппах.Должность,
ВТОтветственныеНаГруппах.Сотрудник
ПОМЕСТИТЬ ВТВсе
ИЗ
ВТГруппыНоменклатуры КАК ВТГруппыНоменклатуры
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТОтветственныеНаГруппах КАК ВТОтветственныеНаГруппах
ПО ВТГруппыНоменклатуры.Ссылка = ВТОтветственныеНаГруппах.ГруппаИерархия
;
////////////////////////////////////////////////////////////////////////////////
Тут все просто соединяем таблицы, так чтобы видеть только те записи, которые удовлетворяют условию связи, как из правой таблицы, так и из левой.
Первая часть ТЗ решена и можно было бы на этом закончить, но была поставлена 2 часть и придется попотеть...
Четвертый пакет запроса:
ВЫБРАТЬ
НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Группа,
НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Должность,
НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Сотрудник
ПОМЕСТИТЬ ВТБезОтветсвенного
ИЗ
РегистрСведений.НазначениеОтветственныхГруппамНоменклатуры.СрезПоследних КАК НазначениеОтветственныхГруппамНоменклатурыСрезПоследних
ГДЕ
НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Действующий = ИСТИНА
{ГДЕ
(НазначениеОтветственныхГруппамНоменклатурыСрезПоследних.Сотрудник <> &СотрудникНаУвольнение)}
;
////////////////////////////////////////////////////////////////////////////////
Запрос очень похож на кусок из 2 пакета, но тут мы добавили необязательное условие { }. Эта часть кода обработается, если будет задан параметр &СотрудникНаУвольнение, что очень кстати. Т.к. первая часть ТЗ не предполагает его использование.
Пятый пакет запроса (финальный):
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВТВсе.ГруппаНоменклатуры,
ВЫБОР
КОГДА &ОтборНаУвольнение
ТОГДА ВТБезОтветсвенного.Должность
ИНАЧЕ ВТВсе.Должность
КОНЕЦ КАК Должность,
ВЫБОР
КОГДА &ОтборНаУвольнение
ТОГДА ВТБезОтветсвенного.Сотрудник
ИНАЧЕ ВТВсе.Сотрудник
КОНЕЦ КАК Сотрудник
ИЗ
ВТВсе КАК ВТВсе
{ЛЕВОЕ СОЕДИНЕНИЕ ВТБезОтветсвенного КАК ВТБезОтветсвенного
ПО ВТВсе.ГруппаНоменклатуры.Ссылка = ВТБезОтветсвенного.Группа.Ссылка}
{ГДЕ
(ВТВсе.Сотрудник = &СотрудникНаУвольнение)}
////////////////////////////////////////////////////////////////////////////////
Как сразу видим, при выборе таблицы используется метод РАЗЛИЧНЫЕ,
он потребовался, чтобы убрать повторения записей. Затем используется
конструкция:
ВЫБОР КОГДА<Условие с результатом типа
Булево>
ТОГДА<Результат в случае если
Истина>
ИНАЧЕ<Результат в случае если
Ложь>
КОНЕЦ
В запросах работает как ЕСЛИ. Она поможет нам формировать
обычный отчет первой части ТЗ, а при установке параметров реализовать 2 часть.
Важным нюансом тут было, что потребовался дополнительный параметр &ОтборНаУвольнение,
который помог включить в работу наше условие по &СотрудникНаУвольнение.
Также тут стоит упомянуть, что каждая колонка требует отдельной
конструкции ВЫБОР, а также после КОНЕЦ нужно
задать псевдоним (пример: КАК Сотрудник) и не забываем разделять
конструкции знаком ",".
После того как пользователь назначит параметру &ОтборНаУвольнение ИСТИНА
и назначит &СотрудникНаУвольнение сотрудника, наш отчет
выдаст вместо стандартного отбора по сотруднику отбор номенклатурной группы, но
с обратным эффектом. Будет выведена номенклатурная группы &СотрудникНаУвольнение и сотрудники, которые параллельно с ним назначены на те же
позиции, а если таких нету, то пустые поля!
Все задача успешна решена!
P.S. Отчет создан для решения конкретно поставленной задачи и выложен для ознакомления, а также конструктивной критики!