При переходе с платформы 1С 7.7 на 1С 8 разработчики часто ищут прямой аналог привычного метода УстановитьЗначение(Строка, Колонка, Значение) для работы с объектом ТаблицаЗначений. Рассмотрим, как в современной платформе 1С осуществляется точечная запись данных в строки и колонки таблицы значений, в чем заключаются отличия в нумерации индексов и как писать производительный код.
В платформе 1С 8 у объекта ТаблицаЗначений нет единого метода для точечной записи данных по координатам. Операция всегда состоит из двух шагов: сначала мы получаем объект строки таблицы, а затем обращаемся к нужной колонке этого объекта.
Главные особенности, которые важно учитывать при переходе с версий 7.7:
Разберем базовый и наиболее распространенный способ записи значения в ячейку. Для этого мы указываем индекс строки (с учетом нуля) и имя колонки в квадратных скобках:
// Получаем доступ к строке по индексу и устанавливаем значение в колонку по имени
ТЗ[НомерСтроки - 1][ИмяКолонки] = Значение;
Также получить строку можно с помощью метода Получить():
СтрокаТЗ = ТЗ.Получить(ИндексСтроки);
СтрокаТЗ[ИмяКолонки] = Значение;
Или напрямую через имя свойства строки:
СтрокаТЗ = ТЗ[ИндексСтроки];
СтрокаТЗ.ИмяКолонки = Значение;
Специалисты часто спрашивают: можно ли обращаться к колонке по ее числовому номеру (индексу), а не по имени? Проанализируем этот момент.
Платформа 1С 8 позволяет обращаться к колонке по её индексу через квадратные скобки. Посмотрим на следующий пример:
// Обращение по индексу строки и индексу колонки (нумерация с 0)
ТЗ[ИндексСтроки][ИндексКолонки] = Значение;
Однако Синтаксис-помощник рекомендует обращаться к значениям именно по имени колонки. Если в вашем коде используется числовой индекс колонки (например, при обходе колонок в цикле), правильнее предварительно получить имя колонки через коллекцию Колонки:
ИмяКолонки = ТЗ.Колонки[ИндексКолонки].Имя;
ТЗ[ИндексСтроки][ИмяКолонки] = Значение;
Если нам необходимо заполнить значения в цикле по строкам, обращение к названию колонки по её индексу следует выносить за пределы цикла. Рассмотрим правильный вариант написания кода:
// Получаем имя колонки один раз до цикла
ИмяКолонки = ТЗ.Колонки[ИндексКолонки].Имя;
Для ИндексСтроки = 0 По ТЗ.Количество() - 1 Цикл
ТЗ[ИндексСтроки][ИмяКолонки] = Значение;
КонецЦикла;
Этот подход избавляет платформу от необходимости заново искать имя колонки в коллекции Колонки на каждой итерации цикла, что существенно ускоряет выполнение кода.
Рассмотри случаи, когда точечная запись в цикле не требуется, и её можно заменить более эффективными встроенными механизмами платформы:
ЗаполнитьЗначения():
// Заполняет указанную колонку во всех строках таблицы
ТЗ.ЗаполнитьЗначения(Значение, "ИмяКолонки");
ЗаполнитьЗначенияСвойств(СтрокаПриемник, СтрокаИсточник);
Выясним важную особенность применения объекта ТаблицаЗначений в управляемом приложении. Объект ТаблицаЗначений доступен только в серверном контексте, толстом клиенте и во внешнем соединении. В тонком клиенте и веб-клиенте данный объект не используется — вместо него применяется ДанныеФормыКоллекция. Тем не менее, принципы обращения к элементам по индексу строки и имени реквизита в ДанныеФормыКоллекция остаются аналогичными.