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

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

 

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

 

 

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

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

См. также

SALE! 20%

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

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

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

10000 8000 руб.

02.09.2020    122425    673    389    

716

Запрос 1С copilot

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

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

5 стартмани

15.01.2024    6301    31    mkalimulin    25    

50

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

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

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

28.12.2023    4836    mrXoxot    11    

99

Объектная модель запроса "Схема запроса" 2

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

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

06.12.2023    5399    user1923546    26    

43

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

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

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

08.11.2023    7073    ids79    25    

74

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

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

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

11.10.2023    16205    skovpin_sa    14    

98

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

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

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

1 стартмани

21.06.2023    5154    57    obmailok    35    

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