Как восстановить хронологический порядок выплат в расчетном листке 1С ЗУП 3.18 после обновления?

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

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

Почему хронологический порядок важен для расчетчиков и как он регулируется?

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

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

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

Таким образом, проблема несортированного блока выплат в расчетном листке 1С ЗУП 3.1.18, хотя и не нарушает законодательство, тем не менее, вызывает вопросы у расчетчиков, привыкших к более структурированному и профессиональному представлению данных. При этом стоит отметить, что в предыдущих версиях 1С ЗУП и даже в 1С 7.7 выплаты обычно отображались последовательно по датам, что сформировало определенные ожидания у пользователей.

Официальный подход: Обращение в техническую поддержку 1С

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

Мы рекомендуем подробно описать проблему, указав версию ЗУП, с которой и на которую было произведено обновление, а также приложить примеры расчетных листков до и после обновления для наглядности. Это позволит 1С более точно понять суть проблемы и, возможно, включить исправление в один из следующих патчей или релизов.

Программное решение: Восстановление сортировки выплат в модуле отчета

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

Проблема, скорее всего, связана с тем, что в процессе формирования данных для расчетного листка в новой версии ЗУП был изменен или упущен механизм сортировки записей о выплатах. Это могло произойти из-за внутренних оптимизаций или обновлений библиотек платформы.

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

  1. Откройте конфигуратор. Запустите 1С:Предприятие в режиме конфигуратора.
  2. Найдите общий модуль. В дереве объектов конфигурации перейдите в раздел "Общие" → "Общие модули". Найдите общий модуль с именем ЗарплатаКадрыОтчеты. Этот модуль часто отвечает за формирование данных для различных отчетов, связанных с зарплатой и кадрами, включая расчетный листок.
  3. Найдите секцию, отвечающую за формирование выплат. Внутри модуля ЗарплатаКадрыОтчеты необходимо найти участок кода, который отвечает за обработку и добавление данных о выплатах в структуру расчетного листка. Ориентируйтесь на комментарии в коде или переменные, связанные с выплатами. В данном случае, мы ищем строки, которые начинаются с комментария // Выплачено.
  4. Вставьте предложенный код для сортировки. После строки, которая находит группу выплат, необходимо добавить блок кода, реализующий сортировку. В нашем случае, предлагается использовать алгоритм сортировки пузырьком.

Давайте посмотрим на пример кода, который позволит восстановить хронологическую сортировку выплат:


// Выплачено
СтрокаГруппы = СтрокаСотрудника.Строки.Найти(Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, "Группа");
Если СтрокаГруппы <> Неопределено Тогда 
    Если СтрокаГруппы.Строки.Количество() > 1 Тогда // сортировка пузырьком
        СдвигБыл = Истина;
        Пока СдвигБыл Цикл
            СдвигБыл = Ложь;
            Для Истр = 0 По СтрокаГруппы.Строки.Количество() - 2 Цикл 
                
                Строка1 = СтрокаГруппы.Строки[Истр];
                Дата1 = ?(Строка1.Регистратор = Неопределено, '00010101',
                                ?(Строка1.Регистратор.Пустая(),'00010101',Строка1.Регистратор.Дата));
                
                Строка2 = СтрокаГруппы.Строки[Истр+1];
                Дата2 = ?(Строка2.Регистратор = Неопределено, '00010101',
                                ?(Строка2.Регистратор.Пустая(),'00010101',Строка2.Регистратор.Дата));
                
                Если Дата1>Дата2 Тогда
                    СтрокаГруппы.Строки.Сдвинуть(Истр,1);
                    СдвигБыл = Истина;
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

Разберем предложенный код подробнее:

  1. Поиск группы "Выплачено": СтрокаГруппы = СтрокаСотрудника.Строки.Найти(Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено, "Группа"); Эта строка ищет в структуре данных расчетного листка (СтрокаСотрудника.Строки) группу, которая соответствует выплатам. Перечисления.ГруппыНачисленияУдержанияВыплаты.Выплачено — это системное перечисление, однозначно идентифицирующее раздел выплат.

  2. Проверка на необходимость сортировки: Если СтрокаГруппы <> Неопределено Тогда Если СтрокаГруппы.Строки.Количество() > 1 Тогда // сортировка пузырьком // ... код сортировки ... КонецЕсли; КонецЕсли; Мы проверяем, найдена ли группа выплат и содержит ли она более одной записи. Сортировка нужна только тогда, когда есть как минимум две записи, которые потенциально могут быть не упорядочены.

  3. Реализация сортировки пузырьком: СдвигБыл = Истина; Пока СдвигБыл Цикл СдвигБыл = Ложь; Для Истр = 0 По СтрокаГруппы.Строки.Количество() - 2 Цикл // ... сравнение и сдвиг ... КонецЦикла; КонецЦикла; Сортировка пузырьком — это простой алгоритм, который многократно проходит по списку, сравнивая соседние элементы и меняя их местами, если они находятся в неправильном порядке. Переменная СдвигБыл используется для определения, были ли произведены какие-либо обмены в текущем проходе. Если за весь проход обменов не было, это означает, что список отсортирован, и цикл завершается.

  4. Получение дат для сравнения: Строка1 = СтрокаГруппы.Строки[Истр]; Дата1 = ?(Строка1.Регистратор = Неопределено, '00010101', ?(Строка1.Регистратор.Пустая(),'00010101',Строка1.Регистратор.Дата)); Строка2 = СтрокаГруппы.Строки[Истр+1]; Дата2 = ?(Строка2.Регистратор = Неопределено, '00010101', ?(Строка2.Регистратор.Пустая(),'00010101',Строка2.Регистратор.Дата)); Для каждой сравниваемой записи (Строка1 и Строка2), мы извлекаем дату регистратора (Регистратор.Дата). Важно отметить использование тернарного оператора ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Он позволяет безопасно обработать ситуации, когда свойство Регистратор может быть Неопределено или Пустая(), присваивая в таком случае условную минимальную дату ('00010101') для корректного сравнения.

  5. Сравнение и сдвиг элементов: Если Дата1>Дата2 Тогда СтрокаГруппы.Строки.Сдвинуть(Истр,1); СдвигБыл = Истина; КонецЕсли; Если дата первой записи (Дата1) больше даты второй записи (Дата2), это означает, что они находятся в неправильном порядке. Метод СтрокаГруппы.Строки.Сдвинуть(Истр,1) перемещает элемент с индексом Истр на одну позицию вправо, эффективно меняя его местами с элементом по индексу Истр+1. После обмена устанавливается флаг СдвигБыл = Истина, указывая на то, что сортировка еще не завершена и требуется следующий проход.

Эффективность сортировки: Хотя сортировка пузырьком не является самым эффективным алгоритмом для очень больших массивов данных (её сложность O(n^2)), для количества выплат в расчетном листке (обычно это 2-3 записи: аванс, зарплата, возможно, отпускные) она вполне достаточна и даже может оказаться быстрее более сложных алгоритмов, таких как QuickSort, из-за меньших накладных расходов на небольших объемах данных. Для типичных сценариев работы с расчетным листком этот метод является абсолютно приемлемым решением.

Дополнительные аспекты и контекст проблемы

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

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

Хотя возможность настройки порядка отображения данных в самом отчете "Расчетный листок" через стандартные механизмы 1С может существовать (например, изменение приоритета сортировки по дате документа для раздела выплат), следует учитывать, что такие изменения могут повлиять на порядок отображения данных и в других разделах расчетного листка, таких как начисления, если они не будут применены точечно и корректно.

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

← На главную