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