При выполнении сложных интеграционных задач, таких как выгрузка данных в сторонние системы (например, MS Navision), часто возникает требование передавать файл, в котором строки внутри каждого типа документа должны иметь собственную нумерацию, начинающуюся с единицы. В 1С эта задача осложняется тем, что встроенные средства языка запросов работают специфически. Давайте разберем, как эффективно решить эту проблему, рассмотрев несколько подходов.
Начинающие разработчики часто пытаются использовать функцию АВТОНОМЕРЗАПИСИ() прямо внутри запроса. Однако важно помнить: платформа 1С не гарантирует, что нумерация всегда будет начинаться с 1 и идти строго по порядку, особенно при использовании конструкции ОБЪЕДИНИТЬ. Оптимизатор запросов может изменять порядок обработки данных, из-за чего нумерация становится непредсказуемой. Использование этой функции требует создания промежуточных временных таблиц (буферных), что при 12-15 временных таблицах превращает запрос в «спагетти-код», который крайне сложно поддерживать.
Самый надежный и гибкий способ — это упорядочить данные в запросе по типу документа, а саму нумерацию выполнить уже после получения результата, при обходе таблицы значений. Это позволяет избежать лишних временных таблиц и делает логику прозрачной.
Рассмотрим, как реализовать этот алгоритм по шагам:
ТипДокумента).ТаблицаЗначений.НомерПоПорядку.Пример реализации алгоритма на встроенном языке:
// Предположим, запрос уже выполнен и результат выгружен в ТЗ
// ТЗ упорядочена по полю ТипДокумента
ТекущийТип = Неопределено;
Счетчик = 0;
Для Каждого СтрокаТЗ Из ТЗ Цикл
Если ТекущийТип <> СтрокаТЗ.ТипДокумента Тогда
ТекущийТип = СтрокаТЗ.ТипДокумента;
Счетчик = 0;
КонецЕсли;
Счетчик = Счетчик + 1;
СтрокаТЗ.НомерПоПорядку = Счетчик;
КонецЦикла;
Этот метод работает максимально быстро, не перегружает сервер базы данных лишними операциями и позволяет легко модифицировать логику нумерации в будущем.
Если ваша задача — получить отчет или выгрузку, которую можно описать через СистемаКомпоновкиДанных, то не стоит писать код вручную. СКД обладает встроенными возможностями для решения подобных задач.
Разберем логику настройки:
ТипДокумента.НомерПоПорядкуВГруппировке.Этот подход избавляет от необходимости писать любые циклы, однако требует переноса логики запроса в схему компоновки данных.
Если вы все же решили реализовать нумерацию строго средствами языка запросов (например, из-за жестких требований к исходной ТаблицаЗначений), необходимо следовать строгой архитектуре пакета:
ОБЪЕДИНИТЬ для каждого типа.АВТОНОМЕРЗАПИСИ().Важно помнить: создание избыточного количества временных таблиц негативно сказывается на производительности. Проанализируйте ситуацию: если количество типов документов фиксировано (например, 4 типа), то метод с постобработкой (Решение 1) всегда будет выигрывать по скорости и удобству сопровождения.
Перед тем как приступать к реализации, задайте себе вопрос: какова цель этой нумерации? Если это просто технический маркер для парсинга CSV-файла, то постобработка в коде является эталонным решением. Она не требует изменения структуры запроса, легко читается другими разработчиками и не зависит от ограничений платформы 1С по работе с функцией АВТОНОМЕРЗАПИСИ(). Работайте с данными осознанно, избегая «переусложнения» архитектуры запроса там, где достаточно обычного цикла обхода!