При разработке в конфигурациях на базе 1С:Зарплата и управление персоналом 3.1 (ЗУП) программисты часто сталкиваются с задачей добавления унифицированных печатных форм (например, Т-9, Т-1, Т-8) в документы, которые изначально для этого не предназначались. Рассмотрим типичную ситуацию: мы пытаемся добавить команду печати приказа о направлении в командировку (Т-9) в документ ЗаявкаНаКомандировку. Казалось бы, достаточно скопировать код регистрации команды из модуля менеджера типового документа Командировка, но при попытке формирования формы система выдает критическую ошибку синтаксиса в запросе, содержащем фрагмент «КАК ДолжностьПоШтатномуРасписанию».
В данной статье мы проанализируем, почему возникает эта ошибка, как работает механизм печати в подсистеме ЗарплатаКадрыОтчеты и какими способами можно решить эту задачу.
Давайте разберем ситуацию. Ошибка Синтаксическая ошибка "КАК" <>>КАК ДолжностьПоШтатномуРасписанию возникает не в самом макете печатной формы, а в динамически формируемом тексте запроса. В ЗУП 3.1 печать кадровых приказов реализована через универсальный механизм. Процесс выглядит следующим образом:
Отчет.ПечатнаяФормаТ9).ЗарплатаКадрыОтчеты пытается программно «собрать» текст запроса для СКД (Схемы компоновки данных).Основная проблема заключается в том, что Отчет.ПечатнаяФормаТ9 внутри себя содержит жесткую привязку к документу Командировка. Когда мы передаем ему ссылку на ЗаявкаНаКомандировку, программный конструктор запроса не находит необходимых связей или реквизитов. В результате в итоговом тексте запроса перед ключевым словом КАК образуется пустота или лишняя запятая, что и приводит к синтаксической ошибке.
Проанализируем фрагмент типового кода, который обычно используется для добавления команды:
КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
КомандаПечати.МенеджерПечати = "Отчет.ПечатнаяФормаТ9";
КомандаПечати.Идентификатор = "ПФ_MXL_Т9";
КомандаПечати.Представление = НСтр("ru = 'Приказ о направлении в командировку (Т-9)'");
КомандаПечати.Порядок = 10;
Здесь в строке КомандаПечати.МенеджерПечати = "Отчет.ПечатнаяФормаТ9" кроется корень проблемы. Этот отчет настроен на работу с конкретными типами данных.
Если мы заглянем в стек вызовов, то увидим, что ошибка происходит в методе КомпоновщикМакета.Выполнить(). В этот момент 1С пытается скомпилировать схему компоновки данных с учетом настроек. Рассмотрим, как передаются параметры в этот метод:
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки, МакетОформления,
ТипГенератора, ПроверятьДоступностьПолей, ПараметрыФункциональныхОпций);
Посмотрим на содержимое переменной Схема. В ЗУП текст запроса в СКД часто формируется в процедуре ПриКомпоновкеРезультата модуля объекта отчета или в общих модулях подсистемы ЗарплатаКадрыОтчеты. Если документ ЗаявкаНаКомандировку не имеет тех же реквизитов, что и Командировка (например, ДатаНачала, ДатаОкончания, Сотрудник), или они называются иначе, конструктор выдаст некорректную строку.
Самый надежный способ решить проблему внутри конфигурации — это создать копию типового отчета ПечатнаяФормаТ9. Назовем его, например, ПечатнаяФормаТ9_Заявка. Пошагово разберем этот процесс:
Отчет.ПечатнаяФормаТ9 в свою конфигурацию (или расширение).Документ.Командировка на обращения к нашему документу Документ.ЗаявкаНаКомандировку.ДолжностьПоШтатномуРасписанию, корректно выбираются из связанных регистров (например, КадроваяИсторияСотрудников).ЗаявкаНаКомандировку изменим строку регистрации команды:
// Вместо типового отчета указываем наш новый объект
КомандаПечати.МенеджерПечати = "Отчет.ПечатнаяФормаТ9_Заявка";
Этот метод позволяет полностью контролировать логику сбора данных и избежать конфликтов с типовым кодом.
Если мы не хотим вносить значительные изменения в конфигурацию, рассмотрим вариант создания внешней печатной формы (ВПФ). Это наиболее гибкий подход, который часто выбирают опытные разработчики. Выясним преимущества этого способа:
Т-9 будет находиться в одном месте.При реализации ВПФ нам необходимо реализовать экспортную функцию СведенияОВнешнейОбработке() и процедуру Печать(). Внутри процедуры Печать мы можем либо написать свой запрос «с нуля», либо попытаться вызвать типовые механизмы, но уже с предварительно подготовленной таблицей значений.
Для продвинутых разработчиков существует вариант с перехватом управления в модуле менеджера. Мы можем подготовить данные в формате, который ожидает отчет ПечатнаяФормаТ9. Выясним, что именно ждет отчет. Как правило, это временная таблица ВТСсылкиНаДокумент, содержащая поля СсылкаНаОбъект, Период и Сотрудник.
Если мы программно сформируем такую таблицу и передадим её в параметры печати, то сможем «обмануть» типовой механизм. Однако, это требует глубокого понимания работы общего модуля ЗарплатаКадрыОтчеты и может быть трудозатратным при поддержке.
Обратим внимание на строку кода из примера автора темы:
КомандаПечати.ФункциональныеОпции = "ИспользоватьОплатуКомандировок,НеИспользоватьРасчетЗарплатыРасширенная";
Проанализируем этот момент. Если в вашей базе функциональная опция ИспользоватьОплатуКомандировок выключена, команда печати просто не появится в меню. Кроме того, функциональные опции могут влиять на состав доступных полей в СКД. Если ошибка КАК сохраняется, попробуйте временно очистить это свойство у команды печати, чтобы убедиться, что проблема не в скрытых полях.
Подведем итог: Ошибка КАК ДолжностьПоШтатномуРасписанию — это прямое следствие несовместимости структуры данных вашего документа и ожиданий типового отчета 1С. Для решения проблемы рекомендуется либо создать специализированный отчет в расширении, адаптированный под ваш документ, либо реализовать логику печати через внешнюю обработку.