Создание таблиц в 1С Предприятии: от метаданных до запросов
Содержание
В платформе 1С нет команды вроде CREATE TABLE. Таблица появляется не напрямую, а когда вы добавляете в дерево конфигурации объект метаданных — справочник, документ, регистр. Платформа сама создаёт под него таблицы в СУБД при обновлении базы данных. Работаете вы при этом в Конфигураторе (или в EDT), а структуру правите через окно свойств объекта, а не в SQL.
Дальше по шагам: какой объект выбрать под ваши данные, как наполнить его реквизитами и табличными частями, когда и как индексировать поля и как потом читать эти таблицы запросом. Пути и названия даю для платформы 8.3 с интерфейсом «Такси».
Где хранятся данные: выбор объекта метаданных
Отдельной «таблицы вообще» в прикладном решении не создают. Выбирают объект, смысл которого совпадает с вашими данными. От этого зависят и структура таблиц в СУБД, и готовые механизмы (нумерация, проведение, итоги), которые вы получаете бесплатно.
Коротко по основным прикладным объектам:
- 📁 Справочник — списки условно-постоянных данных: товары, контрагенты, склады, физлица. Есть код, наименование, иерархия, подчинение.
- 📄 Документ — факт хозяйственной жизни на дату: поступление, реализация, начисление. Есть дата, номер, проведение.
- 📊 Регистр сведений — таблица «ключ → значения» с историей или без: цены, курсы, настройки, графики.
- 📈 Регистр накопления — обороты и остатки: количество на складе, взаиморасчёты. Считает итоги сам.
- 🧮 Регистр бухгалтерии — проводки по плану счетов.
- 🏷 План видов характеристик, План счетов , План обмена — специализированные объекты под свои задачи.
Если данные — это просто перечень значений (валюты, статусы, типы), подойдёт справочник. Если это факт с датой, который влияет на учёт, — документ плюс регистр, в который он пишет движения. Хранить обороты в справочнике — классическая ошибка новичка: справочник не умеет считать остатки и не защищён от рассинхрона.
Проектируем структуру: реквизиты, типы и свойства
Создаётся объект так: в дереве конфигурации правый клик по ветке (например, Справочники) → Добавить. В открывшейся форме редактирования на закладке Основные задаёте имя латиницей без пробелов (Nomenklatura) и синоним — то, что увидит пользователь («Номенклатура»).
Поля таблицы — это реквизиты. Закладка Данные → список Реквизиты → кнопка добавления. У каждого реквизита заполняете:
- Имя — идентификатор в коде и запросах.
- Тип — ссылка на другой объект, примитив (
Строка,Число,Дата,Булево) или составной тип. - Для строк — длину и признак «переменная/фиксированная».
- Для чисел — длину и точность (знаки после запятой).
- Для дат — состав: дата, время или дата и время.
Строку без крайней необходимости делайте неограниченной длины осознанно: поле неограниченной длины хранится отдельно и по нему нельзя строить обычный индекс. Для кодов, артикулов, ИНН ставьте разумную фиксированную длину.
Составной тип (включается флажком Составной тип в окне выбора типа) позволяет одному реквизиту хранить значения разных типов — например, ссылку на контрагента или на физлицо. Удобно, но за это платите: такое поле в СУБД разворачивается в несколько колонок, а запросы по нему тяжелее. Не делайте составным то, что по смыслу всегда одного типа.
Стандартные поля — код, наименование, ссылку, пометку удаления — добавлять не нужно, они у объекта уже есть. Для справочника на закладке Данные задаёте только длину кода и длину наименования.
Ещё два свойства, про которые часто забывают:
- Проверка заполнения — ставьте «Выдавать ошибку» для реквизитов, без которых строка бессмысленна (например, контрагент в договоре). Платформа сама не даст записать объект с пустым полем.
- Связи параметров выбора и ведущие — ограничивают список выбора в зависимости от другого поля. Пример: при выборе договора показывать только договоры выбранного контрагента.
Если набор значений известен заранее и не меняется пользователем (способы доставки, фиксированные статусы), заводят предопределённые элементы справочника: закладка Прочее → Предопределённые. К такому элементу можно обращаться из кода по имени, и он не исчезнет случайно — удалить его через интерфейс нельзя.
Перед тем как реквизит пойдёт в рабочую базу, продумайте его тип до конца: сменить тип уже заполненного реквизита без потери или ручной конвертации данных платформа не даст.
Табличные части: таблица внутри документа и справочника
Когда у объекта есть повторяющийся набор строк — список товаров в накладной, состав комиссии в приказе — это табличная часть. По сути вложенная таблица, связанная с «шапкой» объекта.
Добавляется на той же закладке Данные: список Табличные части → добавить → задать имя (Tovary). Внутри табличной части — свой список Реквизиты, с теми же свойствами (имя, тип, длина), что и у реквизитов шапки.
У одного объекта может быть несколько табличных частей. У документа реализации это, скажем, «Товары» и «Услуги»; у справочника сотрудника — «КонтактнаяИнформация». В СУБД под каждую табличную часть создаётся отдельная таблица, связанная с основной по ссылке владельца и номеру строки.
Обращение к табличной части из кода идёт через коллекцию строк:
НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 5;
НоваяСтрока.Цена = 100;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
Итог по колонке табличной части не считайте в цикле вручную, если нужна просто сумма — есть метод Итог: Документ.Товары.Итог("Сумма"). Цикл нужен, когда по каждой строке своя логика.
Когда данных в одной строке становится слишком много разнотипных, это сигнал, что часть реквизитов стоит вынести в отдельный справочник и ссылаться на него, а не плодить колонки.
Индексы: как ускорить выборку из таблиц
Если по реквизиту вы часто ищете, фильтруете или соединяете таблицы в запросе, его стоит проиндексировать. Без индекса СУБД читает таблицу целиком; с индексом — находит нужные строки сразу.
Свойство Индексировать есть у каждого реквизита (в палитре свойств). Значения:
| Значение | Когда ставить |
|---|---|
| Не индексировать | Поле только выводится, по нему не ищут и не соединяют |
| Индексировать | По полю есть отбор, соединение или поиск |
| Индексировать с доп. упорядочиванием | То же + частая сортировка по этому полю (обычно вместе с датой/ссылкой) |
Несколько правил, чтобы индексы помогали, а не мешали:
- ➕ Индексируйте поля, по которым реально есть условия
ГДЕиСОЕДИНЕНИЕ, а не всё подряд. - ➖ Лишний индекс замедляет запись: при каждом изменении строки СУБД обновляет ещё и индекс.
- 🔑 Для составных отборов (часто фильтруете по двум полям сразу) помогает составной индекс — его задают в регистрах через Измерения и их порядок, а также через индексы, определённые на уровне объекта.
- 📅 В регистре сведений порядок измерений важен: по первому измерению отбор работает эффективнее всего, ставьте первым самое селективное.
Поле неограниченной длины и реквизит составного типа индексируются ограниченно. Если по строке нужен быстрый поиск — задайте ей фиксированную длину.
После изменения свойства Индексировать структура индекса в СУБД перестроится при обновлении конфигурации базы данных — об этом последний раздел.
Запросы к таблицам и временные таблицы
Читают данные из таблиц объектов не перебором в цикле, а запросом на языке запросов 1С. Имя таблицы в запросе — это ВидОбъекта.ИмяОбъекта: Справочник.Номенклатура, Документ.РеализацияТоваровУслуг, РегистрНакопления.ТоварыНаСкладах.Остатки.
Простой запрос к справочнику:
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование,
Номенклатура.Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
И НЕ Номенклатура.ЭтоГруппа
УПОРЯДОЧИТЬ ПО
Номенклатура.Наименование
Табличная часть — это отдельная таблица запроса Документ.РеализацияТоваровУслуг.Товары. К шапке она присоединяется по полю Ссылка.
Когда промежуточный результат нужен несколько раз или данные надо передать из одной части алгоритма в другую, его помещают во временную таблицу. Делается это конструкцией ПОМЕСТИТЬ:
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
СУММА(Товары.Количество) КАК Количество
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
Дальше во втором запроса пакета ВТ_Продажи используют как обычную таблицу и при желании соединяют с остатками регистра. Чтобы временные таблицы жили в пределах нескольких запросов, объект Запрос связывают с менеджером временных таблиц:
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Соединение таблиц — через СОЕДИНЕНИЕ ПО. Типичная задача: взять остатки регистра и подтянуть к ним наименование и артикул из справочника номенклатуры:
ВЫБРАТЬ
Остатки.Номенклатура.Наименование КАК Номенклатура,
Остатки.Склад КАК Склад,
Остатки.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки
ГДЕ
Остатки.КоличествоОстаток > 0
Здесь отбор по складу передан прямо в виртуальную таблицу .Остатки, а не навешен через ГДЕ на весь регистр — на больших объёмах разница в скорости кратная.
Пара приёмов, которые отличают рабочий запрос от учебного:
- Виртуальные таблицы регистров (
.Остатки,.Обороты,.ОстаткиИОбороты) берите вместо того, чтобы руками суммировать движения — платформа посчитает итоги оптимально. - Параметры отбора передавайте в саму виртуальную таблицу (в скобках после её имени), а не фильтруйте результат через
ГДЕ— это заметно быстрее на больших данных. - Соединяйте по индексированным полям и по ссылкам, а не по наименованиям.
Сохранение структуры: обновление базы данных
Пока вы добавляете объекты и реквизиты в Конфигураторе, вы меняете только конфигурацию. Реальные таблицы в СУБД ещё не изменились. Чтобы структура применилась, выполните Конфигурация → Обновить конфигурацию
базы данных (горячая клавиша F7). Платформа сравнит изменения со структурой базы и предложит список правок — его видно в окне «Реорганизация информации».
Изменение структуры хранения (новый реквизит, смена типа, новая табличная часть, индекс) требует монопольного доступа к базе: пока идёт реорганизация, другие пользователи в базу не войдут. Поэтому структурные обновления рабочей базы делают в нерабочее время и после резервной копии.
Порядок безопасного обновления рабочей базы:
- Сделайте резервную копию (выгрузка в
.dtили средствами СУБД). - Завершите сеансы пользователей и при необходимости включите блокировку соединений.
- Загрузите изменения (
.cfили.cfeдля расширения) и выполнитеF7. - Проверьте результат на копии до того, как пускать людей.
Отдельно про расширения конфигурации
(доступны с платформы 8.3.6). Они позволяют добавлять свои объекты и реквизиты, не трогая типовую конфигурацию
, — это спасает от проблем на обновлениях типовой. Но загрузка расширения (.cfe) и команда Обновить конфигурацию базы данных — два разных шага: после подключения расширения, меняющего структуру, базу всё равно нужно обновить по F7.
И про динамическое обновление: мелкие правки кода платформа применяет без перезапуска, но изменения структуры данных через динамическое обновление не проходят — нужен полный монопольный F7.
Частые вопросы
Можно ли создать таблицу в 1С напрямую запросом, как `CREATE TABLE` в SQL?
ПОМЕСТИТЬ, и она живёт в пределах запроса или менеджера временных таблиц.Чем табличная часть отличается от отдельного справочника?
Нужно ли индексировать наименование и код?
Почему новый реквизит не появился в базе после сохранения конфигурации?
F7); структурное изменение потребует монопольного доступа.Как передать результат одного запроса в другой?
ПОМЕСТИТЬ ИмяВТ, во втором обращайтесь к ней как к обычной таблице. Для переиспользования между разными объектами Запрос задайте им общий МенеджерВременныхТаблиц.