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