Как программно получить график работы сотрудника в ЗУП 3.1 и исправить ошибку «Таблица не найдена» в запросе?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом Управленческий учет
← На главную

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

Причина ошибки «Таблица не найдена»

Проанализируем ситуацию: в ЗУП 3.1 большинство сложных запросов строятся на использовании временных таблиц (ВТ), которые подготавливаются программно перед выполнением основного запроса (это важно учитывать, если вы делаете перенос документов из ЗУП КОРП 2.5 в ЗУП КОРП 3). Таблица ВТГрафикРаботыСотрудниковПериоды не является физической таблицей в базе данных (это не справочник и не регистр). Это временный объект, который создается в оперативной памяти с помощью менеджера временных таблиц.

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

Способ 1. Получение ссылки на график через КадровыеДанныеСотрудников

Если наша задача — просто узнать, какой график назначен сотруднику на определенную дату (например, для последующего анализа его свойств), проще всего воспользоваться программным интерфейсом общего модуля КадровыйУчет, изучив предварительно справочник методов конфигурации Зарплата и кадры 3.1. Рассмотрим пример кода:


ТолькоРазрешенные = Истина;
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(ВыбранныйСотрудник);
ДатаПолученияДанных = ТекущаяДата();

// Формируем список полей, которые хотим получить
КадровыеДанные = "Сотрудник, ГрафикРаботы, Подразделение";

ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных);

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    ГрафикСсылка = СтрокаДанных.ГрафикРаботы;
    // Теперь у нас есть ссылка на справочник ГрафикиРаботыСотрудников
КонецЦикла;

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

Способ 2. Использование типового механизма подготовки временных таблиц

Если нам необходимо выполнить сложный запрос, использующий кадровые данные (включая графики) за период, следует использовать механизмы ЗУП для создания временных таблиц. Выясним, как это реализовать правильно с помощью МенеджераВременныхТаблиц.

Рассмотрим по шагам процесс подготовки данных:

  1. Создаем новый запрос и инициализируем МенеджерВременныхТаблиц.
  2. Используем метод ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды для формирования сетки дат.
  3. Вызываем КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников, которая наполнит менеджер нужными таблицами, включая те самые периоды и графики.

Пример реализации:


Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

// 1. Создаем таблицу периодов (дней) в указанном диапазоне
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды(Запрос.МенеджерВременныхТаблиц, ДатаНачала, ДатаОкончания, "ДЕНЬ", , "ВТПериоды", ИСТИНА);

// 2. Подготавливаем таблицу сотрудников, для которых нужны данные
Запрос.Текст = 
"ВЫБРАТЬ
|	Сотрудники.Ссылка КАК Сотрудник,
|	ВТПериоды.Период КАК Период
|ПОМЕСТИТЬ ВТСотрудникиДляЗапроса
|ИЗ
|	Справочник.Сотрудники КАК Сотрудники
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды
|		ПО (ИСТИНА)
|ГДЕ
|	Сотрудники.Ссылка = &Сотрудник";
Запрос.УстановитьПараметр("Сотрудник", ВыбранныйСотрудник);
Запрос.Выполнить();

// 3. Формируем ВТ с кадровыми данными через типовой описатель
Описатель = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(Запрос.МенеджерВременныхТаблиц, "ВТСотрудникиДляЗапроса");
Описатель.ИмяВТКадровыеДанныеСотрудников = "ВТКадровыеДанныеСотрудников";

// Указываем, какие данные нам нужны (например, ГрафикРаботы)
КадровыеДанные = "Сотрудник, ГрафикРаботы";
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(Описатель, ИСТИНА, КадровыеДанные);

// Теперь в Запрос.МенеджерВременныхТаблиц есть таблица ВТКадровыеДанныеСотрудников, 
// которую можно использовать в ваших дальнейших запросах.

Способ 3. Прямое обращение к регистрам сведений (Данные о часах)

Проанализируем ситуацию, когда нам нужно получить не просто «какой график у сотрудника», а конкретное количество часов и вид времени (явка, выходной, ночные) на конкретное число. Многие начинающие разработчики пытаются читать табличную часть ДанныеОРабочихЧасах в справочнике ГрафикиРаботыСотрудников. Это ошибка, так как там хранится только «шаблон» (цикл), а не реальный календарь.

Для получения реальных данных следует использовать следующие регистры:

  1. Регистр сведений ГрафикиРаботыПоВидамВремя: Здесь система хранит «развернутый» график (результат применения шаблона к календарю). Именно здесь можно увидеть, сколько часов «Явки» или «Ночных» запланировано на 15-е число месяца для конкретного графика.
  2. Регистр сведений ДанныеГрафиковРаботыСотрудников: Самый важный регистр для расчетов. В нем система объединяет основной график сотрудника и индивидуальные графики. Если сотруднику введен документ «Индивидуальный график», то в этом регистре данные будут браться именно из него.

Разберем пример запроса к регистру ГрафикиРаботыПоВидамВремени, чтобы определить выходные дни:


ВЫБРАТЬ
    Графики.Дата КАК Дата,
    Графики.ВидВремени КАК ВидВремени,
    Графики.ОсновноеЗначение КАК Часы
ИЗ
    РегистрСведений.ГрафикиРаботыПоВидамВремени КАК Графики
ГДЕ
    Графики.ГрафикРаботы = &ГрафикСсылка
    И Графики.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И Графики.ВидВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.Явка)

Важный нюанс: Если Часы равны 0 или записи на конкретную дату нет (для некоторых видов времени), значит, этот день является выходным по данному графику.

Практические рекомендации по работе с индивидуальными графиками

Если ваша задача — автоматизировать заполнение документа ИндивидуальныйГрафик (как упоминалось в обсуждении), придерживайтесь следующего алгоритма:

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

← На главную