В платформе 1С:Предприятие индексация всех встроенных коллекций (включая строки и колонки Таблицы Значений) жестко зафиксирована и всегда начинается с 0. Это базовое свойство платформы, которое невозможно изменить глобально в настройках конфигурации. Тем не менее, в практике разработчиков часто возникают ситуации, когда необходимо передать таблицу в сторонний алгоритм, внешнюю обработку или печатную форму, где логика жестко завязана на нумерацию с 1.
В этой статье мы подробно разберем, как технически реализовать «сдвиг» данных в Таблице Значений так, чтобы реальные строки и колонки начинались с индекса 1, а также проанализируем альтернативные (более безопасные) варианты решения этой задачи.
Для того чтобы сдвинуть строки в таблице значений на одну позицию вниз, освободив нулевой индекс, мы можем использовать стандартный метод коллекции Вставить(). Этот метод позволяет вставить новую строку на строго указанную позицию, автоматически сдвигая все последующие элементы.
Рассмотрим по шагам, как это сделать. Если мы передадим в метод Вставить() индекс 0, платформа создаст новую пустую строку в самом начале таблицы. Все имевшиеся ранее строки сдвинутся вниз, и их индексы увеличатся на единицу (бывшая строка 0 станет строкой 1, строка 1 станет строкой 2 и так далее).
Посмотрим на пример кода:
// Создаем тестовую Таблицу Значений
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("Номенклатура");
ТаблицаДанных.Колонки.Добавить("Количество");
// Заполняем ее тестовыми данными
НоваяСтрока = ТаблицаДанных.Добавить();
НоваяСтрока.Номенклатура = "Товар 1";
НоваяСтрока.Количество = 10;
// На данном этапе "Товар 1" находится на позиции с индексом 0.
// Теперь вставим пустую строку-заглушку в самое начало:
ТаблицаДанных.Вставить(0);
// Теперь наша реальная строка с товаром сместилась на индекс 1!
// Мы можем обратиться к ней так:
РеальныйТовар = ТаблицаДанных[1].Номенклатура; // Вернет "Товар 1"
С колонками Таблицы Значений ситуация аналогична. Разработчики часто забывают, что у коллекции Колонки, помимо стандартного метода Добавить(), также существует метод Вставить(). Он принимает индекс позиции, на которую нужно поместить новую колонку.
Если мы хотим, чтобы первая колонка с полезными данными имела индекс 1, нам необходимо вставить служебную колонку-заглушку на позицию 0. Выясним, как это выглядит на практике:
// Создаем пустую Таблицу Значений
ТаблицаСдвига = Новый ТаблицаЗначений;
// Сначала добавляем наши рабочие колонки
ТаблицаСдвига.Колонки.Добавить("Артикул");
ТаблицаСдвига.Колонки.Добавить("Цена");
// На данный момент колонка "Артикул" имеет индекс 0, а "Цена" - индекс 1.
// Вставим вспомогательную колонку в начало коллекции (индекс 0):
ТаблицаСдвига.Колонки.Вставить(0, "ВспомогательнаяКолонка");
// Проверяем:
// Теперь ТаблицаСдвига.Колонки[0] - это "ВспомогательнаяКолонка"
// А ТаблицаСдвига.Колонки[1] - это наша рабочая колонка "Артикул"
Рассмотрим ситуацию, когда нам нужно полностью подготовить таблицу для внешнего обработчика, где ожидается, что и строки, и колонки с полезными данными начинаются строго с индекса 1. Объединим оба метода в один общий алгоритм:
Процедура ПодготовитьТаблицуДляВнешнегоКода(МояТЗ) Экспорт
// Шаг 1. Сдвигаем колонки. Вставляем заглушку на позицию 0
МояТЗ.Колонки.Вставить(0, "ЗаглушкаКолонок");
// Шаг 2. Сдвигаем строки. Вставляем пустую строку на позицию 0
МояТЗ.Вставить(0);
// Теперь таблица готова к передаче.
// Обращение МояТЗ[1][1] вернет значение из первой реальной ячейки.
КонецПроцедуры
Хотя данный метод технически решает задачу быстро и без переписывания стороннего кода, мы должны учитывать несколько важных архитектурных нюансов:
Вставить(0) вынуждает платформу физически перезаписывать адреса всех элементов массива в оперативной памяти. Если в вашей таблице содержатся десятки или сотни тысяч строк, такая операция вызовет серьезные задержки в работе системы. Для небольших таблиц (до 1000 строк) этот эффект практически незаметен.Таблица.Колонки[1]). Если в коде вашей обработки обращение к данным идет по явным именам колонок (например, Строка.Номенклатура), то добавление пустой колонки в начало вообще не требуется и никак не повлияет на результат.Опытные разработчики сходятся во мнении, что использование «костылей» в виде пустых строк и колонок в данных — это крайний метод. Более надежным и профессиональным подходом считается доработка алгоритма вывода или обработки данных:
НомерСтрокиДляВывода = ИндексСтроки + 1.РеальныйИндекс = ПереданныйИндекс - 1.Таким образом, вы сохраните чистоту данных в Таблице Значений и избежите потенциальных ошибок при сортировке, свертке или группировке табличной части.