Работа с таблицами значений в платформе 1С:Предприятие 7.7 имеет ряд специфических особенностей, которые могут вызвать затруднения у разработчиков, привыкших к механизмам 1С 8.х. Одна из наиболее частых проблем — это попытка повторно инициализировать уже существующую на форме таблицу значений через программный код, что приводит к разрыву связи между визуальным элементом и данными. В этой статье мы подробно разберем, как правильно спроектировать, заполнить и настроить таблицу значений на форме в «семерке», а также затронем важные вопросы оптимизации памяти и интерактивного взаимодействия.
Рассмотрим классическую ошибку, с которой часто сталкиваются начинающие программисты 1С 7.7. Попытка объявить таблицу значений в модуле формы с помощью стандартного конструктора выглядит следующим образом:
Табл = СоздатьОбъект("ТаблицаЗначений");
Табл.НоваяКолонка("СчетДт");
// добавление других колонок...
Выясним причину, почему при таком подходе колоноки на форме остаются невидимыми, а сама таблица выглядит абсолютно пустой. Дело в том, что функция СоздатьОбъект("ТаблицаЗначений") создает совершенно новый, независимый объект в оперативной памяти компьютера. Этот объект никак не связан с тем элементом управления (визуальной таблицей), который вы физически нарисовали на форме в конфигураторе. Переопределяя переменную Табл, вы заменяете ссылку на визуальный элемент ссылкой на «невидимую» таблицу в памяти. В результате все операции добавления колонок и строк происходят в фоновом режиме, а пользователь на экране ничего не видит.
Чтобы связать визуальное представление таблицы с программным кодом, выполним последовательно следующие действия:
Табл.СоздатьОбъект. Переменная с именем Табл уже доступна в контексте модуля и ссылается непосредственно на элемент на форме.Посмотрим на пример правильной инициализации колонок в предопределенной процедуре ПриОткрытии():
Процедура ПриОткрытии()
// Обращаемся напрямую к идентификатору элемента формы
Табл.НоваяКолонка("СчетДт");
Табл.НоваяКолонка("СубконтоДт");
Табл.НоваяКолонка("СубконтоДт2");
Табл.НоваяКолонка("СчетКт");
Табл.НоваяКолонка("СубконтоКт");
Табл.НоваяКолонка("СубконтоКт2");
Табл.НоваяКолонка("Сумма");
КонецПроцедуры
При таком подходе сразу после открытия формы пользователь увидит пустую таблицу с уже сформированной шапкой и заданными колонками.
Заполнять таблицу значений на форме можно двумя основными способами. Проанализируем каждый из них подробнее.
Способ 1. Прямое заполнение элемента формы. Мы можем напрямую добавлять строки в визуальный элемент и заполнять ячейки данными, используя стандартные методы:
Табл.НоваяСтрока();
Табл.СчетДт = ВыбранныйСчетДт;
Табл.СубконтоДт = ВыбранноеСубконто;
Табл.Сумма = 15000;
Способ 2. Загрузка из временной таблицы в памяти. Этот способ является более профессиональным и удобным, если перед выводом данных требуется произвести сложные вычисления, сортировку или группировку. Сначала мы создаем промежуточную таблицу в памяти, производим с ней все необходимые манипуляции, а затем «выталкиваем» результат на форму одним методом:
// 1. Создаем и заполняем временную таблицу в памяти
ВремТЗ = СоздатьОбъект("ТаблицаЗначений");
ВремТЗ.НоваяКолонка("Товар", "Справочник.Номенклатура");
ВремТЗ.НоваяКолонка("Количество", "Число", 10, 0);
Для КаждогоОбъекта Из СписокТоваров Цикл
ВремТЗ.НоваяСтрока();
ВремТЗ.Товар = Объекты.ТекущийЭлемент();
ВремТЗ.Количество = Объекты.Количество;
КонецЦикла;
// 2. Сортируем или фильтруем данные при необходимости
ВремТЗ.Сортировать("Товар+");
// 3. Загружаем готовую таблицу в экранный элемент
Табл.Загрузить(ВремТЗ);
Использование метода Загрузить полностью переписывает структуру колонок и строк экранной таблицы данных. Это очень удобно и избавляет от необходимости вручную переносить каждую ячейку в цикле.
Обратим внимание на важную деталь, упомянутую опытными разработчиками в исходном обсуждении: жесткая типизация колонок. По умолчанию, если вы вызываете метод НоваяКолонка("ИмяКолонки") без указания дополнительных параметров, платформа 1С 7.7 создает колонку с неопределенным типом данных.
В этом случае система вынуждена резервировать под каждую ячейку максимальный объем оперативной памяти, чтобы иметь возможность записать туда любой тип данных (будь то число, строка, документ или справочник). Если ваша таблица содержит тысячи строк, это приведет к избыточному потреблению ресурсов компьютера и существенно замедлит выполнение таких операций, как поиск, фильтрация и сортировка.
Синтаксис метода создания новой колонки выглядит следующим образом:
НоваяКолонка(Идентификатор, Тип, Длина, Точность, Заголовок, Ширина, Формат, Положение)
Посмотрим на пример правильной, оптимизированной типизации колонок:
// Ограничиваем типы колонок жесткими рамками для экономии памяти
Табл.НоваяКолонка("СчетДт", "Счет", , , "Счет Дт", 10);
Табл.НоваяКолонка("СубконтоДт", "Справочник.Субконто", , , "Субконто", 15);
Табл.НоваяКолонка("Сумма", "Число", 15, 2, "Сумма", 12, "Ч015.2", 1);
Указывая конкретные типы (например, "Счет", "Справочник" или "Число"), мы решаем сразу три важные задачи:
Разберем еще один классический баг, возникающий при работе с таблицами значений на форме в 1С 7.7. Если процедура инициализации колонок вызывается повторно (например, при нажатии кнопки «Обновить» или при изменении параметров на форме), то колонки на экране начинают дублироваться — добавляются новые столбцы с теми же именами, уводя таблицу далеко вправо.
Происходит это потому, что метод НоваяКолонка послушно добавляет новые колонки к уже существующим. Чтобы этого не происходило, перед перестроением таблицы всегда очищайте её структуру полностью с помощью метода Очистить():
Процедура ОбновитьТаблицу()
// Полностью очищаем все строки и удаляем все колонки ТЗ
Табл.Очистить();
// Заново строим структуру таблицы
Табл.НоваяКолонка("СчетДт", "Счет");
Табл.НоваяКолонка("Сумма", "Число", 15, 2);
КонецПроцедуры
Если же вам требуется очистить только информацию в строках, сохранив структуру колонок нетронутой, то вместо Очистить() следует использовать метод УдалитьСтроки().
Важно помнить, что стандартная таблица значений на форме в 1С 7.7 работает исключительно в режиме просмотра. Пользователь не может просто кликнуть по ячейке и начать редактировать ее значение непосредственно на экране (в отличие от табличных частей документов или современных интерфейсов 1С 8.х).
Для реализации полноценного ввода данных разработчики используют обходной путь через свойство «Формула» элемента ТЗ. Разберем этот алгоритм по шагам:
ПриКликеНаТаблицу().Посмотрим, как выглядит программная обработка такого клика для изменения данных:
Процедура ПриКликеНаТаблицу()
// Определяем координаты клика пользователя
НомерСтроки = Табл.ТекущаяСтрока();
ИмяКолонки = Табл.ТекущаяКолонка();
Если НомерСтроки = 0 Тогда
// Кликнули по шапке или по пустой области диалога
Возврат;
КонецЕсли;
// Обрабатываем редактирование конкретных колонок
Если ИмяКолонки = "Сумма" Тогда
ТекущееЗначение = Табл.ПолучитьЗначение(НомерСтроки, "Сумма");
ВводимоеЗначение = ТекущееЗначение;
// Открываем стандартное окно ввода числа
Если ВвестиЧисло(ВводимоеЗначение, "Укажите сумму операции:", 15, 2) = 1 Тогда
Табл.УстановитьЗначение(НомерСтроки, "Сумма", ВводимоеЗначение);
КонецЕсли;
ИначеЕсли ИмяКолонки = "СчетДт" Тогда
ТекущееЗначение = Табл.ПолучитьЗначение(НомерСтроки, "СчетДт");
ВводимоеЗначение = ТекущееЗначение;
// Открываем выбор значения с типом "Счет"
Если ВвестиЗначение(ВводимоеЗначение, "Выберите счет дебета", "Счет") = 1 Тогда
Табл.УстановитьЗначение(НомерСтроки, "СчетДт", ВводимоеЗначение);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот простой прием позволяет организовать удобный и интуитивно понятный ввод данных прямо через интерфейс таблицы.
Чтобы сделать интерфейс обработки максимально дружелюбным и функциональным, воспользуемся следующими встроенными методами управления отображением таблицы:
// Зафиксировать первые 2 колонки при горизонтальной прокрутке
Табл.Фиксировать(0, 2);
// Скрываем служебную колонку с техническим индексом
Табл.ВидимостьКолонки("ТехИндекс", 0);
// Быстрое обновление только визуальных элементов формы без перезаписи БД
Форма.Обновить(0);
Если базового функционала платформы 1С 7.7 вам окажется недостаточно (например, возникнет необходимость раскрасить строки таблицы в разные цвета в зависимости от условий, изменить шрифты или реализовать редактирование ячеек на месте "как в Excel"), обратите внимание на популярные внешние компоненты:
С помощью FormEx можно динамически управлять оформлением ячеек стандартной таблицы значений. Компонента позволяет задавать цвет фона и цвет текста для любой строки. Для этого достаточно добавить в ТЗ служебную колонку со специальным именем (например, _ЦветФона) и записывать туда числовые коды цветов RGB. Это существенно повышает читаемость сложных отчетов и обработок.
Использование класса ТабличноеПоле из библиотеки 1С++ позволяет полностью заменить стандартный элемент управления ТЗ на форме. Он предоставляет разработчику продвинутый функционал: полноценный ввод данных непосредственно в ячейку "по месту", тонкую настройку шрифтов, поддержку контекстных меню и высокую скорость обработки данных благодаря возможности напрямую связывать таблицу с SQL-запросами к базе данных.
Таким образом, мы детально разобрали особенности работы с таблицей значений на форме в 1С 7.7. Соблюдение правил адресации элементов формы, использование жесткой типизации и грамотное применение обработчиков формул позволят вам создавать быстрые и удобные интерфейсы для пользователей.