Создание таблиц в 1С Предприятии: от метаданных до запросов

· 9 мин

Содержание

В платформе 1С нет команды вроде CREATE TABLE. Таблица появляется не напрямую, а когда вы добавляете в дерево конфигурации объект метаданных — справочник, документ, регистр. Платформа сама создаёт под него таблицы в СУБД при обновлении базы данных. Работаете вы при этом в Конфигураторе (или в EDT), а структуру правите через окно свойств объекта, а не в SQL.

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

Где хранятся данные: выбор объекта метаданных

Отдельной «таблицы вообще» в прикладном решении не создают. Выбирают объект, смысл которого совпадает с вашими данными. От этого зависят и структура таблиц в СУБД, и готовые механизмы (нумерация, проведение, итоги), которые вы получаете бесплатно.

Коротко по основным прикладным объектам:

  • 📁 Справочник — списки условно-постоянных данных: товары, контрагенты, склады, физлица. Есть код, наименование, иерархия, подчинение.
  • 📄 Документ — факт хозяйственной жизни на дату: поступление, реализация, начисление. Есть дата, номер, проведение.
  • 📊 Регистр сведений — таблица «ключ → значения» с историей или без: цены, курсы, настройки, графики.
  • 📈 Регистр накопления — обороты и остатки: количество на складе, взаиморасчёты. Считает итоги сам.
  • 🧮 Регистр бухгалтерии — проводки по плану счетов.
  • 🏷 План видов характеристик, План счетов , План обмена — специализированные объекты под свои задачи.

Если данные — это просто перечень значений (валюты, статусы, типы), подойдёт справочник. Если это факт с датой, который влияет на учёт, — документ плюс регистр, в который он пишет движения. Хранить обороты в справочнике — классическая ошибка новичка: справочник не умеет считать остатки и не защищён от рассинхрона.

Какой объект метаданных выбрать под данные?

Проектируем структуру: реквизиты, типы и свойства

Создаётся объект так: в дереве конфигурации правый клик по ветке (например, Справочники) → Добавить. В открывшейся форме редактирования на закладке Основные задаёте имя латиницей без пробелов (Nomenklatura) и синоним — то, что увидит пользователь («Номенклатура»).

Поля таблицы — это реквизиты. Закладка Данные → список Реквизиты → кнопка добавления. У каждого реквизита заполняете:

  1. Имя — идентификатор в коде и запросах.
  2. Тип — ссылка на другой объект, примитив (Строка, Число, Дата, Булево) или составной тип.
  3. Для строк — длину и признак «переменная/фиксированная».
  4. Для чисел — длину и точность (знаки после запятой).
  5. Для дат — состав: дата, время или дата и время.

Строку без крайней необходимости делайте неограниченной длины осознанно: поле неограниченной длины хранится отдельно и по нему нельзя строить обычный индекс. Для кодов, артикулов, ИНН ставьте разумную фиксированную длину.

Составной тип (включается флажком Составной тип в окне выбора типа) позволяет одному реквизиту хранить значения разных типов — например, ссылку на контрагента или на физлицо. Удобно, но за это платите: такое поле в СУБД разворачивается в несколько колонок, а запросы по нему тяжелее. Не делайте составным то, что по смыслу всегда одного типа.

Стандартные поля — код, наименование, ссылку, пометку удаления — добавлять не нужно, они у объекта уже есть. Для справочника на закладке Данные задаёте только длину кода и длину наименования.

Ещё два свойства, про которые часто забывают:

  • Проверка заполнения — ставьте «Выдавать ошибку» для реквизитов, без которых строка бессмысленна (например, контрагент в договоре). Платформа сама не даст записать объект с пустым полем.
  • Связи параметров выбора и ведущие — ограничивают список выбора в зависимости от другого поля. Пример: при выборе договора показывать только договоры выбранного контрагента.

Если набор значений известен заранее и не меняется пользователем (способы доставки, фиксированные статусы), заводят предопределённые элементы справочника: закладка Прочее → Предопределённые. К такому элементу можно обращаться из кода по имени, и он не исчезнет случайно — удалить его через интерфейс нельзя.

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

Табличные части: таблица внутри документа и справочника

Когда у объекта есть повторяющийся набор строк — список товаров в накладной, состав комиссии в приказе — это табличная часть. По сути вложенная таблица, связанная с «шапкой» объекта.

Добавляется на той же закладке Данные: список Табличные части → добавить → задать имя (Tovary). Внутри табличной части — свой список Реквизиты, с теми же свойствами (имя, тип, длина), что и у реквизитов шапки.

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

Обращение к табличной части из кода идёт через коллекцию строк:

НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 5;
НоваяСтрока.Цена = 100;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;

Итог по колонке табличной части не считайте в цикле вручную, если нужна просто сумма — есть метод Итог: Документ.Товары.Итог("Сумма"). Цикл нужен, когда по каждой строке своя логика.

Когда данных в одной строке становится слишком много разнотипных, это сигнал, что часть реквизитов стоит вынести в отдельный справочник и ссылаться на него, а не плодить колонки.

Индексы: как ускорить выборку из таблиц

Если по реквизиту вы часто ищете, фильтруете или соединяете таблицы в запросе, его стоит проиндексировать. Без индекса СУБД читает таблицу целиком; с индексом — находит нужные строки сразу.

Свойство Индексировать есть у каждого реквизита (в палитре свойств). Значения:

ЗначениеКогда ставить
Не индексироватьПоле только выводится, по нему не ищут и не соединяют
ИндексироватьПо полю есть отбор, соединение или поиск
Индексировать с доп. упорядочиваниемТо же + частая сортировка по этому полю (обычно вместе с датой/ссылкой)

Несколько правил, чтобы индексы помогали, а не мешали:

  • ➕ Индексируйте поля, по которым реально есть условия ГДЕ и СОЕДИНЕНИЕ, а не всё подряд.
  • ➖ Лишний индекс замедляет запись: при каждом изменении строки СУБД обновляет ещё и индекс.
  • 🔑 Для составных отборов (часто фильтруете по двум полям сразу) помогает составной индекс — его задают в регистрах через Измерения и их порядок, а также через индексы, определённые на уровне объекта.
  • 📅 В регистре сведений порядок измерений важен: по первому измерению отбор работает эффективнее всего, ставьте первым самое селективное.

Поле неограниченной длины и реквизит составного типа индексируются ограниченно. Если по строке нужен быстрый поиск — задайте ей фиксированную длину.

После изменения свойства Индексировать структура индекса в СУБД перестроится при обновлении конфигурации базы данных — об этом последний раздел.

Запросы к таблицам и временные таблицы

Читают данные из таблиц объектов не перебором в цикле, а запросом на языке запросов 1С. Имя таблицы в запросе — это ВидОбъекта.ИмяОбъекта: Справочник.Номенклатура, Документ.РеализацияТоваровУслуг, РегистрНакопления.ТоварыНаСкладах.Остатки.

Простой запрос к справочнику:

ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование,
    Номенклатура.Артикул
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    НЕ Номенклатура.ПометкаУдаления
    И НЕ Номенклатура.ЭтоГруппа
УПОРЯДОЧИТЬ ПО
    Номенклатура.Наименование

Табличная часть — это отдельная таблица запроса Документ.РеализацияТоваровУслуг.Товары. К шапке она присоединяется по полю Ссылка.

Когда промежуточный результат нужен несколько раз или данные надо передать из одной части алгоритма в другую, его помещают во временную таблицу. Делается это конструкцией ПОМЕСТИТЬ:

ВЫБРАТЬ
    Товары.Номенклатура КАК Номенклатура,
    СУММА(Товары.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
    Товары.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
    Товары.Номенклатура

Дальше во втором запроса пакета ВТ_Продажи используют как обычную таблицу и при желании соединяют с остатками регистра. Чтобы временные таблицы жили в пределах нескольких запросов, объект Запрос связывают с менеджером временных таблиц:

МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

Соединение таблиц — через СОЕДИНЕНИЕ ПО. Типичная задача: взять остатки регистра и подтянуть к ним наименование и артикул из справочника номенклатуры:

ВЫБРАТЬ
    Остатки.Номенклатура.Наименование КАК Номенклатура,
    Остатки.Склад КАК Склад,
    Остатки.КоличествоОстаток КАК Количество
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
ГДЕ
    Остатки.КоличествоОстаток > 0

Здесь отбор по складу передан прямо в виртуальную таблицу .Остатки, а не навешен через ГДЕ на весь регистр — на больших объёмах разница в скорости кратная.

Пара приёмов, которые отличают рабочий запрос от учебного:

  • Виртуальные таблицы регистров (.Остатки, .Обороты, .ОстаткиИОбороты) берите вместо того, чтобы руками суммировать движения — платформа посчитает итоги оптимально.
  • Параметры отбора передавайте в саму виртуальную таблицу (в скобках после её имени), а не фильтруйте результат через ГДЕ — это заметно быстрее на больших данных.
  • Соединяйте по индексированным полям и по ссылкам, а не по наименованиям.

Сохранение структуры: обновление базы данных

Пока вы добавляете объекты и реквизиты в Конфигураторе, вы меняете только конфигурацию. Реальные таблицы в СУБД ещё не изменились. Чтобы структура применилась, выполните Конфигурация → Обновить конфигурацию базы данных (горячая клавиша F7). Платформа сравнит изменения со структурой базы и предложит список правок — его видно в окне «Реорганизация информации».

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

Порядок безопасного обновления рабочей базы:

  1. Сделайте резервную копию (выгрузка в .dt или средствами СУБД).
  2. Завершите сеансы пользователей и при необходимости включите блокировку соединений.
  3. Загрузите изменения (.cf или .cfe для расширения) и выполните F7.
  4. Проверьте результат на копии до того, как пускать людей.

Отдельно про расширения конфигурации (доступны с платформы 8.3.6). Они позволяют добавлять свои объекты и реквизиты, не трогая типовую конфигурацию , — это спасает от проблем на обновлениях типовой. Но загрузка расширения (.cfe) и команда Обновить конфигурацию базы данных — два разных шага: после подключения расширения, меняющего структуру, базу всё равно нужно обновить по F7.

И про динамическое обновление: мелкие правки кода платформа применяет без перезапуска, но изменения структуры данных через динамическое обновление не проходят — нужен полный монопольный F7.

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

Можно ли создать таблицу в 1С напрямую запросом, как `CREATE TABLE` в SQL?
Постоянную — нет. Структуру задают только объектами метаданных в Конфигураторе. Запросом создаётся лишь временная таблица через конструкцию ПОМЕСТИТЬ, и она живёт в пределах запроса или менеджера временных таблиц.
Чем табличная часть отличается от отдельного справочника?
Табличная часть жёстко принадлежит своему объекту и не существует без него: строки накладной нужны только внутри этой накладной. Справочник — самостоятельная сущность, на которую ссылаются многие объекты. Повторяющиеся во многих местах данные выносите в справочник, строки конкретного документа оставляйте в табличной части.
Нужно ли индексировать наименование и код?
У стандартных полей (код, наименование) индексы платформа поддерживает сама в зависимости от настроек представления и ввода по строке. Руками индексируйте свои реквизиты, по которым идёт отбор, соединение или поиск в запросах.
Почему новый реквизит не появился в базе после сохранения конфигурации?
Сохранение конфигурации и обновление базы данных — разные операции. После добавления реквизита выполните Обновить конфигурацию базы данных (F7); структурное изменение потребует монопольного доступа.
Как передать результат одного запроса в другой?
Через временную таблицу: в первом запросе пакета добавьте ПОМЕСТИТЬ ИмяВТ, во втором обращайтесь к ней как к обычной таблице. Для переиспользования между разными объектами Запрос задайте им общий МенеджерВременныхТаблиц.
Перед тем как создать таблицу (объект) в 1С
Выполнено: 0 / 6