Разработка и Конфигурация · 9 мин
Как сделать счетчик в 1С 8
Как сделать счетчик в 1С 8: счетчик в цикле, нумераторы документов, автонумерация строк и нумерация в запросах. Примеры кода, ошибки и проверка результата.
Под «счетчиком» в 1С 8 обычно понимают четыре разные задачи: простой счетчик в цикле на встроенном языке, нумератор документов и справочников, автоматическую нумерацию строк табличной части и порядковые номера строк в запросе и отчете. Способ реализации зависит от того, где именно нужен номер: в коде, в базе данных или в печатной форме.
Ошибка на этом этапе типична: разработчик пытается решить задачу нумерации документов программным счетчиком, хотя платформа уже имеет штатный механизм нумераторов, или наоборот — городит сложный запрос там, где достаточно переменной в цикле. Ниже разобраны все четыре сценария с готовым кодом и критериями выбора.
Счетчик в цикле на встроенном языке
Самый простой вариант — переменная, которая увеличивается на каждой итерации цикла. Такой счетчик нужен, когда требуется посчитать количество обработанных элементов, вывести порядковый номер в сообщение или ограничить число повторов.
Сч = 0;
Для Каждого Строка Из ТаблицаЗначений Цикл
Сч = Сч + 1;
Сообщить("Строка № " + Сч + ": " + Строка.Номенклатура);
КонецЦикла;
Если номер нужен только для перебора с индексом, удобнее цикл «Для» — там счетчик встроен в конструкцию и не требует отдельной переменной:
Для Инд = 1 По ТабличнаяЧасть.Количество() Цикл
Строка = ТабличнаяЧасть[Инд - 1];
// Инд — это и есть счетчик от 1 до числа строк
КонецЦикла;
Нумераторы документов и справочников
Когда счетчик нужен для автоматической нумерации документов, программный цикл не подходит — номер должен быть уникальным в базе, устойчивым к одновременной работе пользователей и к откату транзакций. Для этого в платформе существует объект метаданных «Нумератор» и свойство «Автонумерация» у документов и справочников.
Чтобы включить штатную нумерацию, откройте конфигуратор, найдите нужный вид документа, на закладке «Нумерация» установите признак «Автонумерация», укажите длину и тип номера (числовой или строковый) и периодичность — в пределах года, месяца или непрерывную. Платформа сама присвоит следующий номер при записи объекта.
Если один сквозной счетчик нужен для нескольких видов документов (например, общий номер для приходных и расходных накладных), создайте объект «Нумератор» в ветке «Документы → Нумераторы» и укажите его в свойстве «Нумератор» каждого вида документа. Тогда оба вида будут получать номера из одной последовательности.
Автонумерация строк табличной части
У каждой табличной части есть системное поле «НомерСтроки», которое платформа заполняет автоматически. Вручную делать счетчик строк не нужно — достаточно не затирать это поле своим кодом. Если после обработки строк номера «слетели» (например, после программной сортировки или удаления), восстановите их простым циклом:
Для Инд = 0 По Объект.Товары.Количество() - 1 Цикл
Объект.Товары[Инд].НомерСтроки = Инд + 1;
КонецЦикла;
На форме нумерация строк отображается автоматически, если у таблицы включен вывод колонки номера строки. Отдельный реквизит «НомерПоПорядку» заводить не следует — это дублирование штатного механизма и лишний источник рассинхронизации.
Счетчик и нумерация строк в запросе
В языке запросов 1С нет переменных, поэтому классический счетчик реализуется иначе. Для нумерации записей результата предназначена функция АВТОНОМЕРЗАПИСИ() — она возвращает порядковый номер записи в выборке:
ВЫБРАТЬ
АВТОНОМЕРЗАПИСИ() КАК НомерПоПорядку,
Товары.Номенклатура КАК Номенклатура,
Товары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
УПОРЯДОЧИТЬ ПО
Товары.Номенклатура
Важное ограничение: автономер присваивается до окончательной сортировки и группировки в некоторых ситуациях, поэтому номера могут идти не в том порядке, в котором строки выведены. Если нужна гарантированная последовательная нумерация именно в порядке вывода — нумеруйте уже на стороне СКД или при обходе результата запроса обычным счетчиком в коде.
Сравнение вариантов
Подходит для подсчета и нумерации при обходе данных в коде. Не сохраняется между сеансами и не подходит для номеров документов.
Штатный способ для номеров документов и справочников. Устойчив к конкурентной работе, но требует настройки в конфигураторе.
Быстрая нумерация строк в запросе и отчете. Порядок номеров может не совпадать с итоговой сортировкой.
Номер строки прямо в отчете без изменения запроса. Работает только внутри отчета на СКД.
Счетчик в отчете на СКД
В схеме компоновки данных номер строки обычно выводят вычисляемым полем. На закладке «Вычисляемые поля» добавьте поле «НомерСтроки» с выражением:
НомерПоПорядкуВГруппировке()
Функция НомерПоПорядкуВГруппировке() возвращает номер записи внутри текущей группировки, что удобно для отчетов с иерархией. Если нужна сквозная нумерация по всему отчету, используйте выражение НомерПоПорядку() — оно нумерует детальные записи отчета последовательно.
После добавления поля перетащите его в ресурсы или в список выбранных полей настроек отчета. Проверьте результат на тестовых данных: номера должны начинаться с 1 и идти без пропусков в пределах выбранной группировки.
- 1Откройте схему компоновки данных отчета
- 2На закладке «Вычисляемые поля» добавьте поле с выражением НомерПоПорядку()
- 3Добавьте поле в выбранные поля настроек
- 4Сформируйте отчет и проверьте последовательность номеров
Типичные ошибки и проверка результата
Большинство проблем со счетчиками в 1С сводится к нескольким повторяющимся причинам. Знание их заранее экономит время отладки.
После внедрения любого варианта проверьте результат на контрольном примере: для цикла — что счетчик равен числу обработанных элементов, для нумератора — что два подряд записанных документа получили последовательные номера, для отчета — что нумерация начинается с единицы и не имеет пропусков.
Как проверить результат
Каждый новый документ получает следующий номер, дублей нет
Повторяющиеся номера или пропуски без удаленных документов
Итоговое значение равно числу итераций
Счетчик меньше или больше фактического числа строк
Номера от 1 без пропусков в каждой группировке
Номера идут не по порядку сортировки строк
Что важно запомнить
Выбор способа зависит от задачи: переменная в цикле — для подсчета в коде, нумератор — для номеров документов, АВТОНОМЕРЗАПИСИ() или вычисляемое поле СКД — для номеров строк в отчетах. Не заменяйте штатные механизмы платформы самодельными запросами.
Частые вопросы
Как сбросить нумерацию документов, чтобы она началась заново?
Штатной кнопки сброса нет. Нумерация сбрасывается автоматически при смене периода, если у нумератора задана периодичность «в пределах года» или «в пределах месяца». Для принудительного сброса используют специальные обработки обновления нумерации, но перед этим убедитесь, что старые номера не понадобятся и не возникнет конфликт с уже записанными документами.
Почему номер документа присваивается не сразу, а при записи?
Это штатное поведение при включенной автонумерации: номер резервируется в момент записи объекта, чтобы избежать конфликтов при одновременной работе пользователей. Если номер нужен до записи, используйте метод УстановитьНовыйНомер() — но помните, что при отказе от записи номер будет «сгоревшим».
Можно ли сделать номер документа с префиксом организации?
Да. Установите тип номера «Строка» и используйте подписку на событие «ПриУстановкеНовогоНомера», где сформируйте префикс по нужным правилам. Стандартный механизм префиксации также умеет добавлять префикс информационной базы и организации, если он включен в настройках.
Как посчитать количество строк результата запроса без цикла?
Используйте агрегатную функцию КОЛИЧЕСТВО(*) в запросе — она вернет число записей одним обращением к базе. Обход выборки с счетчиком нужен только если при подсчете требуется дополнительная логика для каждой строки.
Почему АВТОНОМЕРЗАПИСИ() выдает номера не по порядку сортировки?
Автонумерация применяется к результату до окончательного упорядочивания, поэтому при сортировке по другому полю номера визуально «перемешиваются». Для нумерации в порядке вывода используйте вычисляемое поле НомерПоПорядку() в СКД или нумеруйте строки при программном обходе результата запроса.
Как сделать сквозной счетчик, общий для разных баз?
Штатные нумераторы работают только внутри одной информационной базы. Для сквозной нумерации между базами потребуется централизованный сервис выдачи номеров или обмен с резервированием диапазонов — это уже задача интеграции, а не настройки нумератора.