При переходе на новый релиз программы "1С:Зарплата и управление персоналом" (ЗУП), например, на версию 3.1.25.40, пользователи могут столкнуться с проблемой, когда в печатной форме Т-6 по отпускам перестают заполняться даты отпусков, а также виды дополнительных отпусков. Подобные сложности могут возникать как для обычных, так и для дополнительных отпусков, включая отпуска без сохранения заработной платы, и даже при печати списком. Рассмотрим эту проблему подробнее и выясним возможные пути ее решения.
Прежде чем углубляться в код, мы всегда начинаем с общих шагов по диагностике, которые часто помогают выявить и устранить проблему без серьезного вмешательства в систему.
Если вы сталкиваетесь с такой ситуацией, мы рекомендуем:
Мы предлагаем выполнить следующие действия:
Макеты компоновки данных (обычно через "Все функции" или поиском по подсистемам).Обратите внимание, что для некоторых пользователей этот метод не привел к решению проблемы, но это важный шаг в общей диагностике.
Выясним следующие моменты:
Когда общие методы не помогают, нам приходится погружаться в структуру кода, чтобы выявить истинную причину проблемы. В нашем случае, пользователи обнаружили, что даты не заполняются из-за специфического поведения функции, отвечающей за вывод данных.
Суть проблемы: переопределение корректных данных пустыми датами.
В ходе анализа было обнаружено, что даты, а иногда и виды дополнительных отпусков, перестают заполняться из-за того, что данные, изначально корректно подготовленные, переопределяются пустыми значениями на этапе вывода в печатную форму. Это происходит из-за специфики работы функции ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета.
Рассмотрим кусок кода, который был идентифицирован как источник проблемы:
ДанныеВычисляемыеНаХоду = Новый Структура;
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковВидОтпускаНаименованиеОтпускаНаПечать");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковПродолжительность");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаНачалаНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаОкончанияНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектПродолжительностьВсего", ДанныеНаПечать.СсылкаНаОбъектПродолжительностьОсновногоОтпуска);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаНачалаВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаНачалаОсновногоОтпускаНаПечать);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаОкончанияВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаОкончанияОсновногоОтпускаНаПечать);
Если Не ЗначениеЗаполнено(ДанныеНаПечать.СсылкаНаОбъектОснование) Тогда
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектОснование", СсылкаНаОбъектДанныеОтпусковОснование);
КонецЕсли;
ДанныеПользовательскихПолей = ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(ИдентификаторыМакета, ДанныеНаПечать);
ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета(
ДокументРезультат, МакетПечатнойФормы, "Шапка,Работник,Подвал",
ДанныеНаПечать,
ДанныеПользовательскихПолей,
ДанныеВычисляемыеНаХоду);
Проанализируем этот фрагмент:
ДанныеВычисляемыеНаХоду: Мы видим, что в эту структуру, предназначенную для данных, вычисляемых "на лету", для полей СсылкаНаОбъектДанныеОтпусковДатаНачалаНаПечать и СсылкаНаОбъектДанныеОтпусковДатаОкончанияНаПечать подставляется значение ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'). Дата '00010101' в 1С фактически является представлением пустой (незаполненной) даты. Таким образом, эта структура явно содержит пустые значения для некоторых ключевых полей с датами.ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета, как следует из комментария к коду, заполняет параметры областей в определенной последовательности: сначала из ДанныеНаПечать, затем из ДанныеПользовательскихПолей, и только потом из ДанныеВычисляемыеНаХоду.ДанныеНаПечать и ДанныеПользовательскихПолей содержат корректные, заполненные значения дат (что подтверждается пользователями), данные из ДанныеВычисляемыеНаХоду, будучи примененными последними, переопределяют эти корректные значения пустыми датами, приводя к их отсутствию в итоговой печатной форме.Исходя из выявленной причины, было предложено временное, но эффективное решение, позволяющее восстановить вывод дат в печатной форме Т-6.
Как временно решить проблему: Мы можем исключить структуру ДанныеВычисляемыеНаХоду из параметров функции ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета. Это предотвратит переопределение корректных данных пустыми значениями.
Пример измененного кода (после корректировки):
ДанныеВычисляемыеНаХоду = Новый Структура;
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковВидОтпускаНаименованиеОтпускаНаПечать");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковПродолжительность");
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаНачалаНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДанныеОтпусковДатаОкончанияНаПечать", ЗарплатаКадрыОтчеты.ФорматДатыЧислоВКавычкахМесяцПрописью('00010101'));
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектПродолжительностьВсего", ДанныеНаПечать.СсылкаНаОбъектПродолжительностьОсновногоОтпуска);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаНачалаВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаНачалаОсновногоОтпускаНаПечать);
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектДатаОкончанияВсегоНаПечать", ДанныеНаПечать.СсылкаНаОбъектДатаОкончанияОсновногоОтпускаНаПечать);
Если Не ЗначениеЗаполнено(ДанныеНаПечать.СсылкаНаОбъектОснование) Тогда
ДанныеВычисляемыеНаХоду.Вставить("СсылкаНаОбъектОснование", СсылкаНаОбъектДанныеОтпусковОснование);
КонецЕсли;
ДанныеПользовательскихПолей = ЗарплатаКадрыОтчеты.ЗначенияЗаполненияПользовательскихПолей(ИдентификаторыМакета, ДанныеНаПечать);
ЗарплатаКадрыОтчеты.ВывестиВДокументРезультатОбластиМакета(
ДокументРезультат, МакетПечатнойФормы, "Шапка,Работник,Подвал",
ДанныеНаПечать,
ДанныеПользовательскихПолей/*,
ДанныеВычисляемыеНаХоду*/); // Закомментировали или удалили ДанныеВычисляемыеНаХоду
После внесения этого изменения (закомментировав или удалив ДанныеВычисляемыеНаХоду из параметров вызова), пользователи сообщают, что все даты начали заполняться корректно.
Внимание: Важное примечание о временном характере решения!
Мы должны подчеркнуть, что это решение является временным обходным путем, а не системным исправлением. Исключая структуру ДанныеВычисляемыеНаХоду, мы, по сути, обходим проблему, не устраняя ее корневую причину. Если в будущем возникнет необходимость отключить опцию предварительного расчета отпускных в кадровых документах или если логика работы системы изменится таким образом, что данные в ДанныеНаПечать или ДанныеПользовательскихПолей будут действительно пустыми, то без ДанныеВычисляемыеНаХоду печатная форма может снова оказаться незаполненной или заполненной некорректно. Это означает, что загвоздка не устранена, а лишь временно скрыта.
Временное решение помогает "здесь и сейчас", но программистам и системным администраторам необходимо стремиться к пониманию и устранению первопричины. В данном случае, корневая причина может лежать глубже, чем просто некорректное переопределение данных.
Предположение о Строки.Количество() = 0: Один из пользователей предположил, что проблема может быть связана с тем, что строка с "нормальными данными" почему-то не попадает в коллекцию Строки (вероятно, имеется в виду какая-то табличная часть или коллекция данных, формируемая перед передачей в печатную форму). Если Строки.Количество() равно нулю, это может привести к тому, что система воспринимает основные данные как отсутствующие.
Почему ДанныеНаПечать или ДанныеПользовательскихПолей могут быть пустыми: Если основные структуры данных (ДанныеНаПечать и ДанныеПользовательскихПолей) формируются некорректно или остаются пустыми на определенных этапах, то система может пытаться "восполнить" недостающие данные, используя структуру ДанныеВычисляемыеНаХоду. И если эта вспомогательная структура изначально заполнена пустыми датами (как мы видели с '00010101'), то в печатную форму попадут именно эти пустые значения.
Необходимость дальнейшего расследования механизма заполнения: Для полного устранения проблемы необходимо провести более глубокое расследование механизма формирования данных перед их передачей в печатную форму. Это включает:
ДанныеНаПечать и ДанныеПользовательскихПолей, чтобы убедиться, что они содержат все необходимые значения.Кроме вышеизложенных шагов, мы также рекомендуем обратить внимание на следующие аспекты, которые могут влиять на корректность работы ЗУП и печати форм:
В случае возникновения сложных проблем, которые не удается решить самостоятельно с помощью предложенных методов, всегда рекомендуется обращаться к специалистам по сопровождению 1С. Они смогут провести глубокую диагностику вашей базы данных и конфигурации, выявить специфические причины и предложить комплексное решение.