Как в 1С 8 установить значение в ТаблицеЗначений по аналогии с 1С 7.7?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе с платформы 1С 7.7 на 1С 8 разработчики часто ищут прямой аналог привычного метода УстановитьЗначение(Строка, Колонка, Значение) для работы с объектом ТаблицаЗначений. Рассмотрим, как в современной платформе 1С осуществляется точечная запись данных в строки и колонки таблицы значений, в чем заключаются отличия в нумерации индексов и как писать производительный код.

Основные отличия в синтаксисе между 1С 7.7 и 1С 8

В платформе 1С 8 у объекта ТаблицаЗначений нет единого метода для точечной записи данных по координатам. Операция всегда состоит из двух шагов: сначала мы получаем объект строки таблицы, а затем обращаемся к нужной колонке этого объекта.

Главные особенности, которые важно учитывать при переходе с версий 7.7:

  1. Нумерация с нуля: В 1С 7.7 строки и колонки нумеровались с единицы (1, 2, 3...). В 1С 8 индексация коллекций начинается с нуля (0, 1, 2...).
  2. Разделение на объект строки и колонку: Вместо одного вызова метода используется обращение через квадратные скобки к элементам коллекции.

Установка значения по имени колонки

Разберем базовый и наиболее распространенный способ записи значения в ячейку. Для этого мы указываем индекс строки (с учетом нуля) и имя колонки в квадратных скобках:


// Получаем доступ к строке по индексу и устанавливаем значение в колонку по имени
ТЗ[НомерСтроки - 1][ИмяКолонки] = Значение;

Также получить строку можно с помощью метода Получить():


СтрокаТЗ = ТЗ.Получить(ИндексСтроки);
СтрокаТЗ[ИмяКолонки] = Значение;

Или напрямую через имя свойства строки:


СтрокаТЗ = ТЗ[ИндексСтроки];
СтрокаТЗ.ИмяКолонки = Значение;

Работа с числовыми индексами колонок

Специалисты часто спрашивают: можно ли обращаться к колонке по ее числовому номеру (индексу), а не по имени? Проанализируем этот момент.

Платформа 1С 8 позволяет обращаться к колонке по её индексу через квадратные скобки. Посмотрим на следующий пример:


// Обращение по индексу строки и индексу колонки (нумерация с 0)
ТЗ[ИндексСтроки][ИндексКолонки] = Значение;

Однако Синтаксис-помощник рекомендует обращаться к значениям именно по имени колонки. Если в вашем коде используется числовой индекс колонки (например, при обходе колонок в цикле), правильнее предварительно получить имя колонки через коллекцию Колонки:


ИмяКолонки = ТЗ.Колонки[ИндексКолонки].Имя;
ТЗ[ИндексСтроки][ИмяКолонки] = Значение;

Оптимизация производительности при обходе в цикле

Если нам необходимо заполнить значения в цикле по строкам, обращение к названию колонки по её индексу следует выносить за пределы цикла. Рассмотрим правильный вариант написания кода:


// Получаем имя колонки один раз до цикла
ИмяКолонки = ТЗ.Колонки[ИндексКолонки].Имя;

Для ИндексСтроки = 0 По ТЗ.Количество() - 1 Цикл
    ТЗ[ИндексСтроки][ИмяКолонки] = Значение;
КонецЦикла;

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

Альтернативные способы заполнения данных

Рассмотри случаи, когда точечная запись в цикле не требуется, и её можно заменить более эффективными встроенными механизмами платформы:

  1. Массовое заполнение всей колонки: Если требуется установить одно и то же значение во всех строках одной или нескольких колонок, используем метод ЗаполнитьЗначения():
    
    // Заполняет указанную колонку во всех строках таблицы
    ТЗ.ЗаполнитьЗначения(Значение, "ИмяКолонки");
    
    Этот метод выполняется на уровне платформы и работает значительно быстрее цикла.
  2. Перенос данных между строками: Чтобы скопировать все совпадающие по именам колонки из одной строки в другую (или из структуры в строку), используем системную процедуру: ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);

Контекст выполнения и ограничение доступности

Выясним важную особенность применения объекта ТаблицаЗначений в управляемом приложении. Объект ТаблицаЗначений доступен только в серверном контексте, толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте данный объект не используется — вместо него применяется ДанныеФормыКоллекция. Тем не менее, принципы обращения к элементам по индексу строки и имени реквизита в ДанныеФормыКоллекция остаются аналогичными.

← На главную