При работе с внешними отчетами и обработками (файлы с расширением .ert) в платформе 1С 7.7 часто возникает задача сбросить накопленные или автоматически загружаемые табличные данные, чтобы получить чистую форму для нового ввода. Однако при попытке очистить таблицу разработчики и администраторы нередко сталкиваются с ситуацией, когда при следующем открытии данные появляются снова, либо форма выдает ошибки при попытке добавить новые строки. Разберем по шагам причины такого поведения и рассмотрим правильные методы работы с таблицами значений, диалоговыми слоями и внешними источниками данных.
Одной из главных причин ошибок при попытке очистить данные на форме является неправильный выбор метода объекта ТаблицаЗначений. Проанализируем, как работают базовые методы:
УдалитьСтроки() — это правильный и штатный способ очистки содержимого таблицы. Он удаляет все строки с данными, но при этом сохраняет саму структуру таблицы — все ранее созданные колонки (их имена, типы данных, ширину и заголовки). После вызова этого метода форма остается готовой к добавлению новых записей.Очистить() — данный метод полностью уничтожает объект: удаляются не только строки, но и все описанные колонки таблицы. Если после вызова Очистить() пользователь или алгоритм попытается выполнить метод НоваяСтрока() и обратиться к колонкам по имени, платформа выдаст критическую ошибку, так как колонок в таблице больше не существует.УдалитьВсе() — попытка вызвать данный метод приводит к ошибке «Поле агрегатного объекта не найдено», поскольку такого метода у объекта ТаблицаЗначений в 1С 7.7 нет.Посмотрим на пример правильной процедуры для кнопки очистки таблицы на форме:
Процедура ОчиститьТаблицу()
// Удаляем только строки, сохраняя структуру колонок
ТаблСотр.УдалитьСтроки();
// Обновляем форму для визуального отображения изменений
Форма.Обновить();
КонецПроцедуры
Если после очистки таблицы при повторном открытии обработки список данных появляется снова, это означает, что в коде формы настроена автоматическая загрузка. Выясним причину и найдем место инициализации.
В модуле формы отчета необходимо найти предопределенную процедуру ПриОткрытии(). В платформе 1С 7.7 автоматическое наполнение чаще всего реализуется одним из следующих механизмов:
ЗначениеИзФайла(ИмяФайла, ТаблСотр), чтение текстового файла через объект Текст или загрузка из базы DBF через объект XBase. Путь к файлу обычно формируется с использованием функций КаталогИБ(), КаталогПользователя() или КаталогВременныхФайлов().ВосстановитьЗначение(ИмяЗначения) или встроенного механизма автосохранения реквизитов формы.ЗагрСпр()), которая при каждом запуске выполняет цикл по элементам информационной базы.Разберем, как разделить создание колонок и заполнение данными, чтобы не ломать логику работы формы. Важно не отключать целиком процедуру инициализации, если в ней создаются колонки через метод НоваяКолонка():
Процедура ПриОткрытии()
// 1. Создаем структуру таблицы (колонки должны создаваться всегда)
ТаблСотр.НоваяКолонка("Сотрудник", "Справочник.Сотрудники");
ТаблСотр.НоваяКолонка("Оклад", "Число", 15, 2);
// 2. Блок автоматической загрузки из файла
ИмяФайлаДанных = КаталогПользователя() + "sotr_list.dat";
Если ФС.СуществуетФайл(ИмяФайлаДанных) = 1 Тогда
// Если автозагрузка не требуется, эту строку можно отключить или очистить сам файл
// ЗначениеИзФайла(ИмяФайлаДанных, ТаблСотр);
КонецЕсли;
КонецПроцедуры
В диалогах 1С 7.7 элементы управления (кнопки, таблицы, надписи) могут быть распределены по слоям. Если в редакторе формы кнопка очистки присутствует, но в режиме предприятия она не видна, необходимо настроить отображение соответствующего слоя.
Рассмотрим подробнее работу с методом Форма.ИспользоватьСлой():
1 активирует указанный слой совместно с базовым (основным) слоем формы.2 добавляет указанный слой к текущему списку уже видимых слоев диалога.Посмотрим на пример включения слоя при открытии обработки:
Процедура ПриОткрытии()
// Включаем отображение основного слоя и слоя с дополнительными кнопками
Форма.ИспользоватьСлой("Основной,СлойОчистки", 1);
КонецПроцедуры
Если данные таблицы сохраняются во внешний файл на диске, чтобы они не появлялись при следующем старте обработки, можно выполнить физическое удаление этого файла прямо из кода с помощью объекта ФС (Файловая Система):
Процедура ПолнаяОчистка()
// Очищаем строки таблицы на форме
ТаблСотр.УдалитьСтроки();
// Удаляем файл кэша, чтобы данные не загрузились повторно
ПутьКФайлу = КаталогПользователя() + "sotr_list.dat";
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
ФС.УдалитьФайл(ПутьКФайлу);
КонецЕсли;
Форма.Обновить();
КонецПроцедуры
Таким образом, для корректной очистки внешней обработки достаточно использовать метод УдалитьСтроки() для сохранения структуры колонок, активировать нужный слой формы через Форма.ИспользоватьСлой() и при необходимости отключить чтение внешнего файла в процедуре ПриОткрытии().