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

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки на платформе 1С 7.7 часто возникают задачи, требующие динамического изменения структуры данных. Одной из таких задач является создание «шахматки» или отчета, где количество колонок зависит от состава справочника (например, списка складов). Многие начинающие разработчики сталкиваются с ошибкой при попытке обращения к динамически созданной колонке. Давайте разберем эту ситуацию по шагам.

Разбор ошибки обращения к колонке

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

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

Пошаговое решение по формированию динамической таблицы

Для реализации задачи, при которой количество колонок формируется на лету, воспользуемся следующим алгоритмом:

  1. Создаем объект ТаблицаЗначений.
  2. В цикле по справочнику (например, Склады) добавляем необходимые колонки.
  3. Заполняем таблицу данными, используя метод УстановитьЗначение.

Посмотрим на пример кода, который демонстрирует правильную логику работы:


// Создаем объект таблицы
ТЗ = СоздатьОбъект("ТаблицаЗначений");

// Добавляем фиксированную колонку для номенклатуры
ТЗ.НоваяКолонка("Номенклатура", "Справочник.Номенклатура", , , "Товар", 20);

// Цикл по списку складов для динамического создания колонок
СпрСклады = СоздатьОбъект("Справочник.Склады");
СпрСклады.ВыбратьЭлементы();
Пока СпрСклады.ПолучитьЭлемент() = 1 Цикл
    // Имя колонки должно быть без пробелов! Используем код или уникальный идентификатор
    ИмяКолонки = "Склад_" + СпрСклады.Код;
    ЗаголовокКолонки = СпрСклады.Наименование;
    ТЗ.НоваяКолонка(ИмяКолонки, "Число", 10, 2, ЗаголовокКолонки, 10);
КонецЦикла;

// Теперь заполняем таблицу данными
СпрНоменклатура = СоздатьОбъект("Справочник.Номенклатура");
СпрНоменклатура.ВыбратьЭлементы();
Пока СпрНоменклатура.ПолучитьЭлемент() = 1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.Номенклатура = СпрНоменклатура.ТекущийЭлемент();
    
    // Внутренний цикл для записи остатков по складам
    СпрСклады.ВыбратьЭлементы();
    Пока СпрСклады.ПолучитьЭлемент() = 1 Цикл
        Остаток = ПолучитьОстаток(СпрНоменклатура.ТекущийЭлемент(), СпрСклады.ТекущийЭлемент());
        ИмяКолонки = "Склад_" + СпрСклады.Код;
        
        // Устанавливаем значение в нужную ячейку через метод УстановитьЗначение
        ТЗ.УстановитьЗначение(ТЗ.НомерСтроки, ИмяКолонки, Остаток);
    КонецЦикла;
КонецЦикла;

Почему важно разделять идентификатор и заголовок?

Как мы проанализировали выше, попытка использовать НаимНоменклатура (с пробелами или переменными) в качестве имени колонки приведет к ошибке Колонка не найдена. Платформа 1С 7.7 требует, чтобы идентификатор был «валидным» именем переменной. Для обращения к данным мы используем только этот идентификатор. Метод УстановитьЗначение(<Колонка>, <Строка>, <Значение>) является наиболее надежным способом записи информации в ячейку таблицы.

Рекомендации по архитектуре данных

Если задача требует интерактивного редактирования данных в «шахматке», учитывайте следующие архитектурные риски:

Надеемся, эти рекомендации помогут вам эффективно реализовать задуманный функционал в 1С 7.7. Главное — придерживаться правила: системные имена колонок должны быть строгими и лаконичными, а для отображения пользователю используйте заголовки.

← На главную