Как настроить сквозную нумерацию и подсчет расчетных листков в 1С?

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

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

Стандартная функциональность: почему нет прямой нумерации расчетных листков?

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

  1. Изменение нумерации при повторном формировании: Если мы сформировали расчетные листки за ноябрь на 10 сотрудников, они получили номера с 1 по 10. Если через час мы снова сформируем их же (или добавим нового сотрудника, или исправим данные), должны ли старые номера измениться? Если да, то это внесет путаницу. Если нет, то как отслеживать дубликаты или актуальность?
  2. Различные критерии формирования: Отчеты могут быть сформированы по разным подразделениям, по списку сотрудников, за разные периоды. Каждый раз это будет новый набор данных. Каким образом должна поддерживаться сквозная нумерация для всех этих комбинаций?
  3. Отсутствие сохранения: Отчеты, как правило, не сохраняются в базе данных как отдельные объекты с уникальными номерами. Они выводятся на экран или печатаются. Для сохранения нумерации требовалась бы дополнительная логика и механизмы хранения.

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

Поиск встроенных возможностей для нумерации: поле НомерПоПорядку

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

  1. Откройте отчет: Сначала откройте интересующий вас расчетный листок.
  2. Перейдите в настройки: Найдите кнопку "Настройки" или "Еще" -> "Прочее" -> "Изменить вариант отчета" (название может варьироваться в зависимости от версии и конфигурации).
  3. Расширенные настройки: Перейдите к расширенным настройкам отчета.
  4. Поиск поля: Попробуйте найти поле НомерПоПорядку или аналогичное в доступных полях и добавить его в выбранные поля или в структуру отчета (например, в группировку).

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

Программная доработка для сквозной нумерации расчетных листков

Если вам действительно необходима сквозная нумерация каждого расчетного листка, которая будет выводиться непосредственно на бланке (например, "Расчетный листок № 1", "Расчетный листок № 2" и так далее в рамках одной сессии формирования отчета), то без программной доработки конфигурации не обойтись. Это наиболее надежный и гибкий способ реализовать такую функциональность.

Мы рассмотрим несколько подходов к программной доработке:

1. Использование расширений конфигурации

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

Шаги для реализации через расширение:

  1. Создание расширения: Создайте новое расширение конфигурации.
  2. Добавление отчета в расширение: Добавьте в расширение объект "Отчет" (ваш расчетный листок). Вы можете создать новый вариант отчета или модифицировать существующий.
  3. Модификация макета отчета: Мы модифицируем макет отчета, чтобы добавить новое поле для вывода номера.

    Для этого нам потребуется изменить макет отчета. Обычно отчеты в 1С строятся на основе системы компоновки данных (СКД). Макет может быть внешним файлом или встроенным в отчет. Допустим, мы хотим добавить поле "ПорядковыйНомерЛистка" в табличную часть макета:

    
    // Пример кода, который мог бы быть использован в модуле отчета или при формировании СКД
    // Этот код не является готовым решением, а лишь иллюстрацией подхода
    // Он может располагаться в обработчике ПриКомпоновкеРезультата или ПередВыводомСтроки
            
    Перем СчетчикЛистков; // Объявляем глобальную переменную для счетчика
            
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
        // Инициализация счетчика перед началом формирования отчета
        СчетчикЛистков = 0;
        // Можно также получить данные из СКД и обработать их
        // Если требуется нумеровать каждый отдельный расчетный листок,
        // то логика подсчета должна быть привязана к моменту вывода каждого листка
    КонецПроцедуры
            
    // Пример функции, которая может быть вызвана для получения номера
    Функция ПолучитьСледующийНомерЛистка()
        СчетчикЛистков = СчетчикЛистков + 1;
        Возврат СчетчикЛистков;
    КонецФункции
            
    // В макете СКД или при программном формировании отчета
    // Мы бы добавили вызов этой функции в нужном месте,
    // например, в вычисляемом поле или в обработчике события вывода
    

    В макете или схеме компоновки данных (СКД) отчета вы можете добавить вычисляемое поле, которое будет получать значение из функции-счетчика. Это поле будет инкрементироваться при каждом выводе нового расчетного листка.

  4. Добавление логики нумерации: В модуле отчета или в схеме компоновки данных (СКД) необходимо добавить логику, которая будет присваивать порядковый номер каждому расчетному листку. Это можно сделать следующим образом:
    • В СКД: Создайте вычисляемое поле в СКД. В выражении для этого поля можно использовать функцию общего модуля, которая будет инкрементировать счетчик при каждом обращении. Важно обеспечить правильное инкрементирование счетчика для каждого уникального "расчетного листка" (т.е. для каждой новой группировки по сотруднику и периоду).
    • В модуле отчета: В обработчике события "ПриКомпоновкеРезультата" или "ПередВыводомСтроки" (если отчет формируется программно) вы можете вручную присваивать номера.

    Предположим, у нас есть группировка по сотруднику в СКД. Мы можем добавить вычисляемое поле "ПорядковыйНомер", и в его выражении указать что-то вроде Вычислить(Запрос.ПорядковыйНомер), где Запрос.ПорядковыйНомер будет результатом дополнительного запроса или функции, которая инкрементирует счетчик при смене сотрудника.

  5. Размещение номера в макете: Разместите созданное поле (например, "ПорядковыйНомер") на макете печатной формы расчетного листка в том месте, где вы хотите видеть номер (например, в заголовке).

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

2. Создание внешнего отчета или обработки

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

  1. Создание внешнего файла: Создайте новый внешний отчет (.erf) или обработку (.epf).
  2. Формирование данных: В этом отчете мы можем полностью контролировать логику формирования расчетных листков. Мы напишем запрос к данным 1С (регистры расчетов, регистры сведений) для получения всей необходимой информации.
  3. Нумерация в цикле: При обходе результатов запроса (например, по каждому сотруднику), мы будем инкрементировать счетчик и присваивать его текущему расчетному листку перед его выводом на печать.
    
    // Пример фрагмента кода из внешнего отчета/обработки
    // Этот код предполагает программное формирование табличного документа
            
    ТабДокумент = Новый ТабличныйДокумент;
    СчетчикЛистков = 0;
            
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Сотрудники.Ссылка КАК Сотрудник,
                   |    Сотрудники.ТабельныйНомер КАК ТабельныйНомер
                   |ИЗ
                   |    Справочник.Сотрудники КАК Сотрудники
                   |ГДЕ
                   |    Сотрудники.Подразделение = &Подразделение";
    Запрос.УстановитьПараметр("Подразделение", ВыбранноеПодразделение);
            
    ВыборкаСотрудников = Запрос.Выполнить().Выбрать();
            
    Пока ВыборкаСотрудников.Следующий() Цикл
        СчетчикЛистков = СчетчикЛистков + 1; // Инкрементируем счетчик для каждого листка
                
        // Здесь будет логика формирования одного расчетного листка
        // Получение данных по зарплате для текущего сотрудника
        // ...
                
        // Вывод номера на макет
        МакетЛистка = ПолучитьМакет("МакетРасчетногоЛистка");
        ОбластьЗаголовок = МакетЛистка.ПолучитьОбласть("Заголовок");
        ОбластьЗаголовок.Параметры.НомерЛистка = СчетчикЛистков; // Передаем номер в макет
        ОбластьЗаголовок.Параметры.НазваниеСотрудника = ВыборкаСотрудников.Сотрудник;
        // ... другие параметры
                
        ТабДокумент.Вывести(ОбластьЗаголовок);
        // ... вывод остальных областей листка
                
        // Добавляем разделитель страниц, если нужно
        Если ВыборкаСотрудников.Следующий() Тогда
            ТабДокумент.НоваяСтраница();
        КонецЕсли;
    КонецЦикла;
            
    ТабДокумент.Показать();
    
  4. Вывод на печать: Сформированный табличный документ будет содержать все расчетные листки с последовательной нумерацией.

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

Как подсчитать общее количество сформированных расчетных листков?

Хотя прямая сквозная нумерация каждого листка "из коробки" отсутствует, пользователи часто хотят хотя бы знать общее количество формируемых листков в текущей сессии отчета. Например, если мы формируем листки для подразделения, состоящего из 71 сотрудника, хочется увидеть, что их всего 71. Для этой цели существует простой и эффективный обходной путь, который не требует программирования.

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

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

Преимущества этого метода:

Ограничения этого метода:

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

Дополнительные возможности платформы для нумерации страниц

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

  1. Настройка колонтитулов: В режиме "Предварительный просмотр" или через "Параметры страницы" в 1С мы можем настроить колонтитулы (верхний или нижний).
  2. Добавление полей нумерации: В колонтитулы можно добавить системные поля, которые автоматически выводят номер текущей страницы и общее количество страниц. Эти опции обычно доступны в настройках печати или параметров страницы (например, "Номер страницы" и "Всего страниц").

Это не решает проблему нумерации *самих расчетных листков*, но помогает ориентироваться в многостраничных отчетах.

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

← На главную