Своя таблица в базе 1С 8.3: регистр сведений, табличная часть или таблица значений
Содержание
Чтобы создать таблицу в 1С Конфигураторе, добавьте объект метаданных: для отдельной таблицы с ключом — регистр сведений
, для строк внутри документа или справочника — табличную часть. Затем нажмите F7 (Конфигурация → Обновить конфигурацию базы данных), и платформа сама создаст таблицу в СУБД. Если таблица нужна только на время работы кода, её создают программно: Новый ТаблицаЗначений или временная таблица в запросе.
Частое заблуждение разработчиков, пришедших из SQL: искать в Конфигураторе команду «Создать таблицу». Её нет. В 1С вы описываете объект прикладного уровня — справочник, документ, регистр, — а физические таблицы, поля и индексы платформа строит и меняет сама. Руками лезть в базу на SQL Server или PostgreSQL нельзя: следующая реструктуризация всё перезапишет.
Какие таблицы бывают в 1С и какую выбрать
Под словом «таблица» в 1С прячутся очень разные вещи. Одни хранятся в базе постоянно, другие живут в памяти, пока работает процедура.
| Что нужно | Чем делать | Где живёт |
|---|---|---|
| Хранить данные «ключ → значения» без проведения | Регистр сведений | В базе |
| Строки товаров, услуг, сотрудников внутри документа | Табличная часть документа | В базе |
| Список значений у элемента справочника (контакты, штрихкоды) | Табличная часть справочника | В базе |
| Перечень однотипных объектов с иерархией и кодом | Справочник | В базе |
| Промежуточный расчёт в процедуре | Таблица значений | В памяти |
| Сложный запрос в несколько шагов | Временная таблица запроса | В памяти сервера / tempdb |
| Табличку на форме без записи в базу | Реквизит формы типа «ТаблицаЗначений» | В данных формы |
| Данные из чужой SQL-базы | Внешний источник данных | Во внешней СУБД |
| Печатную форму с ячейками | Макет, табличный документ | В конфигурации |
Для своих данных в рабочей базе чаще всего хватает двух вариантов. Регистр сведений — когда записи самостоятельны: курсы, тарифы, настройки, соответствия кодов. Табличная часть — когда строки не имеют смысла без «хозяина»: без документа строки товаров никому не нужны.
Создание таблицы в Конфигураторе пошагово на примере регистра сведений
Возьмём задачу: хранить для каждого склада и номенклатуры минимальный остаток. Это классическая «просто таблица» с ключом из двух полей.
Подготовка конфигурации
- Сделайте резервную копию базы
:
Администрирование → Выгрузить информационную базув Конфигураторе. - Откройте дерево метаданных:
Конфигурация → Открыть конфигурацию. - Если это типовая конфигурация на поддержке, решите, куда добавлять объект. Правильный путь — расширение конфигурации
(
Конфигурация → Расширения конфигурации). В современных версиях платформы 8.3 в расширении можно создавать собственные справочники, документы и регистры, а типовая остаётся на полной поддержке.
Если всё же добавляете объект прямо в типовую, придётся включить возможность изменения в настройках поддержки. После этого каждое обновление превращается в сравнение и объединение. Не снимайте конфигурацию с поддержки «чтобы было быстрее» без согласования с тем, кто её обновляет.
Создание объекта
- В дереве метаданных найдите ветку
Регистры сведений, щёлкните правой кнопкой и выберитеДобавить. - Задайте Имя:
МинимальныеОстатки. Имя начинается с буквы, без пробелов и спецсимволов, — это идентификатор для кода и запросов. - Синоним — то, что увидит пользователь: «Минимальные остатки». Именно синоним выводится в интерфейсе и заголовках форм.
- В свойствах регистра выберите периодичность. Для нашей задачи подойдёт «Непериодический». Если нужно хранить историю (тариф с 1 марта, с 1 июня), выбирают «В пределах дня» или «В пределах месяца».
- Режим записи оставьте «Независимый»: записи вводит пользователь или код, а не документы при проведении.
Колонки таблицы
На вкладке Данные добавьте поля:
- 🔑 Измерения — ключ таблицы:
Склад(типСправочникСсылка.Склады) иНоменклатура(СправочникСсылка.Номенклатура). Двух записей с одинаковым набором измерений в регистре быть не может. - 📊 Ресурсы — то, что храним:
МинимальныйОстаток, тип «Число», длина 15, точность 3. - 📝 Реквизиты — дополнительная информация, не входящая в ключ: например,
Комментарий, строка 150.
Формы, права и интерфейс
- На вкладке
Формыможно ничего не создавать: платформа сгенерирует формы списка и записи автоматически. Свою форму делают, когда нужна особая раскладка. - На вкладке
Подсистемыотметьте раздел, где регистр появится в командном интерфейсе. - Откройте роли пользователей и выдайте права на новый объект. В типовых роль полных прав обычно получает права на новые объекты сама, а пользовательские роли — нет.
- Нажмите
F7. Платформа покажет список изменений структуры и создаст таблицу.
После этого запустите 1С:Предприятие (F5) и проверьте, что регистр открывается и записи сохраняются.
Колонки: типы данных, длина, индексы и проверка заполнения
От настройки колонок зависит и размер базы, и скорость отборов. Основные типы и их параметры:
| Тип | Что задаёте | На что обратить внимание |
|---|---|---|
| Строка | Длину, фиксированная или переменная | Длина 0 означает неограниченную строку. По ней нельзя сравнивать в условии запроса через = и упорядочивать |
| Число | Длину, точность, «Неотрицательное» | Сумма — обычно 15.2, количество — 15.3. Неотрицательность платформа проверяет при записи |
| Дата | Состав: дата, время или дата и время | Для «даты документа» берите только дату, иначе отбор по дню начнёт промахиваться |
| Булево | — | Значение по умолчанию — Ложь |
| Ссылочный | Конкретный справочник, документ, перечисление | Хранит ссылку, а не текст: переименование элемента не ломает данные |
| Составной | Несколько типов сразу | Удобно, но платформа создаёт под поле несколько колонок в СУБД; не злоупотребляйте |
| ХранилищеЗначения | — | Для файлов и картинок. В запросах не отбирается и не сортируется |
Ещё три свойства поля, которые стоит выставлять осознанно:
- ✅ Проверка заполнения = «Выдавать ошибку» — платформа не даст записать объект с пустым полем.
- ⚡ Индексировать — платформа строит индекс в СУБД. Ставьте на поля, по которым часто отбирают или соединяют. Вариант «Индексировать с доп. упорядочиванием» полезен, если список часто сортируют по этому полю.
- 🔗 Связи параметров выбора и Параметры выбора — ограничивают, что пользователь может выбрать: например, только склады текущей организации.
Измерения регистра сведений уже входят в индекс ключа записи. Дополнительный индекс на первое измерение обычно не нужен, а на второе и следующие — если по ним отбирают без первого.
Табличная часть справочника или документа
Табличная часть — это вложенная таблица объекта. В СУБД это отдельная таблица, связанная со шапкой ссылкой на объект, но для разработчика она выглядит как свойство документа.
Как добавить
- Откройте окно редактирования документа или справочника, вкладка
Данные. - В блоке
Табличные частинажмите кнопку добавления и задайте имя, напримерТовары. - Внутри табличной части добавьте реквизиты:
Номенклатура,Количество,Цена,Сумма. - Поле
НомерСтрокисоздавать не нужно: платформа ведёт его сама. - Откройте форму объекта и перетащите табличную часть из дерева реквизитов в дерево элементов формы. Появится поле таблицы с колонками.
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С:Предприятия: там перечислены все объекты конфигурации, на которые у пользователя есть права. Включить пункт можно в параметрах интерфейса.