В практике программирования на платформе 1С:Предприятие 8 часто встречаются задачи, которые на первый взгляд кажутся тривиальными, но содержат в себе глубокие концептуальные ловушки. Рассмотрим классический пример кода, который часто предлагается на собеседованиях для проверки внимательности и знания основ платформы. Проанализируем ситуацию, в которой три строчки кода вызывают массу вопросов у разработчика.
Для начала проанализируем исходный фрагмент кода, который вызвал затруднения. Перед нами обработчик события ПриОткрытии, в котором происходит попытка заполнения ячеек табличного документа с последующей его очисткой.
&НаСервере
Процедура ПриОткрытии(Отказ)
Для ит = 4 по 16 Цикл
ТабличныйДокумент.Область(ит,1,ит,1).Текст = "Зачем вывожу если потом все равно очищать" + ит;
КонецЦикла;
ТабличныйДокумент.Очистить();
КонецПроцедуры
Первое, на что мы должны обратить внимание — это директива компиляции. В управляемых формах событие ПриОткрытии является исключительно клиентским. Использование директивы &НаСервере для этого стандартного обработчика приведет к тому, что платформа либо вообще не вызовет эту процедуру, либо это вызовет ошибку конфигурации при попытке запуска. Запомним правило: работа с интерфейсными событиями открытия формы всегда начинается на клиенте (&НаКлиенте).
Рассмотрим подробнее строку внутри цикла: ...Текст = "Строка" + ит;. Выясним причину, почему опытные разработчики советуют быть осторожными с такой конструкцией. В 1С поддерживается неявное преобразование типов, но оно имеет свои особенности:
ит + "Строка"), система выдаст ошибку, так как попытается преобразовать строку в число.ит превысит 999, в строку будет добавлен неразрывный пробел (разделитель групп разрядов). Для коротких циклов это не критично, но в общем случае правильно использовать функцию Формат() или явное преобразование Строка().Проанализируем пример правильного формирования текста в ячейке:
// Использование явного преобразования для исключения лишних пробелов
ТабличныйДокумент.Область(ит, 1).Текст = "Текущая итерация: " + Формат(ит, "ЧГ=0");
Посмотрим на синтаксис обращения к ячейкам. В исходном коде используется Область(ит, 1, ит, 1). Хотя это синтаксически верно, такая запись избыточна. Метод Область() объекта ТабличныйДокумент позволяет обращаться к одной ячейке, передавая всего два параметра: номер строки и номер колонки.
Рассмотрим более лаконичный и правильный вариант обращения:
// Вместо Область(ит, 1, ит, 1) используем:
ТабличныйДокумент.Область(ит, 1).Текст = "Значение " + Строка(ит);
Также стоит отметить, что если ТабличныйДокумент является реквизитом формы, то на сервере мы работаем с ним через ЭтотОбъект.ТабличныйДокумент или просто по имени, если находимся в контексте модуля формы. Однако изменения, внесенные на сервере, должны быть переданы на клиент для отображения пользователю.
Самый важный аспект данного кода — его логическая бессмысленность. Выясним, почему команда ТабличныйДокумент.Очистить() в конце процедуры делает всю предшествующую работу цикла бесполезной. Мы тратим ресурсы процессора и память на формирование строк и заполнение ячеек, чтобы в следующую миллисекунду полностью стереть эти данные.
В реальных задачах такое встречается в двух случаях:
Представим, что наша задача — сделать код рабочим и осмысленным. Разберем два пути решения задачи.
В этом случае нам необходимо перенести выполнение на клиент, убрать очистку и добавить метод отображения, если табличный документ не размещен на форме как элемент управления.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Заполняем документ данными
Для ит = 4 по 16 Цикл
ТабличныйДокумент.Область(ит, 1).Текст = "Данные строки № " + Формат(ит, "ЧГ=0");
КонецЦикла;
// Если документ — отдельный объект, можно вызвать Показать()
// ТабличныйДокумент.Показать("Результат выгрузки");
КонецПроцедуры
Если в конце процедуры документ действительно должен быть пустым, то самым правильным решением с точки зрения производительности будет полное удаление цикла.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Весь предыдущий цикл удален, так как он не нес полезной нагрузки
ТабличныйДокумент.Очистить();
КонецПроцедуры
Проанализировав данную задачу, мы пришли к выводу, что качественный код в 1С требует не только знания синтаксиса, но и понимания контекста исполнения. Всегда проверяйте, где выполняется ваш код — на клиенте или на сервере. При работе с ТабличныйДокумент помните о доступности методов. Например, метод Очистить() доступен в различных контекстах, но его использование должно быть оправдано логикой алгоритма. При склеивании строк и чисел всегда используйте Формат() для предотвращения появления неразрывных пробелов, которые могут нарушить визуальное представление данных или привести к ошибкам в логике сравнения строк.