Новая колонка в 1С: куда добавлять и чем это отличается
Содержание
«Колонка» в 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С в режиме предприятия для проверки.
Добавление реквизита изменяет структуру хранения. Обновление конфигурации базы данных на рабочей базе делайте во внерабочее время и после копии базы: монопольный доступ нужен именно для этой операции.
Колонка в табличной части
Для табличной части процесс тот же: добавьте реквизит внутри табличной части объекта, затем на форме в элементе таблицы появится новое поле. Если колонку нужно заполнять автоматически, подключите обработчик ПриИзменении соседнего поля и пересчитывайте значение в нём.
Колонка на форме без изменения структуры данных
Иногда хранить значение не нужно: оно считается или нужно только на время открытия формы. Тогда колонку создаёт реквизит формы, а не объекта.
В конфигураторе на форме добавьте реквизит формы, и если это колонка существующей таблицы, укажите её как родителя. То же можно сделать динамически в коде:
&НаСервере
Процедура ДобавитьКолонкуНаСервере()
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Комментарий", Новый ОписаниеТипов("Строка"), "Таблица", "Комментарий"));
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
Поле = Элементы.Добавить("ТаблицаКомментарий", Тип("ПолеФормы"), Элементы.Таблица);
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "Таблица.Комментарий";
Поле.Заголовок = "Комментарий";
КонецПроцедуры
Здесь Таблица — реквизит формы типа «Таблица значений» (или другой реквизит-таблица). Третий параметр конструктора РеквизитФормы — путь к родительской таблице, поэтому колонка привязывается именно к ней.
Ограничения:
- 🔹
ИзменитьРеквизитывызывается только на сервере. - 🔹 Метод пересоздаёт данные формы-реквизитов: значения уже существующих реквизитов сохраняются, но обработчики и ссылки, привязанные к их данным, лучше пересобрать после вызова.
- 🔹 Нельзя изменить реквизит, который является основным реквизитом формы, и реквизит, связанный с данными объекта.
Если конфигурация на поддержке: расширение вместо правки
Типовая конфигурация (Бухгалтерия, ЗУП, УТ) обычно стоит на поддержке. Правка типового объекта ломает автоматическое обновление: при каждом новом релизе придётся вручную сливать изменения. Поэтому колонки в типовых объектах добавляют через расширение конфигурации (механизм есть с платформы 8.3.6).
Порядок действий:
- Создайте расширение: «Конфигурация → Расширения конфигурации » в конфигураторе. Дайте имя и префикс, который будет добавлен к именам ваших объектов.
- Заимствуйте объект: в дереве основной конфигурации найдите справочник или документ, в контекстном меню выберите «Добавить в расширение».
- В расширении у заимствованного объекта добавьте реквизит. Он хранится в таблице базы, поэтому структура меняется так же, как при обычной правке.
- Заимствуйте нужную форму и поместите новый реквизит в таблицу или группу полей.
- Загрузите расширение в рабочую базу и обновите конфигурацию базы данных.
Новый реквизит в расширении должен иметь имя с вашим префиксом, чтобы не пересечься с будущими реквизитами разработчика типовой конфигурации.
Загрузка расширения и «Обновить конфигурацию БД» — отдельные операции. Расширение можно загрузить, но колонка не появится, пока структура базы не обновлена.
Для отчётов на СКД расширение работает так же: заимствуйте отчёт, внесите правки в схему. В расширении можно менять только то, что разрешено заимствованием. Если схему отчёта встроили в модуль и править там нельзя, проще создать собственный отчёт на нужных данных.
Видимость и условное отображение колонок
Колонка может быть, но не нужна всем одновременно. Есть три инструмента.
Свойство «Видимость» из кода
Элементы.ТаблицаКомментарий.Видимость = ПоказыватьКомментарии;
Процедуру ставят в ПриСозданииНаСервере или в обработчик изменения флажка. Если колонка скрыта через свойство, пользователь не сможет вернуть её через настройку формы: поле исчезает совсем.
Пользовательская настройка списка
Пользователь сам может спрятать и показать колонки: в командной панели списка выберите «Ещё → Изменить форму» (в интерфейсе «Такси» команды настройки формы доступны в меню «Ещё») и отметьте нужные колонки. Эти настройки хранятся для пользователя и не меняют конфигурацию.
Условное оформление
Если колонку нужно скрывать или подсвечивать по условию, подходит условное оформление на форме: в конфигураторе откройте форму, закладка «Условное оформление», добавьте строку и задайте условие и оформляемое поле. Для видимости используйте свойство оформления «Видимость». В отчётах на СКД тот же механизм настраивается в условном оформлении варианта отчёта.
Для разных ролей удобнее задавать видимость по роли: проверьте право РольДоступна("ИмяРоли") в ПриСозданииНаСервере и меняйте Видимость.
Типичные ошибки
Колонка добавлена, а в форме пустая: в динамическом списке поле не вошло в запрос или не отмечено на закладке настройки списка.
Колонка есть в схеме, но не в отчёте: поле не добавлено в выбранные поля настроек варианта. Схема описывает доступные поля, а не те, что выводятся.
Ошибка при вызове ИзменитьРеквизиты: метод выполняется только на сервере, и его нельзя вызывать для реквизитов, на которые завязан основной реквизит формы. Проверьте контекст процедуры: нужна директива &НаСервере.
Новое поле в табличном документе съезжает: данные записаны в ячейки без учёта объединений. Если в области есть объединённые ячейки, пишите в верхнюю левую ячейку объединения.
Пользователь не видит колонку после обновления: сохранённая пользовательская настройка списка перекрывает значения по умолчанию. Сбросьте настройку формы в режиме предприятия, команда находится в меню «Ещё → Изменить форму».
Частые вопросы
Можно ли добавить колонку в типовой отчёт без конфигуратора?
Нужен ли монопольный доступ для добавления колонки?
Колонка из `ИзменитьРеквизиты` сохраняется в базу?
Чем вычисляемое поле отличается от ресурса в СКД?
Можно ли сделать колонку видимой только для части пользователей?
ПриСозданииНаСервере и задайте Видимость элемента формы. Такой способ работает и в расширении.