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

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 КАК Размер,
    ИСТИНА КАК Используется,
    ИСТИНА КАК ПересчетНеТребуется,
    ИСТИНА КАК ВторичнаяЗапись,
    ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация
ПОМЕСТИТЬ Представления_СрезПоследних_демоЛимитыФОТпоПериодам
ИЗ
    ВТОтборДляСрезаПоследних КАК ОтборДляСрезаПоследних
ГДЕ
    "ТолькоРазрешенные" = ИСТИНА
;

 

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

 

 

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

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

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

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

12000 руб.

02.09.2020    102328    568    385    

616

Ключи аналитик учета в ЕРП, КА, УТ

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

Разбираемся, зачем в системе ЕРП созданы справочники: ключи аналитик учета, зачем созданы аналогичные по набору измерений регистры сведений. Какие проблемы они решают, какие создают новые и что с этим делать.

08.11.2023    3884    ids79    21    

62

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    13732    skovpin_sa    14    

83

Нахождение уникальных наборов строк таблицы запросом

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

Решение задачи нахождения уникальных наборов строк таблицы запросом

23.07.2023    5131    tormozit    79    

39

Структура запроса

Инструментарий разработчика Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Абонемент ($m)

Обработка использует схему запроса и строит визуальную структуру источников данных в виде дерева. Пригодится при разборе прежде всего чужих, громоздких запросов и позволит быстро получить список источников данных. Единственное ограничение - текст запроса должен соответствовать метаданным текущей конфигурации.

1 стартмани

21.06.2023    4744    53    obmailok    35    

53

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    11084    Филин    37    

101

Работа с контактной информацией. Часть 1

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

Уверен, все в курсе, что контактная информация опять во всех конфигурациях хранится по-новому. Связано это с появлением так называемых муниципальных адресов, где районы заменили городские округа. Сейчас происходит массовый отказ от УПП и других устаревших решений, а также массовый переход с зарубежных систем. Возникает потребность преобразовать старые адреса в новые. И тут нас всех ждёт масса неприятных сюрпризов от разработчиков БСП. О программном интерфейсе контактной информации и пойдёт речь в данной статье.

23.05.2023    8286    biimmap    41    

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