Почему в ЗУП 3.1.25.40 при печати формы Т-6 по отпускам не заполняются даты?

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

При переходе на новый релиз программы "1С:Зарплата и управление персоналом" (ЗУП), например, на версию 3.1.25.40, пользователи могут столкнуться с проблемой, когда в печатной форме Т-6 по отпускам перестают заполняться даты отпусков, а также виды дополнительных отпусков. Подобные сложности могут возникать как для обычных, так и для дополнительных отпусков, включая отпуска без сохранения заработной платы, и даже при печати списком. Рассмотрим эту проблему подробнее и выясним возможные пути ее решения.

Первоначальная диагностика и проверка типовых решений

Прежде чем углубляться в код, мы всегда начинаем с общих шагов по диагностике, которые часто помогают выявить и устранить проблему без серьезного вмешательства в систему.

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

    Если вы сталкиваетесь с такой ситуацией, мы рекомендуем:

    • Проверить, не были ли макеты изменены. Это можно сделать, сравнив их с типовыми.
    • Попробовать удалить внесенные изменения или восстановить типовые макеты. Однако стоит помнить, что иногда после удаления изменений ошибка может не исчезнуть сразу.
  2. Очистка регистра сведений "Макеты компоновки данных": Этот регистр хранит версии макетов, и иногда его данные могут устаревать или некорректно кэшироваться после обновления.

    Мы предлагаем выполнить следующие действия:

    1. Откройте регистр сведений Макеты компоновки данных (обычно через "Все функции" или поиском по подсистемам).
    2. Найдите записи, относящиеся к печатной форме Т-6 (или другим проблемным формам).
    3. Через меню "Еще" (или аналогичное) выберите пункт "Разблокировать объекты".
    4. Удалите найденные записи.
    5. После удаления попробуйте снова распечатать форму Т-6. Система должна автоматически перезаписать типовые записи в этом регистре при первой печати.

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

  3. Проверка ранее сформированных документов: Важно определить масштаб проблемы. Мы всегда рекомендуем проверить, как печатаются формы Т-6 для отпусков, оформленных до момента обновления.

    Выясним следующие моменты:

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

Детальный анализ проблемы на уровне кода

Когда общие методы не помогают, нам приходится погружаться в структуру кода, чтобы выявить истинную причину проблемы. В нашем случае, пользователи обнаружили, что даты не заполняются из-за специфического поведения функции, отвечающей за вывод данных.

Суть проблемы: переопределение корректных данных пустыми датами.

В ходе анализа было обнаружено, что даты, а иногда и виды дополнительных отпусков, перестают заполняться из-за того, что данные, изначально корректно подготовленные, переопределяются пустыми значениями на этапе вывода в печатную форму. Это происходит из-за специфики работы функции ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета.

Рассмотрим кусок кода, который был идентифицирован как источник проблемы:


ДанныеВычисляемыеНаХоду = Новый Структура;
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковВидОтпускаНаименованиеОтпускаНаПечать");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковПродолжительность");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаНачалаНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаОкончанияНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектПродолжительностьВсего", ДанныеНаПечать.СсылкаНаОбъектПродолжительностьОсновногоОтпуска);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаНачалаВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаНачалаОсновногоОтпускаНаПечать);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаОкончанияВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаОкончанияОсновногоОтпускаНаПечать);

Если Не ЗначениеЗаполнено(ДанныеНаПечать.СсылкаНаОбъектОснование) Тогда 
    ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектОснование", СсылкаНаОбъектДанныеОтпусковОснование);
КонецЕсли;

ДанныеПользовательскихПолей = ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(ИдентификаторыМакета, ДанныеНаПечать);

ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета(
    ДокументРезультат, МакетПечатнойФормы, "Шапка,Работник,Подвал",
    ДанныеНаПечать,
    ДанныеПользовательскихПолей,
    ДанныеВычисляемыеНаХоду);

Проанализируем этот фрагмент:

  1. Структура ДанныеВычисляемыеНаХоду: Мы видим, что в эту структуру, предназначенную для данных, вычисляемых "на лету", для полей СсылкаНаОбъектДанныеОтпусковДатаНачалаНаПечать и СсылкаНаОбъектДанныеОтпусковДатаОкончанияНаПечать подставляется значение ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'). Дата '00010101' в 1С фактически является представлением пустой (незаполненной) даты. Таким образом, эта структура явно содержит пустые значения для некоторых ключевых полей с датами.
  2. Порядок заполнения параметров: Функция ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета, как следует из комментария к коду, заполняет параметры областей в определенной последовательности: сначала из ДанныеНаПечать, затем из ДанныеПользовательскихПолей, и только потом из ДанныеВычисляемыеНаХоду.
  3. Переопределение: Проблема заключается в том, что даже если структуры ДанныеНаПечать и ДанныеПользовательскихПолей содержат корректные, заполненные значения дат (что подтверждается пользователями), данные из ДанныеВычисляемыеНаХоду, будучи примененными последними, переопределяют эти корректные значения пустыми датами, приводя к их отсутствию в итоговой печатной форме.

Временное решение: исключение структуры ДанныеВычисляемыеНаХоду

Исходя из выявленной причины, было предложено временное, но эффективное решение, позволяющее восстановить вывод дат в печатной форме Т-6.

Как временно решить проблему: Мы можем исключить структуру ДанныеВычисляемыеНаХоду из параметров функции ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета. Это предотвратит переопределение корректных данных пустыми значениями.

Пример измененного кода (после корректировки):


ДанныеВычисляемыеНаХоду = Новый Структура;
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковВидОтпускаНаименованиеОтпускаНаПечать");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковПродолжительность");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаНачалаНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаОкончанияНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектПродолжительностьВсего", ДанныеНаПечать.СсылкаНаОбъектПродолжительностьОсновногоОтпуска);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаНачалаВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаНачалаОсновногоОтпускаНаПечать);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаОкончанияВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаОкончанияОсновногоОтпускаНаПечать);

Если Не ЗначениеЗаполнено(ДанныеНаПечать.СсылкаНаОбъектОснование) Тогда 
    ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектОснование", СсылкаНаОбъектДанныеОтпусковОснование);
КонецЕсли;

ДанныеПользовательскихПолей = ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(ИдентификаторыМакета, ДанныеНаПечать);

ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета(
    ДокументРезультат, МакетПечатнойФормы, "Шапка,Работник,Подвал",
    ДанныеНаПечать,
    ДанныеПользовательскихПолей/*,
    ДанныеВычисляемыеНаХоду*/); // Закомментировали или удалили ДанныеВычисляемыеНаХоду

После внесения этого изменения (закомментировав или удалив ДанныеВычисляемыеНаХоду из параметров вызова), пользователи сообщают, что все даты начали заполняться корректно.

Внимание: Важное примечание о временном характере решения!

Мы должны подчеркнуть, что это решение является временным обходным путем, а не системным исправлением. Исключая структуру ДанныеВычисляемыеНаХоду, мы, по сути, обходим проблему, не устраняя ее корневую причину. Если в будущем возникнет необходимость отключить опцию предварительного расчета отпускных в кадровых документах или если логика работы системы изменится таким образом, что данные в ДанныеНаПечать или ДанныеПользовательскихПолей будут действительно пустыми, то без ДанныеВычисляемыеНаХоду печатная форма может снова оказаться незаполненной или заполненной некорректно. Это означает, что загвоздка не устранена, а лишь временно скрыта.

Выявление потенциальной корневой причины

Временное решение помогает "здесь и сейчас", но программистам и системным администраторам необходимо стремиться к пониманию и устранению первопричины. В данном случае, корневая причина может лежать глубже, чем просто некорректное переопределение данных.

Предположение о Строки.Количество() = 0: Один из пользователей предположил, что проблема может быть связана с тем, что строка с "нормальными данными" почему-то не попадает в коллекцию Строки (вероятно, имеется в виду какая-то табличная часть или коллекция данных, формируемая перед передачей в печатную форму). Если Строки.Количество() равно нулю, это может привести к тому, что система воспринимает основные данные как отсутствующие.

Почему ДанныеНаПечать или ДанныеПользовательскихПолей могут быть пустыми: Если основные структуры данных (ДанныеНаПечать и ДанныеПользовательскихПолей) формируются некорректно или остаются пустыми на определенных этапах, то система может пытаться "восполнить" недостающие данные, используя структуру ДанныеВычисляемыеНаХоду. И если эта вспомогательная структура изначально заполнена пустыми датами (как мы видели с '00010101'), то в печатную форму попадут именно эти пустые значения.

Необходимость дальнейшего расследования механизма заполнения: Для полного устранения проблемы необходимо провести более глубокое расследование механизма формирования данных перед их передачей в печатную форму. Это включает:

  1. Отладку процесса заполнения ДанныеНаПечать и ДанныеПользовательскихПолей, чтобы убедиться, что они содержат все необходимые значения.
  2. Анализ логики, которая определяет, почему "нормальные данные" могут не попадать в соответствующие коллекции или структуры.
  3. Проверку изменений в типовых механизмах конфигурации, связанных с расчетом и представлением отпусков в релизе 3.1.25.40, так как проблема появилась именно после обновления.

Дополнительные рекомендации и общие проверки

Кроме вышеизложенных шагов, мы также рекомендуем обратить внимание на следующие аспекты, которые могут влиять на корректность работы ЗУП и печати форм:

  1. Совместимость платформы 1С: Для корректной работы конфигурации ЗУП 3.1.25 необходима соответствующая версия платформы 1С:Предприятие. Убедитесь, что используемая вами платформа соответствует минимальным требованиям, указанным в документации к релизу 3.1.25.40. Обычно это версии 8.3.17.2760 и выше, 8.3.18.1957 и выше, 8.3.19.1723 и выше, 8.3.20.2180 и выше, 8.3.21.1622 и выше или 8.3.22.1704 и выше. Несоответствие версии платформы может приводить к самым непредсказуемым ошибкам.
  2. Настройки учетной политики и карточки сотрудника: Если ЗУП 3.1.25 неверно рассчитывает количество дней отпуска или если данные не заполняются полностью, мы рекомендуем тщательно проверить следующие настройки:
    • Учетная политика по персоналу: Убедитесь, что продолжительность основного и дополнительных отпусков, а также порядок учета неиспользованных дней установлены корректно.
    • Карточка сотрудника: Проверьте дату приема на работу, право на отпуска, а также остатки отпусков за прошлые периоды. Некорректные данные в этих разделах могут влиять на формирование печатной формы.
  3. Следить за актуальными релизами: Разработчики 1С регулярно выпускают обновления для исправления ошибок и добавления новых функций. Если проблема связана с ошибкой в типовой конфигурации, вполне вероятно, что в одном из следующих релизов она будет исправлена. Мы рекомендуем регулярно отслеживать и устанавливать актуальные обновления.

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

← На главную