Новая колонка в табличной части документа или справочника: от реквизита до отчёта

· 10 мин

Содержание

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

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

Сначала решите: правим конфигурацию или делаем расширение

От этого зависит вся дальнейшая работа. Посмотрите, какая у вас конфигурация.

СитуацияЧто делать
Самописная конфигурация, поддержки нетПравите объект напрямую в Конфигураторе
Типовая (БП 3.0, ЗУП 3.1, УТ 11) на поддержкеЛучше расширение конфигурации; прямая правка — только после снятия объекта с поддержки
Файловая учебная или тестовая базаПравите напрямую, это безопасно

Прямая правка типового объекта ведёт к тому, что при обновлении релиза появятся конфликты слияния: в одном месте вы поменяли объект, в другом поменял вендор. Расширение этой проблемы лишено. Оно умеет «заимствовать» объект из основной конфигурации и добавлять в него свои реквизиты, в том числе в табличные части. Расширения доступны начиная с платформы 8.3.6.

Менять структуру метаданных нужно в копии базы. Сначала выгрузите информационную базу в .dt (Администрирование → Выгрузить информационную базу в Конфигураторе), и только потом экспериментируйте. Это единственное место в статье, где нужна резервная копия, потому что дальше вы будете менять структуру хранения данных.

Что понадобится до начала:

  • ✅ Права администратора и доступ в Конфигуратор;
  • ✅ монопольный доступ к базе на момент обновления структуры (пользователи должны выйти);
  • ✅ понимание, к какому объекту относится колонка: документ «Реализация», справочник «Номенклатура», обработка или регистр;
  • ✅ решение о типе данных: число, строка, дата, ссылка на справочник, булево.

Как найти нужный объект

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

Создание реквизита в табличной части

Это основной шаг. Порядок один и тот же для документов, справочников и других объектов с табличными частями.

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

Последний пункт часто забывают. Пока вы не обновили конфигурацию БД, колонка есть в метаданных, но не существует в таблице базы. Запуск в режиме 1С:Предприятие в такой момент либо предложит обновить структуру, либо выдаст ошибку.

Для колонки с подсказкой пользователю заполните поля Синоним и Подсказка. Синоним — это то, что видно в форме, имя — то, что видно в коде. Имя меняют редко, синоним — свободно.

Правила именования

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

Тип данных и свойства колонки

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

ТипКогда братьНа что смотреть
Числосумма, количество, процентдлина и точность, например 15 знаков и 2 после запятой
Строкакомментарий, артикулограниченная длина или неограниченная
Датасрок поставки, дата отгрузкисостав: дата, время или обе части
Булевофлаг «Подарок», «Услуга»отображается как флажок
СправочникСсылка.Имясклад, контрагент, ставкабыстрый выбор и отбор доступны из коробки
Составнойзначение может быть разных видовусложняет запросы, используйте редко

Пример выбора. Колонка «Скидка поставщика» хранит процент. Берём Число, длина 5, точность 2: этого хватит на 100,00. Колонка «Причина возврата» должна быть выбором из списка, поэтому создаём справочник ПричиныВозврата и берём тип СправочникСсылка.ПричиныВозврата. Свободная строка здесь хуже: через месяц у вас окажется десять написаний одного и того же слова, и по этой колонке нельзя будет сгруппировать отчёт.

Свойства, которые стоит выставить сразу

  • Проверка заполнения. «Выдавать ошибку» не даст провести документ с пустой колонкой. Включайте, если значение действительно обязательно.
  • Режим пароля, Маска, Формат — для чисел и строк с особым видом. Формат ЧДЦ=2 задаёт два знака после запятой.
  • Связь по типу и Параметры выбора — когда список значений нужно ограничить. Например, показывать только склады текущей организации.
  • Индексирование — для табличных частей почти не нужно, включать «ради порядка» не стоит.

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

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

Добавили реквизит, запустили 1С, открыли документ, а колонки нет. Это нормально: в управляемых формах поля нужно добавить отдельно.

  1. В Конфигураторе откройте форму объекта: Формы → ФормаДокумента (название зависит от конфигурации).
  2. На закладке Элементы найдите таблицу, в которую входит ваша табличная часть. Обычно у неё имя вроде Товары.
  3. Справа нажмите на Реквизиты, раскройте нужную табличную часть: в списке появится новая колонка.
  4. Перетащите её мышью в группу элементов таблицы под нужный столбец.
  5. В свойствах элемента проверьте Видимость, Только просмотр, Заголовок, Ширина.
  6. Сохраните форму и запустите 1С:Предприятие с отладкой (F5).

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

Колонка в списке документов и в печатной форме

Колонка табличной части не попадает в форму списка автоматически, ведь список строится по реквизитам шапки. Чтобы показать значение из табличной части в списке, нужна динамическая выборка: в форме списка включите свойство Произвольный запрос у основной таблицы динамического списка и допишите запрос с соединением к табличной части. Это уже задача для разработчика: проверьте, что результат не множит строки документа.

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

Сначала убедитесь, что значение вообще нужно показывать в печати. Колонка для внутреннего учёта (скидка поставщика, ответственный сотрудник) в акте чаще лишняя.

Колонка в отчётах и СКД

Новая колонка в отчётах не появится ни у вас, ни у пользователей. Отчёты на СКД строятся по схеме компоновки данных, и поля в ней определяются запросом.

Если отчёт ваш или в расширении, добавляйте так:

  1. В Конфигураторе откройте отчёт и его схему компоновки данных.
  2. На закладке Набор данных найдите запрос по табличной части (например, ВЫБРАТЬ ... ИЗ Документ.РеализацияТоваровУслуг.Товары КАК ТЧ).
  3. В тексте запроса добавьте выбор нового поля: ТЧ.СкидкаПоставщика КАК СкидкаПоставщика.
  4. Нажмите «Ок». Конструктор запроса сам добавит поле в список полей набора.
  5. Включите поле в нужные группы на закладке Настройки: как колонку, группировку или отбор.
  6. Для итогов добавьте ресурс: в закладке Ресурсы выражение вроде Сумма(СкидкаПоставщика) или Среднее(...).

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

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

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

Типовые отчёты, например «Оборотно-сальдовая ведомость», строятся по регистрам. Регистры наполняются при проведении. Значит, если нужная вам информация должна попасть в такой отчёт, мало добавить колонку в документ: нужно ещё и записывать значение в регистр в модуле проведения. Это уже модификация типовой логики, и без разработчика с опытом лучше за неё не браться.

Программное заполнение колонки в существующих документах

После добавления реквизита все строки старых документов получат значение по умолчанию для типа: 0 для числа, пустую строку для строки, пустую дату, Ложь для булева. Часто это устраивает. Если нет, можно заполнить колонку одной обработкой.

Возьмём реальную задачу: у всех строк, где колонка СкидкаПоставщика пуста, нужно поставить 5 процентов.

Выборка = Документы.ПоступлениеТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
    Объект = Выборка.ПолучитьОбъект();
    Изменено = Ложь;
    Для Каждого Строка Из Объект.Товары Цикл
        Если Строка.СкидкаПоставщика = 0 Тогда
            Строка.СкидкаПоставщика = 5;
            Изменено = Истина;
        КонецЕсли;
    КонецЦикла;
    Если Изменено Тогда
        Объект.ОбменДанными.Загрузка = Истина;
        Объект.Записать();
    КонецЕсли;
КонецЦикла;

Что здесь важно:

  • ПолучитьОбъект() возвращает изменяемый объект документа, у выборки самой записи нет.
  • Флаг ОбменДанными.Загрузка = Истина отключает обработчики записи и проверки. Нужен, чтобы массовая правка не запускала бизнес-логику и не ломалась на старых документах с нарушениями.
  • Перепроведения этот код не делает. Если значение влияет на движения по регистрам, их нужно пересчитать отдельно.
  • Запись в цикле на сотни тысяч документов идёт медленно. Разбейте на периоды по датам и запускайте ночью.

Запускайте такой код сначала на копии базы. После записи изменённые документы в рабочей базе откатить можно только восстановлением из резервной копии.

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

Значение по умолчанию для новых строк

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

&НаКлиенте
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    Если НоваяСтрока И Не Копирование Тогда
        Элемент.ТекущиеДанные.СкидкаПоставщика = 5;
    КонецЕсли;
КонецПроцедуры

Для вычисляемой колонки (например, сумма со скидкой) добавьте процедуру пересчёта и вызывайте её из ПриИзменении связанных полей: количества, цены, скидки.

Типичные ошибки при добавлении колонки

  • 🔸 Колонка не видна после запуска. Забыли добавить поле на форму или не обновили конфигурацию БД. Проверьте оба шага.
  • 🔸 Ошибка «Поле объекта не обнаружено». Код или запрос ссылается на имя, которого нет в метаданных, или опечатка в имени. Сравните написание побуквенно, в том числе русские и латинские буквы-двойники (а, е, о, р, с).
  • 🔸 Правка слетела после обновления релиза. Вы меняли типовой объект напрямую. Вынесите доработку в расширение.
  • 🔸 Колонка есть в документе, но не уходит в обмен. Правила обмена данными (РИБ, универсальный обмен) строятся по метаданным и не знают о новом реквизите. Обновите правила и повторите обмен.
  • 🔸 Не хватает ширины. На экране с мелким разрешением таблица прокручивается вбок. Уберите лишние колонки у формы или сделайте их скрытыми по умолчанию, пользователи включат нужные в настройках формы.
  • 🔸 Тип числа слишком мал. Если длина 5 знаков, значение 100000 не влезет и обрежется. Планируйте длину с запасом.

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

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