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