Новая колонка в 1С: куда добавлять и чем это отличается

· 9 мин

Содержание

«Колонка» в 1С — это четыре разные вещи. В отчёте на СКД это поле в выбранных полях. В печатной форме — ячейки табличного документа. В списке или документе — реквизит с полем на форме. Способ зависит от того, что вы называете колонкой, и от того, можно ли менять конфигурацию.

Если вы пользователь и конфигурацию трогать нельзя, начинайте с пользовательской настройки отчёта или списка. Если вы разработчик, смотрите разделы про СКД, код и расширения. Все примеры рассчитаны на платформу 8.3 с интерфейсом «Такси».

Что нужноГде делаетсяМеняется конфигурация
Показать в отчёте уже существующее полеНастройки отчёта, выбранные поляНет
Посчитать в отчёте новое значениеСхема компоновки данных, вычисляемые поляДа (или расширение)
Добавить колонку в печатную формуМакет или код с табличным документомДа (или расширение)
Добавить хранимое поле в справочник, документРеквизит объекта плюс поле на формеДа (или расширение)
Показать на форме временное значениеРеквизит формы, создаётся из кодаНет, только код формы

Колонка в отчёте: пользовательская настройка и схема компоновки

Начните с проверки: возможно, нужное поле уже есть и просто скрыто. Откройте отчёт, нажмите кнопку настройки (в большинстве отчётов это «Настройки» в командной панели, иногда «Ещё → Изменить вариант отчёта»). В списке выбранных полей добавьте нужное и перетащите его на позицию. Сохраните вариант отчёта под своим именем, чтобы настройка не слетала.

Если нужного поля в списке нет, оно не попадает в набор данных схемы. Тогда без разработчика не обойтись.

Порядок колонок в отчёте задаёт порядок полей в выбранных. Чтобы переставить колонку, перетащите поле выше или ниже в списке выбранных полей и сохраните вариант. Заголовок колонки меняется там же: у выбранного поля есть собственное свойство «Заголовок», и в отчёте будет показан именно он, а не заголовок из схемы.

Если одна и та же колонка нужна нескольким вариантам отчёта, добавляйте поле в каждый вариант отдельно: настройки вариантов друг от друга не зависят.

Вычисляемое поле в схеме

В конфигураторе откройте схему компоновки данных отчёта. На закладке «Вычисляемые поля» добавьте строку: задайте путь к данным (латиницей или кириллицей без пробелов), заголовок и выражение. Например, для процента выполнения:

ВЫБОР КОГДА ПланСумма = 0 ТОГДА 0 ИНАЧЕ ФактСумма / ПланСумма * 100 КОНЕЦ

Деление на ноль в выражении вычисляемого поля нужно закрывать сразу: иначе в колонке появятся пустые ячейки или ошибка при формировании.

Затем перейдите на закладку «Настройки», в нужной группировке или таблице добавьте новое поле в выбранные. Если поле не добавить в настройки, в отчёте оно не появится, даже если описано в схеме.

Поле в запросе набора данных

Когда значение берётся из базы, а не считается, правьте запрос набора данных: добавьте поле в список ВЫБРАТЬ и убедитесь, что оно появилось на закладке «Набор данных» в списке полей. Если у вас задан условный запрос с ВЫБРАТЬ РАЗРЕШЕННЫЕ, новое поле тоже должно подчиняться ограничениям на уровне записей.

Ресурсы (итоги по колонке) заводятся на отдельной закладке «Ресурсы». Не путайте их с вычисляемыми полями: вычисляемое поле считается построчно, ресурс — по группировкам.

Колонки табличного документа из кода

Табличный документ — это сетка ячеек: «колонка» здесь просто номер столбца. Типичные задачи: добавить столбец в программно формируемую печатную форму или выгрузку, задать ширину и заголовок.

Пример заполнения заголовка и данных в четвёртой колонке:

ТабДок = Новый ТабличныйДокумент;

ТабДок.Область(1, 4, 1, 4).Текст = "Комментарий";
ТабДок.Область(1, 4, 1, 4).Шрифт = Новый Шрифт(, , Истина);
ТабДок.Область(1, 4, 1, 4).ЦветФона = WebЦвета.СветлоСерый;

Для Сч = 1 По Данные.Количество() Цикл
	ТабДок.Область(Сч + 1, 4, Сч + 1, 4).Текст = Данные[Сч - 1].Комментарий;
КонецЦикла;

ТабДок.Область(1, 4, Данные.Количество() + 1, 4).ШиринаКолонки = 30;

Здесь Данные — таблица значений, в которой есть реквизит Комментарий. Строки идут с единицы, а в таблице значений индекс с нуля, поэтому в цикле стоит Сч - 1.

Через макет

Если форма печатная и постоянная, колонку проще добавить в макет: откройте макет в конфигураторе, выделите ячейки нового столбца, задайте текст заголовка или параметр в угловых скобках, например <Комментарий>. В коде заполните параметр обычным способом: заполните область макета и выведите её в документ. Ширину колонки при этом задаёт сам макет.

Ячейки с переменной длиной текста нуждаются в включённом переносе и в свойстве, разрешающем автоподбор высоты строки, иначе длинный комментарий обрежется.

Реквизит в форме списка или документа

Чтобы в списке или документе появилась колонка с хранимыми данными, нужны два шага: реквизит у объекта и поле на форме.

  1. В конфигураторе откройте объект (справочник или документ), на закладке «Данные» добавьте реквизит нужного типа. Для табличной части — реквизит внутри неё.
  2. Откройте форму списка или документа. Реквизит объекта виден в списке реквизитов формы справа; перетащите его в таблицу формы или в группу полей.
  3. Для динамического списка убедитесь, что поле входит в запрос: на закладке с настройкой запроса списка отметьте нужное поле, иначе колонка останется пустой.
  4. Обновите конфигурацию базы данных и запустите 1С в режиме предприятия для проверки.

Добавление реквизита изменяет структуру хранения. Обновление конфигурации базы данных на рабочей базе делайте во внерабочее время и после копии базы: монопольный доступ нужен именно для этой операции.

Колонка в табличной части

Для табличной части процесс тот же: добавьте реквизит внутри табличной части объекта, затем на форме в элементе таблицы появится новое поле. Если колонку нужно заполнять автоматически, подключите обработчик ПриИзменении соседнего поля и пересчитывайте значение в нём.

Колонка на форме без изменения структуры данных

Иногда хранить значение не нужно: оно считается или нужно только на время открытия формы. Тогда колонку создаёт реквизит формы, а не объекта.

В конфигураторе на форме добавьте реквизит формы, и если это колонка существующей таблицы, укажите её как родителя. То же можно сделать динамически в коде:

&НаСервере
Процедура ДобавитьКолонкуНаСервере()

	ДобавляемыеРеквизиты = Новый Массив;
	ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Комментарий", Новый ОписаниеТипов("Строка"), "Таблица", "Комментарий"));
	ИзменитьРеквизиты(ДобавляемыеРеквизиты);

	Поле = Элементы.Добавить("ТаблицаКомментарий", Тип("ПолеФормы"), Элементы.Таблица);
	Поле.Вид = ВидПоляФормы.ПолеВвода;
	Поле.ПутьКДанным = "Таблица.Комментарий";
	Поле.Заголовок = "Комментарий";

КонецПроцедуры

Здесь Таблица — реквизит формы типа «Таблица значений» (или другой реквизит-таблица). Третий параметр конструктора РеквизитФормы — путь к родительской таблице, поэтому колонка привязывается именно к ней.

Ограничения:

  • 🔹 ИзменитьРеквизиты вызывается только на сервере.
  • 🔹 Метод пересоздаёт данные формы-реквизитов: значения уже существующих реквизитов сохраняются, но обработчики и ссылки, привязанные к их данным, лучше пересобрать после вызова.
  • 🔹 Нельзя изменить реквизит, который является основным реквизитом формы, и реквизит, связанный с данными объекта.
Куда добавлять колонку?

Если конфигурация на поддержке: расширение вместо правки

Типовая конфигурация (Бухгалтерия, ЗУП, УТ) обычно стоит на поддержке. Правка типового объекта ломает автоматическое обновление: при каждом новом релизе придётся вручную сливать изменения. Поэтому колонки в типовых объектах добавляют через расширение конфигурации (механизм есть с платформы 8.3.6).

Порядок действий:

  1. Создайте расширение: «Конфигурация → Расширения конфигурации » в конфигураторе. Дайте имя и префикс, который будет добавлен к именам ваших объектов.
  2. Заимствуйте объект: в дереве основной конфигурации найдите справочник или документ, в контекстном меню выберите «Добавить в расширение».
  3. В расширении у заимствованного объекта добавьте реквизит. Он хранится в таблице базы, поэтому структура меняется так же, как при обычной правке.
  4. Заимствуйте нужную форму и поместите новый реквизит в таблицу или группу полей.
  5. Загрузите расширение в рабочую базу и обновите конфигурацию базы данных.

Новый реквизит в расширении должен иметь имя с вашим префиксом, чтобы не пересечься с будущими реквизитами разработчика типовой конфигурации.

Загрузка расширения и «Обновить конфигурацию БД» — отдельные операции. Расширение можно загрузить, но колонка не появится, пока структура базы не обновлена.

Для отчётов на СКД расширение работает так же: заимствуйте отчёт, внесите правки в схему. В расширении можно менять только то, что разрешено заимствованием. Если схему отчёта встроили в модуль и править там нельзя, проще создать собственный отчёт на нужных данных.

Видимость и условное отображение колонок

Колонка может быть, но не нужна всем одновременно. Есть три инструмента.

Свойство «Видимость» из кода

Элементы.ТаблицаКомментарий.Видимость = ПоказыватьКомментарии;

Процедуру ставят в ПриСозданииНаСервере или в обработчик изменения флажка. Если колонка скрыта через свойство, пользователь не сможет вернуть её через настройку формы: поле исчезает совсем.

Пользовательская настройка списка

Пользователь сам может спрятать и показать колонки: в командной панели списка выберите «Ещё → Изменить форму» (в интерфейсе «Такси» команды настройки формы доступны в меню «Ещё») и отметьте нужные колонки. Эти настройки хранятся для пользователя и не меняют конфигурацию.

Условное оформление

Если колонку нужно скрывать или подсвечивать по условию, подходит условное оформление на форме: в конфигураторе откройте форму, закладка «Условное оформление», добавьте строку и задайте условие и оформляемое поле. Для видимости используйте свойство оформления «Видимость». В отчётах на СКД тот же механизм настраивается в условном оформлении варианта отчёта.

Для разных ролей удобнее задавать видимость по роли: проверьте право РольДоступна("ИмяРоли") в ПриСозданииНаСервере и меняйте Видимость.

Проверка после добавления колонки
Выполнено: 0 / 6

Типичные ошибки

Колонка добавлена, а в форме пустая: в динамическом списке поле не вошло в запрос или не отмечено на закладке настройки списка.

Колонка есть в схеме, но не в отчёте: поле не добавлено в выбранные поля настроек варианта. Схема описывает доступные поля, а не те, что выводятся.

Ошибка при вызове ИзменитьРеквизиты: метод выполняется только на сервере, и его нельзя вызывать для реквизитов, на которые завязан основной реквизит формы. Проверьте контекст процедуры: нужна директива &НаСервере.

Новое поле в табличном документе съезжает: данные записаны в ячейки без учёта объединений. Если в области есть объединённые ячейки, пишите в верхнюю левую ячейку объединения.

Пользователь не видит колонку после обновления: сохранённая пользовательская настройка списка перекрывает значения по умолчанию. Сбросьте настройку формы в режиме предприятия, команда находится в меню «Ещё → Изменить форму».

Частые вопросы

Можно ли добавить колонку в типовой отчёт без конфигуратора?
Только если поле уже есть в наборе данных. Тогда его добавляют в выбранные поля настроек отчёта. Новое вычисляемое поле без конфигуратора не создать.
Нужен ли монопольный доступ для добавления колонки?
Для обновления структуры хранения (новый реквизит) нужен. Для настройки отчёта и видимости полей из пользовательского режима — нет.
Колонка из `ИзменитьРеквизиты` сохраняется в базу?
Нет. Реквизит формы живёт, пока открыта форма. Для хранения в базе нужен реквизит объекта.
Чем вычисляемое поле отличается от ресурса в СКД?
Вычисляемое поле считается для каждой строки результата. Ресурс агрегирует значения по группировкам: сумма, количество, максимум.
Можно ли сделать колонку видимой только для части пользователей?
Да. Проверьте право роли в ПриСозданииНаСервере и задайте Видимость элемента формы. Такой способ работает и в расширении.