Разработка и Конфигурация · 12 мин
Как задать тип колонки таблицы значений в 1С
Как задать тип колонки таблицы значений в 1С: ОписаниеТипов, КвалификаторыЧисла, Строки и Даты, добавление колонок, типичные ошибки и примеры кода.
Таблица значений в 1С — универсальная коллекция для промежуточного хранения и обработки данных: результатов запросов, выгрузок, расчётов. Чтобы колонка корректно хранила данные, сортировалась и участвовала в итогах, ей нужно задать тип. Без явного типа колонка становится «произвольной», и это частый источник ошибок сортировки, сравнения и свёртки таблиц.
Тип колонки задаётся при добавлении колонки методом Колонки.Добавить() через объект ОписаниеТипов. Этот же механизм используется в реквизитах объектов, поэтому, освоив его один раз, вы сможете применять его повсеместно — от табличных частей до динамических списков.
Ниже разобраны создание описания типов, работа с квалификаторами числа, строки и даты, составные типы, изменение типа существующей колонки и типичные ошибки, которые приводят к потере данных или неверным итогам.
Как устроено описание типов колонки
Объект ОписаниеТипов определяет, какие значения может хранить колонка. Создаётся он конструктором Новый ОписаниеТипов(...), куда передаётся либо строка с именами типов через запятую, либо массив типов, либо другое описание типов. Дополнительно указываются квалификаторы — уточнения для числа, строки, даты и двоичных данных.
Имена примитивных типов: "Число", "Строка", "Дата", "Булево". Ссылочные типы указываются полным именем: "СправочникСсылка.Номенклатура", "ДокументСсылка.РеализацияТоваровУслуг", "ПеречислениеСсылка.СтавкиНДС", "ПланСчетовСсылка.Хозрасчетный" и так далее.
Важно понимать: тип колонки — это ограничение при записи значений. Если присвоить колонке с типом «Число» строку, платформа попытается привести значение, а при невозможности запишет значение по умолчанию (ноль). Тихая подмена данных опаснее явной ошибки, поэтому типы стоит задавать осознанно.
Базовый синтаксис: добавление колонки с типом
Метод Колонки.Добавить() принимает параметры: имя колонки, описание типов, заголовок (представление) и ширину. Минимальный вызов — только имя, но тогда колонка получает произвольный тип, что обычно нежелательно.
Типовой пример создания таблицы с типизированными колонками:
ТЗ = Новый ТаблицаЗначений;
КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 2, ДопустимыйЗнак.Неотрицательный);
КвалификаторыСтроки = Новый КвалификаторыСтроки(150, ДопустимаяДлина.Переменная);
ТЗ.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ТЗ.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка", , КвалификаторыСтроки));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число", КвалификаторыЧисла));
ТЗ.Колонки.Добавить("ДатаПоставки", Новый ОписаниеТипов("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата)));
ТЗ.Колонки.Добавить("Обработано", Новый ОписаниеТипов("Булево"));
Обратите внимание на порядок параметров конструктора ОписаниеТипов: типы, квалификаторы числа, квалификаторы строки, квалификаторы даты, квалификаторы двоичных данных. Ненужные позиции пропускаются запятыми, как в примере со строкой и датой.
После добавления колонки проверить её тип можно через ТЗ.Колонки.Найти("Количество").ТипЗначения — свойство вернёт объект ОписаниеТипов, который удобно сравнивать с ожидаемым при отладке.
- 1Создайте таблицу: ТЗ = Новый ТаблицаЗначений
- 2Подготовьте квалификаторы для числа, строки или даты при необходимости
- 3Сформируйте ОписаниеТипов с нужным типом и квалификаторами
- 4Добавьте колонку: ТЗ.Колонки.Добавить(Имя, ОписаниеТипов, Заголовок)
- 5Заполните строки и проверьте тип через Колонки.Найти().ТипЗначения
Квалификаторы числа, строки и даты
КвалификаторыЧисла
Конструктор принимает общую длину числа, число знаков дробной части и допустимый знак. Например, Новый КвалификаторыЧисла(10, 3) — число до 10 разрядов с тремя знаками после запятой. Третий параметр ДопустимыйЗнак.Неотрицательный запрещает отрицательные значения: попытка записать минус даст ноль или ошибку приведения в зависимости от контекста.
Для количества в учётных задачах обычно берут длину 15 и точность 3, для сумм — 15 и 2. Занижать разрядность не стоит: лишние знаки при записи отсекаются без предупреждения, и итоги «поплывут».
КвалификаторыСтроки
Задают максимальную длину и режим: ДопустимаяДлина.Переменная или Фиксированная. Строка нулевой длины в квалификаторе означает неограниченную строку. Для колонок, которые потом попадут в запрос или сравнение, лучше задавать конкретную длину — неограниченные строки хуже участвуют в соединениях и индексировании временных таблиц.
КвалификаторыДаты
Определяют состав даты: ЧастиДаты.Дата, ЧастиДаты.Время или ЧастиДаты.ДатаВремя. Если колонка хранит только календарный день, задайте «Дата» — тогда время будет обрезаться до 00:00:00, что исключит ошибки сравнения дат с разным временем.
Составные типы и ссылочные типы
Колонка может хранить значения нескольких типов. Для этого перечислите их через запятую в строке конструктора: Новый ОписаниеТипов("СправочникСсылка.Номенклатура, СправочникСсылка.Услуги") или Новый ОписаниеТипов("Число, Строка"). Альтернатива — массив объектов Тип: Новый ОписаниеТипов(МассивТипов), что удобно, когда список типов собирается динамически.
Расширить существующее описание можно конструктором на основе другого описания: Новый ОписаниеТипов(ИсходноеОписание, ДобавляемыеТипы, ВычитаемыеТипы). Это стандартный приём, когда нужно к типам колонки результата запроса добавить, например, строку для служебных пометок.
Составной тип ухудшает сортировку и сравнение: значения разных типов упорядочиваются по внутренним правилам платформы, а не по бизнес-логике. Если колонка участвует в Сортировать() или Найти(), предпочтителен одиночный тип.
Способы задания типов
Кратко и читаемо: "Число", "СправочникСсылка.Номенклатура". Подходит для статичного кода, но имя типа легко написать с ошибкой — она всплывёт только в рантайме.
Типы получают через Тип("СправочникСсылка.Номенклатура"). Нужен, когда набор типов вычисляется динамически, но код громоздче.
Новый ОписаниеТипов(Исходное, Добавить, Убрать). Лучший вариант для расширения типов колонок запроса без ручного перечисления.
Изменение типа существующей колонки
Свойство ТипЗначения у колонки доступно только для чтения — напрямую переназначить тип нельзя. Если таблица уже заполнена, а тип нужно изменить, есть два рабочих пути.
Первый — пересоздать колонку: запомнить позицию и заголовок, удалить колонку методом Колонки.Удалить(), добавить новую с нужным типом и скопировать значения из временной структуры. При копировании выполняйте явное приведение, иначе получите значения по умолчанию.
Второй путь — выгрузить колонку в массив (ТЗ.ВыгрузитьКолонку("СтараяКолонка")), пересоздать таблицу целиком с правильными типами и загрузить значения обратно через ЗагрузитьКолонку(). Этот вариант чище, когда меняется несколько колонок сразу.
Отдельный случай — таблица, полученная из запроса (Запрос.Выполнить().Выгрузить()). Её колонки уже типизированы по полям запроса, и менять их типы обычно не нужно: проще привести тип прямо в тексте запроса функцией ВЫРАЗИТЬ(... КАК ЧИСЛО(15,2)).
Проверка результата и отладка типов
После задания типов полезно убедиться, что колонка ведёт себя как ожидается. Быстрая проверка в отладчике или через Сообщить(): выведите ТЗ.Колонки.Сумма.ТипЗначения и результат ТЗ.Итог("Сумма"). Для числовой колонки итог должен считаться корректно; для нетипизированной Итог() может вернуть неожиданный результат или ошибку.
Проверка приведения значений: запишите в тестовую строку заведомо «неудобное» значение — строку в числовую колонку, дату со временем в колонку с частью «Дата» — и посмотрите, что реально сохранилось. Это дешёвый способ обнаружить молчаливое обрезание данных до того, как оно испортит расчёт.
Для составных типов проверяйте метод ТипЗначения.СодержитТип(Тип("Число")) — так код ветвится по фактическому составу, а не по предположениям разработчика.
Как проверить результат
ТипЗначения содержит ровно ожидаемые типы с нужными квалификаторами
Колонка имеет произвольный тип или лишние типы в составе
ТЗ.Итог() возвращает корректную сумму без ошибок
Ошибка или ноль — значения не привелись к числу
Значение сохраняется с ожидаемой точностью и форматом
Данные обрезаются или заменяются значением по умолчанию
Сортировать() упорядочивает значения по бизнес-логике
Порядок непредсказуем из-за составного или произвольного типа
Типичные ошибки и ограничения
Самая частая ошибка — добавление колонки без типа «на потом». Такая колонка принимает любые значения, но ломает сортировку, сравнение в Найти() и итоги. Типизируйте колонки сразу при создании таблицы.
Вторая ошибка — несовпадение типа колонки и типа значений при ЗагрузитьКолонку() или заполнении в цикле. Платформа молча приводит значения, и строка «12,5» в числовой колонке в зависимости от региональных настроек может стать нулём. Приводите значения явно перед записью.
Третья группа проблем — ожидание, что тип колонки влияет на выгрузку в Excel или XML так же строго, как внутри платформы. При сериализации типы могут упрощаться, поэтому формат выгрузки контролируйте отдельно.
Если таблица значений создаётся в нескольких местах модуля, вынесите построение описаний типов в отдельные функции вида ОписаниеСуммы(), ОписаниеСтроки150(). Это убирает дублирование квалификаторов и гарантирует, что колонки с одинаковым смыслом имеют одинаковый тип — критично при последующем объединении таблиц и сравнении.
FAQ
Можно ли задать тип колонки после добавления без пересоздания?
Нет, свойство ТипЗначения доступно только для чтения. Нужно удалить колонку и добавить заново с новым типом, предварительно сохранив значения через ВыгрузитьКолонку(). Значения затем загружаются обратно с явным приведением к новому типу.
Что произойдёт, если не задать тип колонки вообще?
Колонка получит произвольный тип и будет принимать любые значения. Формально это работает, но сортировка смешанных значений, поиск через Найти() и подсчёт итогов могут давать неожиданные результаты, а отладка таких ошибок занимает заметно больше времени, чем явная типизация.
Как задать колонку, хранящую ссылки на любой справочник?
Используйте общий ссылочный тип: Новый ОписаниеТипов("СправочникСсылка") — колонка примет ссылку на любой справочник. Аналогично работают "ДокументСсылка" и "ПеречислениеСсылка". Учтите, что сравнение и поиск по такой колонке будут медленнее, чем по конкретному типу.
Чем отличается ДопустимаяДлина.Переменная от Фиксированная?
Переменная длина хранит строку «как есть» до указанного максимума. Фиксированная дополняет короткие строки пробелами справа до заданной длины, что влияет на сравнение и объём данных. В таблицах значений почти всегда используют переменную длину.
Как скопировать типы колонок из другой таблицы значений?
Пройдите циклом по колонкам источника и добавьте колонки в новую таблицу с тем же описанием: Для Каждого Колонка Из Источник.Колонки Цикл НоваяТЗ.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения, Колонка.Заголовок, Колонка.Ширина) КонецЦикла. Если нужна только структура без данных, подойдёт и метод СкопироватьКолонки().
Влияет ли тип колонки на производительность?
Да, умеренно. Однотипные колонки с корректными квалификаторами быстрее сортируются и сравниваются, а строки ограниченной длины лучше работают при передаче таблицы в запрос как временной таблицы. Составные и произвольные типы замедляют операции поиска и упорядочивания.
Что важно запомнить
Тип колонки задаётся при добавлении через ОписаниеТипов с квалификаторами числа, строки и даты. Тип существующей колонки меняется только пересозданием. Явная типизация защищает от молчаливой потери данных и ошибок сортировки и итогов — задавайте типы сразу при создании таблицы.