Своя таблица в базе 1С 8.3: регистр сведений, табличная часть или таблица значений

· 10 мин

Содержание

Чтобы создать таблицу в 1С Конфигураторе, добавьте объект метаданных: для отдельной таблицы с ключом — регистр сведений , для строк внутри документа или справочника — табличную часть. Затем нажмите F7 (Конфигурация → Обновить конфигурацию базы данных), и платформа сама создаст таблицу в СУБД. Если таблица нужна только на время работы кода, её создают программно: Новый ТаблицаЗначений или временная таблица в запросе.

Частое заблуждение разработчиков, пришедших из SQL: искать в Конфигураторе команду «Создать таблицу». Её нет. В 1С вы описываете объект прикладного уровня — справочник, документ, регистр, — а физические таблицы, поля и индексы платформа строит и меняет сама. Руками лезть в базу на SQL Server или PostgreSQL нельзя: следующая реструктуризация всё перезапишет.

Какие таблицы бывают в 1С и какую выбрать

Под словом «таблица» в 1С прячутся очень разные вещи. Одни хранятся в базе постоянно, другие живут в памяти, пока работает процедура.

Что нужноЧем делатьГде живёт
Хранить данные «ключ → значения» без проведенияРегистр сведенийВ базе
Строки товаров, услуг, сотрудников внутри документаТабличная часть документаВ базе
Список значений у элемента справочника (контакты, штрихкоды)Табличная часть справочникаВ базе
Перечень однотипных объектов с иерархией и кодомСправочникВ базе
Промежуточный расчёт в процедуреТаблица значенийВ памяти
Сложный запрос в несколько шаговВременная таблица запросаВ памяти сервера / tempdb
Табличку на форме без записи в базуРеквизит формы типа «ТаблицаЗначений»В данных формы
Данные из чужой SQL-базыВнешний источник данныхВо внешней СУБД
Печатную форму с ячейкамиМакет, табличный документВ конфигурации

Для своих данных в рабочей базе чаще всего хватает двух вариантов. Регистр сведений — когда записи самостоятельны: курсы, тарифы, настройки, соответствия кодов. Табличная часть — когда строки не имеют смысла без «хозяина»: без документа строки товаров никому не нужны.

Какая таблица нужна в вашем случае?

Создание таблицы в Конфигураторе пошагово на примере регистра сведений

Возьмём задачу: хранить для каждого склада и номенклатуры минимальный остаток. Это классическая «просто таблица» с ключом из двух полей.

Подготовка конфигурации

  1. Сделайте резервную копию базы : Администрирование → Выгрузить информационную базу в Конфигураторе.
  2. Откройте дерево метаданных: Конфигурация → Открыть конфигурацию.
  3. Если это типовая конфигурация на поддержке, решите, куда добавлять объект. Правильный путь — расширение конфигурации (Конфигурация → Расширения конфигурации). В современных версиях платформы 8.3 в расширении можно создавать собственные справочники, документы и регистры, а типовая остаётся на полной поддержке.

Если всё же добавляете объект прямо в типовую, придётся включить возможность изменения в настройках поддержки. После этого каждое обновление превращается в сравнение и объединение. Не снимайте конфигурацию с поддержки «чтобы было быстрее» без согласования с тем, кто её обновляет.

Создание объекта

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

Колонки таблицы

На вкладке Данные добавьте поля:

  • 🔑 Измерения — ключ таблицы: Склад (тип СправочникСсылка.Склады) и Номенклатура (СправочникСсылка.Номенклатура). Двух записей с одинаковым набором измерений в регистре быть не может.
  • 📊 Ресурсы — то, что храним: МинимальныйОстаток, тип «Число», длина 15, точность 3.
  • 📝 Реквизиты — дополнительная информация, не входящая в ключ: например, Комментарий, строка 150.

Формы, права и интерфейс

  1. На вкладке Формы можно ничего не создавать: платформа сгенерирует формы списка и записи автоматически. Свою форму делают, когда нужна особая раскладка.
  2. На вкладке Подсистемы отметьте раздел, где регистр появится в командном интерфейсе.
  3. Откройте роли пользователей и выдайте права на новый объект. В типовых роль полных прав обычно получает права на новые объекты сама, а пользовательские роли — нет.
  4. Нажмите F7. Платформа покажет список изменений структуры и создаст таблицу.

После этого запустите 1С:Предприятие (F5) и проверьте, что регистр открывается и записи сохраняются.

Колонки: типы данных, длина, индексы и проверка заполнения

От настройки колонок зависит и размер базы, и скорость отборов. Основные типы и их параметры:

ТипЧто задаётеНа что обратить внимание
СтрокаДлину, фиксированная или переменнаяДлина 0 означает неограниченную строку. По ней нельзя сравнивать в условии запроса через = и упорядочивать
ЧислоДлину, точность, «Неотрицательное»Сумма — обычно 15.2, количество — 15.3. Неотрицательность платформа проверяет при записи
ДатаСостав: дата, время или дата и времяДля «даты документа» берите только дату, иначе отбор по дню начнёт промахиваться
Булево—Значение по умолчанию — Ложь
СсылочныйКонкретный справочник, документ, перечислениеХранит ссылку, а не текст: переименование элемента не ломает данные
СоставнойНесколько типов сразуУдобно, но платформа создаёт под поле несколько колонок в СУБД; не злоупотребляйте
ХранилищеЗначения—Для файлов и картинок. В запросах не отбирается и не сортируется

Ещё три свойства поля, которые стоит выставлять осознанно:

  • ✅ Проверка заполнения = «Выдавать ошибку» — платформа не даст записать объект с пустым полем.
  • ⚡ Индексировать — платформа строит индекс в СУБД. Ставьте на поля, по которым часто отбирают или соединяют. Вариант «Индексировать с доп. упорядочиванием» полезен, если список часто сортируют по этому полю.
  • 🔗 Связи параметров выбора и Параметры выбора — ограничивают, что пользователь может выбрать: например, только склады текущей организации.

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

Табличная часть справочника или документа

Табличная часть — это вложенная таблица объекта. В СУБД это отдельная таблица, связанная со шапкой ссылкой на объект, но для разработчика она выглядит как свойство документа.

Как добавить

  1. Откройте окно редактирования документа или справочника, вкладка Данные.
  2. В блоке Табличные части нажмите кнопку добавления и задайте имя, например Товары.
  3. Внутри табличной части добавьте реквизиты: Номенклатура, Количество, Цена, Сумма.
  4. Поле НомерСтроки создавать не нужно: платформа ведёт его сама.
  5. Откройте форму объекта и перетащите табличную часть из дерева реквизитов в дерево элементов формы. Появится поле таблицы с колонками.
  6. F7 — обновить конфигурацию базы данных.

Работа с табличной частью в коде

// На сервере, в модуле объекта или с полученным объектом
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество   = 2;
НоваяСтрока.Цена         = 1500;
НоваяСтрока.Сумма        = НоваяСтрока.Количество * НоваяСтрока.Цена; // 3000

ИтогоСумма = ДокументОбъект.Товары.Итог("Сумма");

В запросе табличная часть доступна как отдельный источник: Документ.ПоступлениеТоваровУслуг.Товары. Поле Ссылка в ней указывает на документ-владелец.

Табличная часть записывается только целиком вместе с объектом. Если в документе 20 000 строк, любое изменение одной строки перезаписывает все. Для таких объёмов лучше регистр сведений с измерением-ссылкой на документ.

Таблица значений и временные таблицы в коде

Когда хранить ничего не нужно, в метаданных ничего не создают. Таблицу собирают прямо в процедуре.

Таблица значений

Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
Таблица.Колонки.Добавить("Количество",   Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)));
Таблица.Колонки.Добавить("Сумма",        Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));

Строка = Таблица.Добавить();
Строка.Номенклатура = Товар1;
Строка.Количество   = 2;
Строка.Сумма        = 500;

Строка = Таблица.Добавить();
Строка.Номенклатура = Товар1;
Строка.Количество   = 3;
Строка.Сумма        = 750;

// Схлопнуть одинаковую номенклатуру: останется одна строка, 5 шт. на 1250
Таблица.Свернуть("Номенклатура", "Количество, Сумма");

Типизируйте колонки через ОписаниеТипов. Без типа колонка примет что угодно, а запрос, в который вы потом передадите таблицу параметром, упадёт или даст пустой результат.

Таблица значений существует только на сервере и в толстом клиенте. На управляемой форме её хранят в реквизите формы и перекладывают методами формы ДанныеФормыВЗначение() и ЗначениеВРеквизитФормы().

Временная таблица запроса

МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
"ВЫБРАТЬ
|	Т.Номенклатура,
|	Т.Количество
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
|	&Таблица КАК Т
|ИНДЕКСИРОВАТЬ ПО
|	Номенклатура";
Запрос.УстановитьПараметр("Таблица", Таблица);
Запрос.Выполнить();

Теперь ВТ_Товары можно соединять с регистрами в следующих запросах того же менеджера. Это стандартный приём, чтобы не тянуть тысячи строк в цикл.

Практические примеры: от простого к сложному

1. Справочная таблица соответствий. Нужно хранить, какому коду маркетплейса соответствует наша номенклатура. Регистр сведений, непериодический: измерение Номенклатура, ресурс КодМаркетплейса (строка 50, индексировать). Поиск по коду — запрос с отбором по ресурсу.

2. Тарифы с историей. Ставка доставки по зоне меняется раз в квартал. Регистр сведений с периодичностью «В пределах дня», измерение Зона, ресурс Ставка. Актуальное значение на дату берут из виртуальной таблицы СрезПоследних(&Дата), а историю видно в самом регистре.

3. Строки услуг в своём документе. Документ «Акт выполненных работ » с табличной частью Работы: Работа, Часы, Ставка, Сумма. Сумму пересчитывают в обработчике ПриИзменении колонок Часы и Ставка на форме: при 8 часах и ставке 2 000 получится 16 000.

4. Сводная выборка для отчёта. Таблица значений из файла Excel → временная таблица с индексом → соединение с регистром остатков в одном запросе. Цикл по строкам с запросом внутри здесь был бы в десятки раз медленнее.

5. Запись в регистр из кода.

МЗ = РегистрыСведений.МинимальныеОстатки.СоздатьМенеджерЗаписи();
МЗ.Склад        = Склад;
МЗ.Номенклатура = Номенклатура;
МЗ.МинимальныйОстаток = 10;
МЗ.Записать(); // запись с тем же ключом будет заменена

Как не замедлить базу: приёмы для больших таблиц

  • 📏 Длина строк по делу. Строка 1024 там, где хватит 50, раздувает таблицу и индексы. Неограниченные строки — только для текстов и комментариев.
  • 🧩 Меньше составных типов. Каждый тип в составе — отдельные колонки в СУБД и более тяжёлые запросы.
  • ⚡ Индекс только там, где отбирают. Каждый индекс замедляет запись. На регистре, куда пишут тысячи записей в минуту, лишние индексы заметны.
  • 🗂 Порядок измерений. Ставьте первым то измерение, по которому отбирают чаще всего: индекс ключа строится в порядке измерений.
  • 🔍 Узнать, как называется таблица в СУБД. Функция ПолучитьСтруктуруХраненияБазыДанных() возвращает соответствие объектов метаданных и физических имён таблиц и полей. Это нужно, чтобы читать планы запросов и логи СУБД.
  • 🚫 Не писать в таблицы СУБД напрямую. Читать для анализа можно, а изменения в обход платформы ломают целостность и не видны кэшу.

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

Ошибки при создании таблиц и как их избежать

Диагностика: выберите симптом

Ещё одна типичная ловушка — переименование поля после того, как на нём построены отчёты и обработки. Платформа переименует колонку в базе, но строковые обращения в текстах запросов и внешних обработках сами не поменяются. Используйте поиск по конфигурации (Ctrl+Shift+F) перед переименованием.

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

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