Как исправить ошибку синтаксиса КАК при добавлении печатной формы Т-9 в меню печать

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

При разработке в конфигурациях на базе 1С:Зарплата и управление персоналом 3.1 (ЗУП) программисты часто сталкиваются с задачей добавления унифицированных печатных форм (например, Т-9, Т-1, Т-8) в документы, которые изначально для этого не предназначались. Рассмотрим типичную ситуацию: мы пытаемся добавить команду печати приказа о направлении в командировку (Т-9) в документ ЗаявкаНаКомандировку. Казалось бы, достаточно скопировать код регистрации команды из модуля менеджера типового документа Командировка, но при попытке формирования формы система выдает критическую ошибку синтаксиса в запросе, содержащем фрагмент «КАК ДолжностьПоШтатномуРасписанию».

В данной статье мы проанализируем, почему возникает эта ошибка, как работает механизм печати в подсистеме ЗарплатаКадрыОтчеты и какими способами можно решить эту задачу.

Анализируем причину возникновения ошибки

Давайте разберем ситуацию. Ошибка Синтаксическая ошибка "КАК" <>КАК ДолжностьПоШтатномуРасписанию возникает не в самом макете печатной формы, а в динамически формируемом тексте запроса. В ЗУП 3.1 печать кадровых приказов реализована через универсальный механизм. Процесс выглядит следующим образом:

  1. Вызывается менеджер печати (в нашем случае это Отчет.ПечатнаяФормаТ9).
  2. Общий модуль ЗарплатаКадрыОтчеты пытается программно «собрать» текст запроса для СКД (Схемы компоновки данных).
  3. Система обращается к метаданным документа-источника, чтобы сопоставить его поля с полями, требуемыми для формы Т-9.

Основная проблема заключается в том, что Отчет.ПечатнаяФормаТ9 внутри себя содержит жесткую привязку к документу Командировка. Когда мы передаем ему ссылку на ЗаявкаНаКомандировку, программный конструктор запроса не находит необходимых связей или реквизитов. В результате в итоговом тексте запроса перед ключевым словом КАК образуется пустота или лишняя запятая, что и приводит к синтаксической ошибке.

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


КомандаПечати = КомандыПечати.Добавить();
КомандаПечати.Обработчик = "УправлениеПечатьюБЗККлиент.ВыполнитьКомандуПечати";
КомандаПечати.МенеджерПечати = "Отчет.ПечатнаяФормаТ9";
КомандаПечати.Идентификатор = "ПФ_MXL_Т9";
КомандаПечати.Представление = НСтр("ru = 'Приказ о направлении в командировку (Т-9)'");
КомандаПечати.Порядок = 10;

Здесь в строке КомандаПечати.МенеджерПечати = "Отчет.ПечатнаяФормаТ9" кроется корень проблемы. Этот отчет настроен на работу с конкретными типами данных.

Разбор работы компоновщика макета

Если мы заглянем в стек вызовов, то увидим, что ошибка происходит в методе КомпоновщикМакета.Выполнить(). В этот момент 1С пытается скомпилировать схему компоновки данных с учетом настроек. Рассмотрим, как передаются параметры в этот метод:


МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки, МакетОформления,
    ТипГенератора, ПроверятьДоступностьПолей, ПараметрыФункциональныхОпций);

Посмотрим на содержимое переменной Схема. В ЗУП текст запроса в СКД часто формируется в процедуре ПриКомпоновкеРезультата модуля объекта отчета или в общих модулях подсистемы ЗарплатаКадрыОтчеты. Если документ ЗаявкаНаКомандировку не имеет тех же реквизитов, что и Командировка (например, ДатаНачала, ДатаОкончания, Сотрудник), или они называются иначе, конструктор выдаст некорректную строку.

Решение 1: Создание собственного отчета на базе типового

Самый надежный способ решить проблему внутри конфигурации — это создать копию типового отчета ПечатнаяФормаТ9. Назовем его, например, ПечатнаяФормаТ9_Заявка. Пошагово разберем этот процесс:

  1. Скопируем объект Отчет.ПечатнаяФормаТ9 в свою конфигурацию (или расширение).
  2. В модуле менеджера или модуле объекта нового отчета найдем место формирования запроса.
  3. Заменим обращения к Документ.Командировка на обращения к нашему документу Документ.ЗаявкаНаКомандировку.
  4. Убедимся, что все поля, такие как ДолжностьПоШтатномуРасписанию, корректно выбираются из связанных регистров (например, КадроваяИсторияСотрудников).
  5. В модуле менеджера документа ЗаявкаНаКомандировку изменим строку регистрации команды:

// Вместо типового отчета указываем наш новый объект
КомандаПечати.МенеджерПечати = "Отчет.ПечатнаяФормаТ9_Заявка";

Этот метод позволяет полностью контролировать логику сбора данных и избежать конфликтов с типовым кодом.

Решение 2: Использование внешней печатной формы

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

  1. Независимость от обновлений: При обновлении ЗУП наш код не затрется и не вызовет конфликтов.
  2. Простота отладки: Мы можем менять текст запроса во внешней обработке без необходимости перезапускать сеанс или обновлять конфигурацию базы данных.
  3. Изоляция логики: Весь код по формированию данных для Т-9 будет находиться в одном месте.

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

Решение 3: Подмена структуры данных программно

Для продвинутых разработчиков существует вариант с перехватом управления в модуле менеджера. Мы можем подготовить данные в формате, который ожидает отчет ПечатнаяФормаТ9. Выясним, что именно ждет отчет. Как правило, это временная таблица ВТСсылкиНаДокумент, содержащая поля СсылкаНаОбъект, Период и Сотрудник.

Если мы программно сформируем такую таблицу и передадим её в параметры печати, то сможем «обмануть» типовой механизм. Однако, это требует глубокого понимания работы общего модуля ЗарплатаКадрыОтчеты и может быть трудозатратным при поддержке.

Важные замечания по функциональным опциям

Обратим внимание на строку кода из примера автора темы:


КомандаПечати.ФункциональныеОпции = "ИспользоватьОплатуКомандировок,НеИспользоватьРасчетЗарплатыРасширенная";

Проанализируем этот момент. Если в вашей базе функциональная опция ИспользоватьОплатуКомандировок выключена, команда печати просто не появится в меню. Кроме того, функциональные опции могут влиять на состав доступных полей в СКД. Если ошибка КАК сохраняется, попробуйте временно очистить это свойство у команды печати, чтобы убедиться, что проблема не в скрытых полях.

Подведем итог: Ошибка КАК ДолжностьПоШтатномуРасписанию — это прямое следствие несовместимости структуры данных вашего документа и ожиданий типового отчета 1С. Для решения проблемы рекомендуется либо создать специализированный отчет в расширении, адаптированный под ваш документ, либо реализовать логику печати через внешнюю обработку.

← На главную