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