В этой статье расскажу, как влияет парадигма технологической платформы на процесс реализации прикладных решений по автоматизации учета предприятия на примере появления и реализации новых механизмов хранения и обработки информации, таких как интервальные регистры в «1С:ЗУП».
Задачи хранения информации
При разработке решения в сфере автоматизации необходимо решить задачи хранения информации: для чего предназначена хранимая информация, какова ее структура и как достигается оптимальное соотношение таких показателей обработки информации, как обрабатываемый объем, надежность операций с данными, функциональность и быстродействие методов обработки информации.
Взаимосвязь и противоречия между требованиями к хранению информации наглядно можно представить, используя образ в виде диаграммы на рис.1:

Рис.1 Противоречия требований к хранению информации
Актуальные возможности по удовлетворению требований к хранению информации иллюстрируются замкнутой кривой фиксированной длины, которая не способна растягиваться. Попытка реализовать большой объем требования означает необходимость увеличить соответствующий показатель диаграммы, например, функциональность. Это приводит к тому, что другие показатели уменьшаются.
Компанией «1С» предлагается объектно-реляционная парадигма системы «1С:Предприятие», которая дает реализацию представления и манипулирования данными объектов, отражающими прикладные сущности, обеспечивая должную надежность и эффективность обработки больших объемов информации этих объектов в базе данных. Указанная технология представления и обработки информации освобождает разработчика от решения задач эффективного хранения информации и ее обработки: всю эту работу осуществляет платформа. Она позволяет разработчику сосредоточиться на выборе нужного объекта конфигурации, приспособив его функциональность для реализации нужного поведения создаваемого решения.
В данной работе нас интересуют предоставляемые платформой возможности хранения и эффективные способы обработки информации, имеющей привязку ко времени и выбираемые пути их совершенствования и развития. Задачи по обработке периодической информации часто возникают при комплексной автоматизации кадрового учета, расчета заработной платы, начисления налогов и управления персоналом, а также и других сфер деятельности. Методика решения большого класса таких задач автоматизации предполагает использование механизма периодических регистров сведений, значительную часть функциональности которого поддерживает сама платформа. Центральным местом функциональности периодических регистров сведений являются различные варианты получения «итогов» хранимой информации на определенную дату во времени.
Модельный пример
Рассмотрим пример хранения и обработки информации, привязанной во времени в конфигурации 1С. Пусть нужно хранить некоторую кадровую информацию по сотрудникам предприятия. В качестве простой модели и для объяснения способов обработки таких сведений, предположим, необходимо хранить информацию о подразделениях, в которых работал или работает сотрудник на предприятии. Для этих целей воспользуемся простым периодическим регистром сведений, см. рис.2:

Рис. 2. Структура модельного регистра сведений «КадроваяИстория»
Регистр периодический, значит, присутствует стандартный реквизит-измерение «Период» типа Дата. Пусть регистр подчинен регистратору – документу «ПеремещениеВПодразделение», назначение которого создавать запись в регистре сведений «КадроваяИстория», следовательно, в регистре присутствует стандартный реквизит-измерение «Регистратор». Измерение «Сотрудник» и ресурс «Подразделение» имеют тип ссылки на справочники «Сотрудники» и «Подразделения» соответственно. У справочника «Сотрудники» есть реквизит «ДатаРождения» типа Дата.
Тогда получить информацию из нашего модельного регистра на определенный момент времени можно следующими методами, предлагаемыми платформой:
Задача 1. В каком подразделении работал Сотрудник на ВыбраннуюДату?
КадроваяИстория = РегистрыСведений.КадроваяИстория;
СотрудникОтбор = Новый Структура("Сотрудник", Сотрудник);
СтруктураЗаписи = КадроваяИстория.Получить(
ВыбраннаяДата, СотрудникОтбор);
Если Не ЗначениеЗаполнено(СтруктураЗаписи.Подразделение) Тогда
ТекстСообщения = "Подразделение точно на эту дату не указано!";
Иначе
ТекстСообщения = СтрШаблон(
"Сотрудник: %1, Подразделение: %2",
СтруктураЗаписи.Сотрудник,
СтруктураЗаписи.Подразделение);
КонецЕсли;
Сообщить(ТекстСообщения);
Задача 2. Актуальное подразделение Сотрудника на ВыбраннуюДату
КадроваяИстория = РегистрыСведений.КадроваяИстория;
СотрудникОтбор = Новый Структура("Сотрудник", Сотрудник);
СтруктураЗаписи = КадроваяИстория.ПолучитьПоследнее(
ВыбраннаяДата, СотрудникОтбор);
ТекстСообщения = СтрШаблон("Текущее подразделение сотрудника: %1",
СтруктураЗаписи.Подразделение);
Сообщить(ТекстСообщения);
Задача 3.Актуальные подразделения всех сотрудников на ВыбраннуюДату
КадроваяИстория = РегистрыСведений.КадроваяИстория;
ТаблицаСреза = КадроваяИстория.СрезПоследних(ВыбраннаяДата);
Для Каждого СтрокаТаблицы Из ТаблицаСреза Цикл
ТекстСообщения = СтрШаблон(
"Сотрудник: %1, Подразделение: %2",
СтрокаТаблицы.Сотрудник,
СтрокаТаблицы.Подразделение);
Сообщить(ТекстСообщения);
КонецЦикла;
Для получения информации регистра на языке запросов используется виртуальная таблица среза последних/первых записей регистра сведений.
Задача 1. Выбрать все записи регистра
ВЫБРАТЬ * ИЗ РегистрСведений.КадроваяИстория КАК КадроваяИстория
Задача 2. Выбрать текущее подразделение Сотрудника на ВыбраннуюДату
ВЫБРАТЬ Сотрудник, Подразделение
ИЗ РегистрСведений.КадроваяИстория.СрезПоследних(
&ВыбаннаяДата, Сотрудник = &Сотрудник)
Задача 3.Выбрать текущие подразделения всех сотрудников на ВыбраннуюДату
ВЫБРАТЬ Сотрудник, Подразделение
ИЗ РегистрСведений.КадроваяИстория.СрезПоследних(&ВыбаннаяДата)
Примеры приведены в демонстрационных целях. Главное здесь – то, что разработчику не нужно задумываться об оптимальной, с точки зрения быстродействия и ресурсов компьютера, реализации методов объектов и конструкций запроса. Это делает платформа с учетом возможностей оборудования и используемой системы управления базой данных.
Срез последних на каждую дату
Как показывает практика, при автоматизации учета информации с привязкой ко времени стандартных механизмов платформы 1С для реализации решений в этой сфере недостаточно. Это понимается как отсутствие методов встроенного языка и механизмов языка запросов, которые специально предназначены для получения информации из периодических регистров сведений при решении широкого класса задач. Это значит, разработчику приходится «погружаться» на более низкий уровень реализации и озадачиться изобретением способов получения нужных данных, используя имеющиеся средства платформы. Если рассуждать в терминах диаграммы противоречий на рисунке 1, надо увеличить функциональность, но при этом стараться не ухудшить другие показатели, делать то, что в случае задач других классов реализует платформа. Если мы говорим про специфическую задачу, такая ситуация оправдана. Но класс задач, о котором идет речь, часто встречается на практике под названием «получение среза на каждую дату». Настолько часто, что эта задача позиционируется теперь как учебная и предлагается для испытания соискателям на должность 1С программиста. Поясним на нашем модельном примере.
Задача. Для каждого сотрудника выбрать подразделение, в котором он работал на годовщину своего рождения в указанном календарном годе.
Метод встроенного языка ПолучитьПоследнее в принципе решает поставленную задачу, но результат не соответствует системе стандартов и методик разработки для «1С:Предприятие-8», так как придется организовывать запросы в цикле, а метод СрезПоследних в принципе не применим. Виртуальная таблица СрезПоследних языка запросов также не решает задачи.
Механизм получения среза последних на каждую дату можно реализовать на языке запросов. В интернете можно найти разные варианты решения задачи, предлагавшиеся различными авторами. По результатам исследования таких решений выделяются варианты с лучшей производительностью, известные как «классический» и «интервальный». Проиллюстрируем их на модельном примере.
«Классический» вариант.
//1. Определяем годовщину дня рождения для выбранной даты года
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
ДОБАВИТЬКДАТЕ(
Сотрудники.ДатаРождения,
ГОД,
РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ДатаГода, ГОД)) КАК Период
ПОМЕСТИТЬ ВТ_Периоды
ИЗ
Справочник.Сотрудники КАК Сотрудники
;
/////////////////////////////////////////////////////////////////////
//2. Определяем дату последней смены подразделения сотрудника
ВЫБРАТЬ
КадроваяИстория.Сотрудник КАК Сотрудник,
МАКСИМУМ(ВТ_Периоды.Период) КАК Период
ПОМЕСТИТЬ ВТ_ГраницыПериодов
ИЗ
РегистрСведений.КадроваяИстория КАК КадроваяИстория
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Периоды КАК ВТ_Периоды
ПО КадроваяИстория.Период <= ВТ_Периоды.Период
СГРУППИРОВАТЬ ПО
КадроваяИстория.Сотрудник
;
/////////////////////////////////////////////////////////////////////
//3. Текущее подразделение сотрудника на годовщину дня рождения
ВЫБРАТЬ
КадроваяИстория.Сотрудник КАК Сотрудник,
КадроваяИстория.Подразделение КАК Подразделение
ИЗ
РегистрСведений.КадроваяИстория КАК КадроваяИстория
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ГраницыПериодов КАК ВТ_ГраницыПериодов
ПО КадроваяИстория.Сотрудник = ВТ_ГраницыПериодов.Сотрудник
И КадроваяИстория.Период = ВТ_ГраницыПериодов.Период
«Интервальный» вариант. Параметры запроса типа Дата связаны соотношением
&НачалоПериода <= &ДатаГода <= &КонецПериода
///////////////////////////////////////////////////////////////////////
//1. Выбрать по сотрудникам периоды смены подразделения в пределах года
ВЫБРАТЬ
КадроваяИстория.Период КАК Период,
КадроваяИстория.Сотрудник КАК Сотрудник,
КадроваяИстория.Подразделение КАК Подразделение
ПОМЕСТИТЬ ВТ_Периоды
ИЗ
РегистрСведений.КадроваяИстория КАК КадроваяИстория
ГДЕ
КадроваяИстория.Период > &НачалоПериода
И КадроваяИстория.Период <= &КонецПериода
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
СрезИстории.Период,
СрезИстории.Сотрудник,
СрезИстории.Подразделение
ИЗ
РегистрСведений.КадроваяИстория.СрезПоследних(&НачалоПериода) КАК СрезИстории
;
/////////////////////////////////////////////////////////////////////
//2. Выбрать по сотрудникам интервалы работы в данном подразделении
ВЫБРАТЬ
НачалоПериода.Сотрудник КАК Сотрудник,
НачалоПериода.Подразделение КАК Подразделение,
НачалоПериода.Период КАК НачалоПериода,
ЕСТЬNULL(ДОБАВИТЬКДАТЕ(
МИНИМУМ(КонецПериода.Период), СЕКУНДА, -1),
&КонецПериода) КАК КонецПериода
ПОМЕСТИТЬ ВТ_ПериодыДействия
ИЗ
ВТ_Периоды КАК НачалоПериода,
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Периоды КАК КонецПериода
ПО НачалоПериода.Сотрудник= КонецПериода.Сотрудник
И НачалоПериода.Период < КонецПериода.Период
СГРУППИРОВАТЬ ПО
НачалоПериода.Период,
НачалоПериода.Сотрудник,
НачалоПериода.Подразделение
;
/////////////////////////////////////////////////////////////////////
//2. Выбрать текущее подразделение сотрудника на годовщину дня рождения
ВЫБРАТЬ
Сотрудники.Ссылка КАК Ссылка,
ПериодыДействия.Подразделение КАК Подразделение
ИЗ
Справочник.Сотрудники КАК Сотрудники
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПериодыДействия КАК ПериодыДействия
ПО Сотрудники.Ссылка = ПериодыДействия.Сотрудник
И (ДОБАВИТЬКДАТЕ(Сотрудники.ДатаРождения, ГОД,
РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ДатаГода, ГОД))
МЕЖДУ ПериодыДействия.НачалоПериода И ПериодыДействия.КонецПериода)
Интервальные регистры в «1С: ЗУП»
Изучая «интервальный» вариант решения задачи среза последних на каждую дату, можно заметить, что первые два запроса не связаны с условиями постановки задачи. Назначение этих запросов – подготовка промежуточных данных в виде временной таблицы, в которой определяются интервалы времени, на протяжении которых в записях регистра используется конкретное значение ресурса. Имея такую таблицу, назовем ее интервальной таблицей значений ресурса, можно одним запросом организовать получение среза последних на каждую дату. При этом этап получения интервальной таблицы значений ресурса очень легко оформить как шаблон.
«Интервальный» способ решения известной задачи привел к внедрению в типовой конфигурации «1С:ЗУП» механизма интервальных регистров. Идея механизма в том, чтобы хранить интервальную таблицу значений ресурса регистра сведений в записях вспомогательного регистра сведений, обновляемых при изменении записей исходного регистра сведений.
На примере модельного регистра сведений «КадроваяИстория» кратко опишем подключение этого регистра к интервальному механизму в конфигурации «1С:ЗУП». Можно посмотреть описания механизма и особенности его использования у других авторов подобных материалов.
В пару к основному периодическому регистру «КадроваяИстория», подчиненного регистратору, создается вспомогательный непериодический и независимый регистр сведений «КадроваяИсторияИнтервальный», имеющий такие же непериодические измерения и те же ресурсы, что и основной регистр (см. рис.3):

Рис. 3. Структура регистра сведений «КадроваяИсторияИнтервальный»
Видно, что в качестве измерений добавляются служебные реквизиты, определяющие интервал используемого значения ресурса: ДатаНачала, ДатаОкончания, ПериодЗаписи и Год (все типа Дата). Запись во вспомогательный регистр «КадроваяИсторияИнтервальный» происходит в обработчике события ПриЗаписи набора записей основного регистра.

В модуле менеджера вспомогательного регистра сведений «КадроваяИсторияИнтервальный» описываются процедуры и функции механизма

Теперь можно пользоваться «интервальным» вариантом решения задачи получения среза последних на каждую дату, не уступающему по производительности «классическому» варианту.
Механизм интервальных регистров как новая функциональность регистра сведений на уровне платформы
История появления нового механизма по хранению и обработке информации в рамках выбранной парадигмы примечательна. На практике было обнаружено, что имеется широкий класс задач получения среза последних, для решения которых в парадигме системы «1С:Предприятие» разработчикам приходилось изобретать способы, приспосабливая текущую функциональность платформы. Ответом на запрос о механизме решения таких задач явилась реализация одного из способов решения в виде специального фреймворка в типовой конфигурации «1С:ЗУП» без расширения функциональности периодических регистров на уровне платформы.
Хотя задачи получения среза последних на каждую дату возникают не только в сфере автоматизации учета зарплаты и кадров, но и, например, в управлении торговлей, оперативном учете и др. Значит, решение использовать «интервальный» вариант решения в других сферах автоматизации задач повлечет за собой перенос фреймворка из одной типовой конфигурации в другую. Наличие широкого класса задач, которые приходится решать в разных сферах деятельности предприятия, логически подводит если не к необходимости, то к практической востребованности реализации механизма интервальных регистров на уровне платформы в виде методов встроенного языка и виртуальных таблиц языка запроса, по аналогии с методом и виртуальной таблицей СрезПоследних периодического регистра сведений.
Словарь иностранных слов к статье «Механизм интервальных регистров в 1С»
| Иностранное слово / термин | Язык-источник | Толкование на русском языке |
|---|---|---|
| Виртуальная таблица | лат. virtualis — возможный, воображаемый | Таблица в языке запросов, которая физически не хранится в базе данных, а формируется платформой на лету по запросу (например, «Срез последних»). |
| Интервальный регистр | лат. intervallum — промежуток, расстояние | Регистр сведений, в котором для каждого значения ресурса явно хранятся даты начала и окончания его действия (вместо точечных записей «Период»). |
| Конфигурация | лат. configuratio — взаиморасположение, построение | Прикладное решение в системе «1С:Предприятие» — совокупность метаданных, форм, модулей, настроек, определяющая поведение программы. |
| Механизм (программный) | греч. μηχανή — орудие, приспособление | Способ организации обработки данных, реализованный в виде согласованной работы объектов, процедур и функций платформы. |
| Менеджер (регистра сведений) | англ. manager — управляющий, распорядитель | Объект встроенного языка, через который выполняются операции с регистром (чтение, запись, получение срезов и т.д.). |
| Метод (встроенного языка) | греч. μέθοδος — путь исследования, способ | Процедура или функция, принадлежащая конкретному объекту платформы (например, «ПолучитьПоследнее» у регистра сведений). |
| Модуль (программный) | лат. modulus — малая мера, образец | Текст программы на встроенном языке 1С, который компилируется и выполняется как единое целое (модуль объекта, модуль менеджера и др.). |
| Объектно-реляционная парадигма | лат. objectum — предмет + relatio — отношение + греч. παράδειγμα — пример, образец | Способ организации данных, сочетающий объектное представление (сущности предметной области) и реляционное хранение (в таблицах базы данных). |
| Парадигма (программирования) | греч. παράδειγμα | Совокупность принципов, понятий и методов, определяющих стиль разработки программного обеспечения. |
| Платформа (1С:Предприятие) | фр. plateforme — плоская площадка, основа | Программная среда исполнения, которая обеспечивает работу конфигураций и управляет хранением данных, запросами, интерфейсом. |
| Процедура | лат. procedura — порядок следования, ведение | Блок кода на встроенном языке, который выполняет последовательность действий, но не возвращает значения. |
| Регистр сведений | лат. registrum — список, перечень | Объект метаданных 1С для хранения информации в разрезе измерений (аналитик) и ресурсов (данных), в том числе с привязкой ко времени. |
| Регистратор | лат. registrar — записывающий, отмечающий | Документ или иной объект, который создаёт (регистрирует) запись в регистре сведений, связывая её с первичным документом. |
| Реквизит (объекта метаданных) | лат. requisitum — необходимое, требуемое | Предопределённый элемент данных, входящий в состав объекта конфигурации (например, «ДатаРождения» справочника «Сотрудники»). |
| Ресурс (регистра) | фр. ressource — запас, средство | Данные регистра, по которым обычно подводятся итоги (например, «Подразделение» в модельном примере). |
| Структура (данных) | лат. structura — строение, порядок | Составной тип данных в 1С, объединяющий несколько полей с разными типами под одним именем. |
| Фреймворк | англ. framework — каркас, несущая конструкция | Готовая программная библиотека или набор согласованных классов и шаблонов, предназначенный для решения типовых задач (в статье — механизм интервальных регистров в ЗУП). |
| Функция (встроенного языка) | лат. functio — исполнение, совершение | Блок кода, который возвращает конкретное значение (число, строку, ссылку и т.п.) в место своего вызова. |
| Шаблон (программный) | нем. Schablone — образец, трафарет | Многократно используемая заготовка кода или запроса; в статье — возможность оформить получение интервальной таблицы как шаблон запроса. |
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!