Как изменить порядок документов, имеющих одинаковую дату, в списке «Все начисления»?

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

В работе с программой 1С:Зарплата и управление персоналом 3.1 бухгалтеры и расчетчики часто сталкиваются с ситуацией, когда в списке «Все начисления» документы за один и тот же день (обычно последний день месяца) отображаются в неудобном порядке. Например, итоговый документ Начисление зарплаты и взносов может оказаться в середине списка, тогда как логичнее видеть его последним, после всех межрасчетных документов, таких как Больничный лист, Отпуск или Премия.

Разберем подробно, почему так происходит и какими способами можно выстроить документы в нужной последовательности, даже если конфигурация находится «на замке» (типовая, без возможности внесения изменений).

Выясним причину: как 1С определяет порядок документов

Проанализируем ситуацию с точки зрения платформы «1С:Предприятие». Список «Все начисления» является динамическим списком. По умолчанию документы в нем сортируются по полю Дата. Однако дата в 1С — это не просто число, месяц и год, это объект, содержащий также время вплоть до секунды.

Если у нескольких документов в списке визуально отображается одна и та же дата (например, 31.03.2023), их реальный порядок определяется следующими факторами:

  1. Время записи: Если документы создавались в разное время в течение дня, они будут выстроены строго по секундам.
  2. Момент времени: Если время совпадает до секунды, платформа использует внутренний уникальный идентификатор (GUID). В этом случае порядок может казаться случайным.
  3. Автоматическое время: В ЗУП 3.1 реализованы механизмы, которые при записи документа могут автоматически смещать время в конец дня или занимать свободную секунду, но это не всегда гарантирует нужную нам последовательность.

Способ 1: Программная корректировка времени документов

Рассмотрим самый эффективный способ — установку времени итогового документа на самый конец дня (23:59:59). Поскольку в типовых интерфейсах ЗУП время в дате часто скрыто настройками формы, визуально дата не изменится, но документ переместится в самый низ списка за этот день.

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


// Пример кода для массового изменения времени документов на конец дня
НачДата = '20230101'; // Начало периода
КонДата = '20231231'; // Конец периода

ВыборкаДок = Документы.НачислениеЗарплаты.Выбрать(НачалоДня(НачДата), КонецДня(КонДата));

Пока ВыборкаДок.Следующий() Цикл
    // Получаем объект документа для редактирования
    ОбъектДок = ВыборкаДок.ПолучитьОбъект();
    
    // Устанавливаем время на последнюю секунду дня
    ОбъектДок.Дата = КонецДня(ОбъектДок.Дата);
    
    // Записываем документ без проведения (если нужно только сместить время) 
    // или с проведением, если важна последовательность в регистрах
    Попытка
        ОбъектДок.Записать(РежимЗаписиДокумента.Запись);
    Исключение
        Сообщить("Не удалось изменить документ: " + ОбъектДок.Ссылка);
    КонецПопытки;
КонецЦикла;

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

Способ 2: Использование обработки «Групповое изменение реквизитов»

Посмотрим на вариант, который не требует программирования и подходит для конфигураций «на замке». В типовых решениях есть встроенная обработка для администраторов.

  1. Перейдем в раздел АдминистрированиеОбслуживаниеКорректировка данныхГрупповое изменение реквизитов.
  2. В поле «Выбирать элементы» укажем Начисление зарплаты и взносов.
  3. Нажмем кнопку Дополнительные параметры и установим флаг Показывать служебные реквизиты. Это критически важно, иначе мы не сможем тонко настроить время.
  4. В списке реквизитов найдем поле Дата. В колонке «Новое значение» нужно указать дату с временем 23:59:59.
  5. Чтобы не изменить дату всем документам за все годы, обязательно настроим Отбор по нужному периоду или конкретным организациям.

Важно: При ручном изменении даты через эту обработку будьте осторожны, чтобы случайно не изменить саму календарную дату на другую.

Способ 3: Настройка пользовательских полей в списке (без изменения данных)

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

  1. В списке «Все начисления» нажмем кнопку ЕщёНастроить список.
  2. Перейдем на вкладку Пользовательские поля.
  3. Нажмем ДобавитьНовое поле-выражение.
  4. В поле «Выражение» пропишем логику приоритетов. Например, мы хотим, чтобы Начисление зарплаты имело самый высокий приоритет (было в конце):

ВЫБОР 
    КОГДА ТипЗначения(Ссылка) = ТИП(Документ.НачислениеЗарплатыИВзносов) ТОГДА 2 
    ИНАЧЕ 1 
КОНЕЦ
  1. Назовем это поле, например, ПриоритетДокумента.
  2. Теперь перейдем на вкладку Сортировка.
  3. Сначала установим сортировку по полю Дата (по возрастанию), а вторым уровнем добавим наше новое поле ПриоритетДокумента.

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

Особенности изменения дат и влияние на отборы

Рассмотрим важный нюанс, упомянутый пользователями. Если вы меняете дату документа, который уже был записан, 1С может сохранять определенные внутренние признаки. Например, если вы сначала создали документ майской датой, а потом переправили ее на 30 апреля, то в некоторых случаях стандартные отборы «Равно» могут работать некорректно, если не учитывать время.

Всегда проверяйте, какое именно время установилось в документе после редактирования. Если вы используете условие Больше или равно в фильтрах, это позволяет «захватить» документы, которые из-за секундного смещения могли выпасть из стандартного диапазона поиска.

Резюме

Для достижения идеального порядка в списке «Все начисления» мы рекомендуем:

← На главную