При разработке собственных отчетов в 1С:ЗУП 3.1 часто возникает необходимость получить данные о плановых часах сотрудников. Хотя платформа предоставляет механизм представлений, таких как Представления_ПлановоеВремя, прямой запрос к ним через СКД не всегда возвращает ожидаемые данные. Рассмотрим подробнее, почему это происходит и как правильно использовать типовые механизмы конфигурации для решения этой задачи.
Автор столкнулся с ситуацией, когда в его отчете поле ЧасыПлан оставалось пустым, несмотря на то, что другой типовой отчет, использующий то же представление, успешно отображал данные. Это указывает на то, что представление само по себе является лишь "заготовкой" для запроса, а основная "магия" происходит на уровне кода модуля объекта отчета или общих модулей, которые "оживляют" эти представления, заполняя их реальными данными.
Механизм представлений в 1С:ЗУП 3.1 можно сравнить с API, который позволяет получить необходимые данные, не погружаясь в сложную структуру регистров конфигурации. Это обеспечивает стабильность кода при обновлениях, но требует правильной инициализации. В большинстве типовых отчетов, работающих с представлениями, используется специальный код, который заполняет временные таблицы или корректирует наборы данных СКД после их компоновки.
Рассмотрим, где может происходить такая инициализация. В типовых отчетах, использующих общие формы или общие источники данных, часто встречается вызов процедуры:
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
Эта процедура предназначена для инициализации общих источников данных отчета, что может включать в себя подготовку временных таблиц, на основе которых затем работают представления. Однако для специфических данных, таких как плановое время, этого может быть недостаточно, поскольку требуется более глубокая проработка логики.
Ключевую роль в "оживлении" представлений играют обработчики событий модуля объекта отчета, такие как ПриКомпоновкеРезультата. Именно здесь выполняется основная логика по получению и обработке данных перед их выводом в отчет. Если в вашем отчете это поле пусто, вероятно, отсутствует вызов соответствующей процедуры, которая заполняет данные для представления Представления_ПлановоеВремя.
Типовой отчет "СостояниеСотрудников" успешно отображает плановые часы, используя представление Представления_ПлановоеВремя. Проанализируем его структуру, чтобы понять, как он достигает такого результата. В модуле объекта этого отчета, в процедуре ПриКомпоновкеРезультата, мы можем обнаружить следующий код:
ПараметрыПолученияДанных = УчетРабочегоВремениРасширенный.ПараметрыПолученияПлановыхДанныхУчетаВремени;
ПараметрыПолученияДанных.ДатаНачала = "НачалоПериода";
ПараметрыПолученияДанных.ДатаОкончания = "ОкончаниеПериода";
УчетРабочегоВремениРасширенный.ПолученияДанныхУчетаВремениПослеКомпоновкиМакета(МакетКомпоновки.НаборыДанных.Данные, ПараметрыПолученияДанных);
Этот фрагмент кода является критически важным. Он демонстрирует, что для получения плановых данных учета времени используются методы общего модуля УчетРабочегоВремениРасширенный. Разберем по шагам, что здесь происходит:
УчетРабочегоВремениРасширенный. Эти параметры, как правило, содержат всю необходимую информацию для последующей обработки данных.ДатаНачала и ДатаОкончания. Важно передать именно те параметры, которые ожидаются механизмом, чтобы он мог правильно отфильтровать данные. В данном случае используются строковые имена полей, которые, вероятно, будут разрешены в параметры компоновки данных.ПолученияДанныхУчетаВремениПослеКомпоновкиМакета, которая принимает в качестве аргументов набор данных отчета (МакетКомпоновки.НаборыДанных.Данные) и подготовленные параметры. Эта процедура "встраивается" в процесс компоновки макета и, вероятно, модифицирует набор данных, заполняя его необходимыми плановыми часами, или же создает временные таблицы, которые затем используются представлением.Для вашего пользовательского отчета необходимо интегрировать аналогичный код в процедуру ПриКомпоновкеРезультата модуля объекта отчета. Этот подход обеспечивает максимальное использование типовых механизмов и стабильность работы после обновлений конфигурации.
Если вам требуется более гибкий контроль над получением плановых часов, или вы хотите использовать эти данные в собственном запросе, можно напрямую обращаться к процедурам общего модуля УчетРабочегоВремениРасширенный для создания временных таблиц. Это позволяет получить данные до их компоновки в СКД и использовать их в последующих запросах.
Одним из ключевых методов является УчетРабочегоВремениРасширенный.СоздатьВТПлановоеВремя. Эта процедура предназначена для формирования временной таблицы с плановыми часами. Давайте посмотрим на пример ее использования:
ПараметрыПолученияДанныхУчетаВремени = УчетРабочегоВремениРасширенный.ПараметрыДляСоздатьВТПлановоеВремяСотрудников;
ПараметрыПолученияДанныхУчетаВремени.ИмяВТСотрудники = "ВТСотрудникиМесяцы"; // Имя временной таблицы с сотрудниками и месяцами
// Если у вас нет ВТСотрудникиМесяцы, то вы можете сформировать ее до этого вызова:
// ВЫБРАТЬ
// Сотрудники.Ссылка КАК Сотрудник,
// ДОБАВИТЬКДАТЕ(&НачалоПериода, МЕСЯЦ, РАЗНОСТЬДАТ(&НачалоПериода, &ОкончаниеПериода, МЕСЯЦ)) КАК Месяц
// ПОМЕСТИТЬ ВТСотрудникиМесяцы
// ИЗ
// Справочник.Сотрудники КАК Сотрудники
// ГДЕ Сотрудники.Ссылка В (&СписокСотрудников);
// Установим остальные необходимые параметры
ПараметрыПолученияДанныхУчетаВремени.ДатаНачала = &НачалоПериода;
ПараметрыПолученияДанныхУчетаВремени.ДатаОкончания = &ОкончаниеПериода;
ПараметрыПолученияДанныхУчетаВремени.ДатаАктуальности = &ОкончаниеПериода; // Или другая дата актуальности
ПараметрыПолученияДанныхУчетаВремени.РассчитыватьНеполноеВремя = Истина; // Пример дополнительного параметра
УчетРабочегоВремениРасширенный.СоздатьВТПлановоеВремя(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыПолученияДанныхУчетаВремени);
После вызова этой процедуры, в менеджере временных таблиц (Запрос.МенеджерВременныхТаблиц) появится временная таблица ВТПлановоеВремя. Эта таблица будет содержать детальные данные о плановом времени по сотрудникам, датам и видам учета времени. Вы сможете затем использовать ее в вашем основном запросе СКД, как обычную временную таблицу.
Ключевые моменты при использовании СоздатьВТПлановоеВремя:
ПараметрыДляСоздатьВТПлановоеВремяСотрудников: Это структура, которая содержит все настройки для формирования временной таблицы. Важно правильно заполнить ее поля.ИмяВТСотрудники: Указывает имя временной таблицы, которая должна существовать в менеджере временных таблиц на момент вызова СоздатьВТПлановоеВремя. Эта таблица должна содержать список сотрудников и, возможно, месяцев, для которых необходимо получить плановое время. Если такой таблицы нет, вам потребуется создать ее перед вызовом процедуры.Запрос.МенеджерВременныхТаблиц: Указываем, в какой менеджер временных таблиц необходимо поместить созданную временную таблицу.Истина: Обычно указывает на необходимость получения данных (может быть параметром типа "использовать данные").Получив данные таким образом, вы можете модифицировать свой исходный запрос, чтобы он использовал эту уже заполненную временную таблицу ВТПлановоеВремя:
ВЫБРАТЬ
ВТПлановоеВремя.Сотрудник КАК Сотрудник,
ВТПлановоеВремя.Дата КАК Дата,
ВТПлановоеВремя.ВидУчетаВремени КАК ВидУчетаВремени,
ВТПлановоеВремя.ЧасыПлан КАК ЧасыПлан
ИЗ
ВТПлановоеВремя КАК ВТПлановоеВремя
// Можно добавить дополнительные условия или соединения
Этот метод предоставляет более явный и контролируемый способ получения плановых часов, позволяя разработчику точно знать, откуда берутся данные и как они формируются.
Для получения более полного набора данных, включающего не только плановое время, но и различные состояния сотрудников (отпуска, больничные, командировки) и их влияние на учет времени, модуль УчетРабочегоВремениРасширенный предлагает более мощную процедуру: СоздатьВТДанныеУчетаВремениИСостоянийСотрудников. Эта процедура фактически воспроизводит логику формирования данных, аналогичных Табелю Т-13, учитывая все отклонения и периоды отсутствий.
Рассмотрим пример вызова этой процедуры:
// Создадим временную таблицу с сотрудниками, для которых нужно получить данные
// Например, из основного набора данных отчета или справочника
// ВЫБРАТЬ Сотрудник.Ссылка КАК Сотрудник ПОМЕСТИТЬ ВТСотрудники ИЗ Справочник.Сотрудники КАК Сотрудник ГДЕ Сотрудник.ПометкаУдаления = ЛОЖЬ;
ПараметрыЗаполнения = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников;
ПараметрыЗаполнения.ИмяВТСотрудники = "ВТСотрудники"; // Имя временной таблицы с сотрудниками
ПараметрыЗаполнения.ИмяВТРезультат = "ВТУчетРабочегоВремениПолный"; // Имя результирующей временной таблицы
ПараметрыЗаполнения.РассчитыватьПлановоеВремя = Истина; // Обязательно для получения плановых часов
ПараметрыЗаполнения.ДатаАктуальности = НачалоМесяца(Запрос.Параметры.ПоследнийМесяцОкончание);
ПараметрыЗаполнения.ДатаНачала = Запрос.Параметры.НачалоРасчетногоПериода;
ПараметрыЗаполнения.ДатаОкончания = Запрос.Параметры.ПоследнийМесяцОкончание;
ПараметрыЗаполнения.МесяцДатаНачала = НачалоМесяца(Запрос.Параметры.НачалоРасчетногоПериода);
ПараметрыЗаполнения.МесяцДатаОкончания = НачалоМесяца(Запрос.Параметры.ПоследнийМесяцОкончание);
ПараметрыЗаполнения.ВыделятьВыходныеВПериодыОтклонений = Ложь; // Пример дополнительного параметра
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыЗаполнения);
Эта процедура является очень мощным инструментом, так как она создает целый ряд вспомогательных временных таблиц, в которых агрегируются данные из различных регистров конфигурации, касающихся учета рабочего времени и кадровых состояний. После выполнения этой процедуры в менеджере временных таблиц будут доступны следующие таблицы:
ВТПериодыДействияГрафиковДляКалендарейВТСоответствиеСостоянийВидамУчетаВремениВТДатыСостоянийВТПараметрыЗарегистрированныхДанныхУчетаВремениВТСотрудникСРассчитаннымиДаннымиВТПараметрыПолученияДанныхПоСотрудникамВТЗарегистрированныеВидыДанныхУчетаВремениВТИсточникиПолученияДанныхУчетаВремениВТДанныеРегистровУчетаВремениВТНормаВремениВТДанныеУчетаРабочегоВремениСотрудниковВТСостоянияСотрудниковВТНормаИтогиВТДанныеУчетаВремениПоСостояниямВТУчетРабочегоВремениПолныйОсновной интерес для нас представляет таблица ВТУчетРабочегоВремениПолный, которая будет содержать агрегированные данные, включая плановые часы, отработанное время, отклонения и другие показатели. Вы можете затем использовать эту таблицу в своем запросе для вывода в отчет.
Важные параметры при вызове СоздатьВТДанныеУчетаВремениИСостоянийСотрудников:
ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников: Основная структура параметров.ИмяВТСотрудники: Имя временной таблицы, содержащей список сотрудников, для которых нужно получить данные.ИмяВТРезультат: Имя результирующей временной таблицы, которая будет содержать итоговые данные.РассчитыватьПлановоеВремя = Истина: Флаг, который необходимо установить для того, чтобы процедура рассчитала и включила в результат плановое время.ДатаНачала, ДатаОкончания, МесяцДатаНачала, МесяцДатаОкончания, ДатаАктуальности критически важно для получения правильных данных за нужный период.Этот комплексный подход рекомендуется, если вам требуется не только плановое время, но и детализация по видам времени, состояниям сотрудников и другим аспектам учета рабочего времени, аналогично тому, как это представлено в Табеле Т-13.
Работа с механизмом представлений в 1С может быть нетривиальной из-за их "черного ящика". Когда вы используете представление в запросе СКД, платформа во время выполнения заменяет его на реальный запрос к регистрам с учетом бизнес-логики. Если представление не возвращает данных, это может быть связано с несколькими причинами:
Представления_ПлановоеВремя, является стандартным для шаблонов СКД. Однако, при фактической замене представления платформой, это подчеркивание может быть частью механизма, который определяет, как именно представление будет преобразовано. Важно, чтобы ваше обращение к временной таблице после ее создания совпадало с тем именем, которое в итоге будет использоваться.Для отладки таких запросов полезно использовать специальные инструменты. Например, существуют обработки-консоли запросов, которые поддерживают исполняемые представления. Они позволяют выполнить запрос к представлению и увидеть, во что оно трансформируется, а также какие данные возвращает. Если у вас есть доступ к ИТС, поищите статьи по отладке запросов с представлениями в ЗУП 3.1. Также можно создать временную обработку, в которой вы пошагово будете вызывать процедуры из УчетРабочегоВремениРасширенный, передавая Запрос.МенеджерВременныхТаблиц, и затем просматривать содержимое созданных временных таблиц через отладчик или через запросы к МенеджерВременныхТаблиц.ПолучитьТаблицу(). Для интерактивной проверки отчетов СКД с учетом представлений можно использовать консоль системы компоновки данных для работы с представлениями ЗУП 3.1.
Помимо специфики работы с представлениями, существуют общие рекомендации по написанию запросов в 1С:ЗУП, которые могут улучшить производительность и надежность ваших отчетов:
Сотрудники с необходимыми условиями. Например:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник
ПОМЕСТИТЬ ВТСотрудники
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
Сотрудники.Ссылка В (&СписокСотрудников); // Или другие условия отбора
Такой подход делает запрос более явным (особенно когда нужен срез последних записей) и позволяет легко управлять списком сотрудников.
ПОМЕСТИТЬ Представления_ПлановоеВремя, то и в последующих запросах к ней обращайтесь по тому же имени: ИЗ Представления_ПлановоеВремя КАК Представления_ПлановоеВремя. Хотя в контексте СКД и механизма представлений могут быть нюансы с автоматической заменой имен, при прямом использовании временных таблиц важно сохранять точное совпадение имен. Если же вы используете упомянутые процедуры из УчетРабочегоВремениРасширенный, то обращайтесь к тем временным таблицам, которые они создают (например, ВТПлановоеВремя или ВТУчетРабочегоВремениПолный).Итак, если ваш отчет не показывает плановые часы, скорее всего, проблема не в самом представлении Представления_ПлановоеВремя, а в отсутствии или некорректном вызове типовых процедур из общего модуля УчетРабочегоВремениРасширенный, которые отвечают за фактическое наполнение данных. Интегрируйте рекомендованные вызовы в модуль объекта вашего отчета, и вы сможете успешно получать плановые часы сотрудников. Если требуется готовое решение без самостоятельной разработки, можно воспользоваться отчетом по учету планового и фактически отработанного времени сотрудников.