Делаем свой интервальный регистр в ЗУП

09.09.22

Разработка - Механизмы типовых конфигураций

В статье, на примере реальной практической задачи попробуем снова погрузиться в одну из самых совершенных типовых конфигураций. Будем использовать механику интервальных регистров, правильно писать данные в такие регистры и правильно читать их.

Итак, заказчик захотел реализовать следующий управленческий механизм: вводить в ЗУП предельное значение ФОТ для каждой должности. Также необходим был отчет, который показывает динамику данного управленческого ФОТ. Для решения задачи был создан управленческий документ и регистр сведений. Документ задает размер предельного ФОТ, дату начала и дату окончания действия, то есть интервал. Естественно, один интервал мог накладываться на другой. Соответственно, нужно было или писать сразу интервалы в регистр, или динамически получать их в запросе. В ходе изучения механизмов ЗУП и опыта коллег, было найдено 2 варианта решения:

1. Писать в регистр размер лимита и дату начала действия. И затем, при построении отчетов в запросе строить интервалы. Ранее похожая задача уже решалась для конфигурации 1С:ЕРП, для ресурсных спецификаций. Суть задачи: найти промежутки времени, в которые у готовой продукции не было действующей спецификации. Ресурсная спецификация в 1С:ЕРП имеет дату начала действия и дату окончания действия, которые хранятся в регистре. Решение поставленной задачи для ресурсных спецификаций было сначала реализовано классическим способом, однако, с ростом разнообразия готовой продукции и полуфабрикатов, время выполнения такого запроса начинало увеличиваться нелинейно. Отчет был переписан на ином принципе, очередное спасибо за это замечательному генератору нестандартных решений под ником ildarovich (крайне рекомендую его статьи к прочтению), и его статье Быстрое определение интервалов в запросе. Описываемый отчет для 1С:ЕРП не тема данной статьи, скажу лишь, что сам запрос по методу Ильдаровича вышел на 900 строк, но работал крайне шустро. Как вариант решения текущей задачи, можно было писать как есть в регистр дату начала и дату окончания действия лимита в нужных разрезах, а интервалы получать в запросе по методу Ильдаровича.

2. При проведении документа сразу вычислять и писать интервалы. И конфигурация ЗУП уже имеет такие механизмы. Ничего изобретать не нужно.

Итак, какой же способ решения выбрать?

Опыт применения способа 1 показал следующее. Если редко делать подобные задачи, то приемы и способы забываются, и открыв свою же доработку спустя полгода требуется время вспомнить, как и зачем это было сделано. Для сравнения, аналогичные ситуации могут возникнуть и при использовании такого механизма платформы, как СхемаЗапроса.  Поскольку СхемаЗапроса применяется редко, через некоторое время в своих же доработках на её основе трудно уже разобраться. А вот СтрЗаменить въедается на клеточном уровне.. Соответственно, коллега по цеху за СхемаЗапроса скорее всего не придет в восторг... А от СтрЗаменить наверняка не испытает дискомфорта... Способы маэстро Ильдаровича восхититительны, но пожалеем коллег, которым, возможно, придется поддерживать наш код, и применим способ 2.

Попробуем посмотреть, как устроены интервальные регистры. За основу возьмем типовой регистр ПлановыеНачисления. Он наиболее подходит по смыслу. С регистром сведений ПлановыеНачисления идет в связке вспомогательный регистр ПлановыеНачисленияИнтервальный. Вспомогательный интервальный регистр должен называться так ИмяОсновногоРегистра + Интервальный. Повторим структуру ПлановыхНачислений для нашего регистра:

 

         

Основной регистр периодический и подчиненный регистратору. Вспомогательный интервальный независимый и непериодический. Запись в интервальный регистр происходит в событии набора записей ПриЗаписи.. Переносим процедуры из "Эталонного" регистра ПлановыеНачисления в наш регистр:

 

       
        

Функцию модуля набора записей ТаблицаИзменившихсяДанныхНабора() так же переносим, она нужна в процессе работы функции ЗарплатаКадрыПериодическиеРегистры.СформироватьДвиженияИнтервальногоРегистраПоИзменениям(
            "ИмяОсновногоРегистра", НаборЗаписейОсновнннногоРегистра).

Обязательно переносим функции модуля менеджера:

 

        

Основное измерение у нас будет не сотрудник, как в большинстве других регистров в ЗУП, а Должность.

Можно отметить, что механизм интервальных регистров имеет программный интерфейс, к которому мы легко подключились, немного исследовав наиболее подходящий под нашу задачу штатный регистр. Реализован он в общем модуле ЗарплатаИКадрыПериодическиеРегистры.

 

 

К сожалению, четкого описания программного интерфейса интервальных регистров нет, и приходится подключаться методом научного тыка.

В итоге механизм готов. Пробуем ввести данные:
       

 

Вот так, достаточно просто, штатными средствами ЗУП получили свои интервалы.

Теперь нужно прочитать их запросом. И тут не будем писать свой запрос, воспользуемся предложенными ЗУП способами. Ранее я попытался описать их  здесь  и здесьОбработка поможет, подскажет, как составить запрос-пустышку к собственному интервальному регистру:

 

 

ВЫБРАТЬ
    ДАТАВРЕМЯ(1, 1, 1) КАК Период
ПОМЕСТИТЬ Представления_Периоды_МесяцыОтчета
ГДЕ
    "НачалоИнтервала" = &НачалоПериода
    И "ОкончаниеИнтервала" = &КонецПериода
    И "Периодичность" = "МЕСЯЦ"
    И "ИспользоватьКонецПериода" = ЛОЖЬ
;

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Представления_Периоды.Период КАК Период,
    ШР.Ссылка КАК ДолжностьПоШтатномуРасписанию,
    ШР.Подразделение КАК Подразделение,
    Организации.Ссылка КАК Организация
ПОМЕСТИТЬ ВТОтборДляСрезаПоследних
ИЗ
    Справочник.ШтатноеРасписание КАК ШР
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организации
        ПО ШР.Владелец = Организации.Ссылка,
    Представления_Периоды_МесяцыОтчета КАК Представления_Периоды
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДАТАВРЕМЯ(1, 1, 1) КАК Период,
    ДАТАВРЕМЯ(1, 1, 1) КАК ПериодЗаписи,
    ДАТАВРЕМЯ(1, 1, 1) КАК ПериодВозвратногоСобытия,
    ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение,
    ЗНАЧЕНИЕ(Справочник.ШтатноеРасписание.ПустаяСсылка) КАК ДолжностьПоШтатномуРасписанию,
    ЗНАЧЕНИЕ(Документ.демо_ЛимитыПлановыхНачислений.ПустаяСсылка) КАК ДокументОснование,
    0 КАК Размер,
    ИСТИНА КАК Используется,
    ИСТИНА КАК ПересчетНеТребуется,
    ИСТИНА КАК ВторичнаяЗапись,
    ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация
ПОМЕСТИТЬ Представления_СрезПоследних_демоЛимитыФОТпоПериодам
ИЗ
    ВТОтборДляСрезаПоследних КАК ОтборДляСрезаПоследних
ГДЕ
    "ТолькоРазрешенные" = ИСТИНА
;

 

Теперь если поместить этот запрос в отчет, как это описано здесь, можно легко получить вот такой результат:

 

 

Демо пример описанного в статье механизма можно посмотреть в исходниках расширения вот здесь. Параллельно с изучением механизмов ЗУП поддержим отечественный облачный сервис для хранения репозиториев исходного кода.

ЗУП Интервальные регистры Интервалы в запросе

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    153288    838    398    

846

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    3283    XilDen    34    

59

Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Статистическая выборка сценариев и точек изменения отчетов на общей форме ФормаОтчета в типовых конфигурациях. Примеры кода.

03.06.2024    4262    Serg2000mr    32    

105

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    7447    implecs_team    6    

46

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    3906    YA_418728146    11    

53

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Бесплатно (free)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    9603    125    mkalimulin    32    

60

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист Стажер Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    6171    mrXoxot    11    

109

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    6498    user1923546    29    

50
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. biimmap 2006 09.09.22 08:02 Сейчас в теме
Решение понятное, тоже использовал этот подход. Единственное есть подозрение, что в Вашей задаче измерения Подразделение и Организация не нужны. Информация храниться по позициям штатного расписания.
2. JohnyDeath 302 09.09.22 09:17 Сейчас в теме
(1) измерения по Организации нужны как минимум для RLS, поэтому его выкидывать не стоит
4. aShumakoff 152 09.09.22 15:39 Сейчас в теме
(1)Для опытного ЗУПера, как вы, решение, без сомнения, очевидное. Статья, конечно же, больше как шпаргалка.
Возможно подразделение и организация, избыточные реквизиты. Но при всём моем восхищении разрабами зуп и желании им подражать, точки подключения к интерфейсам описаны недостаточно подробно. Приходится многое щупать, набирая шишки. Возможно где-то внутри программного интерфейса интервальных регистров без этих изменений не взлетит, как например, без измерения год, и период предыдущей записи, если я правильно помню. А исследовать времени не было, описания структуры регистров тоже нет...Или я не нашел. Если вы знаете где это подсмотреть, буду крайне благодарен.
Ну и плюс эксперты по производительности крайне советуют для последующего получения данных из регистров проектировать его так, чтобы попасть в индекс.. А отбор по организации и подразделению, по личному опыту, присутствует в каждом первом отчёте
3. aShumakoff 152 09.09.22 15:38 Сейчас в теме
Для опытного ЗУПера, как вы, решение, без сомнения, очевидное. Статья, конечно же, больше как шпаргалка.
Возможно подразделение и организация, избыточные реквизиты. Но при всём моем восхищении разрабами зуп и желании им подражать, точки подключения к интерфейсам описаны недостаточно подробно. Приходится многое щупать, набирая шишки. Возможно где-то внутри программного интерфейса интервальных регистров без этих изменений не взлетит, как например, без измерения год, и период предыдущей записи, если я правильно помню. А исследовать времени не было, описания структуры регистров тоже нет...Или я не нашел. Если вы знаете где это подсмотреть, буду крайне благодарен.
Ну и плюс эксперты по производительности крайне советуют для последующего получения данных из регистров проектировать его так, чтобы попасть в индекс.. А отбор по организации и подразделению, по личному опыту, присутствует в каждом первом отчёте
nance; biimmap; +2 Ответить
Оставьте свое сообщение