Первый шаг в 1С — абсолютно бесплатно.
Определение Регистр сведений — это объект метаданных, предназначенный для хранения произвольной информации в разрезе нескольких измерений . На основе этого объекта платформа создаёт в базе данных таблицу, где может храниться любая информация, «привязанная» к набору измерений . Ключевое отличие регистра сведений от регистра накопления: каждое движение регистра сведений устанавливает новое значение ресурса, тогда как движение регистра накопления изменяет существующее значение . Именно поэтому регистр сведений может хранить данные любого типа — не только числовые, но и строковые, ссылочные, даты, булево . Второе важное отличие: регистр сведений может хранить не только актуальные значения, но и историю их изменения во времени. Такой регистр называется периодическим . Когда использовать регистр сведений вместо справочника: если значение реквизита может меняться со временем, и нужно отслеживать историю изменений (например, цены товаров, курсы валют, ставки налогов), справочник не подойдёт — он хранит только последнее значение . В таких случаях используется периодический регистр сведений. |
Состав регистра сведений Структура регистра сведений описывается тремя видами полей : Измерения — это «координаты» или разрезы, в которых хранится информация. Например, в регистре цен измерениями могут быть номенклатура и тип цен. Измерения формируют ключ записи и определяют уникальность . Ресурсы — это основная хранимая информация. В примере с ценами ресурсом будет сама цена товара . Реквизиты — это вспомогательная информация, относящаяся к записи. Например, фамилия менеджера, установившего цену, или комментарий . Вместе с измерениями и ресурсами можно хранить дополнительную произвольную информацию — для этого и служат реквизиты . |
Свойства регистра сведений в конфигураторе При создании регистра сведений в дереве конфигурации заполняются следующие свойства: Имя — идентификатор для обращения из кода. Например: Цены, КурсыВалют. Периодичность — определяет, будет ли регистр хранить историю изменений во времени. Возможные значения: «В пределах секунды», «В пределах дня», «В пределах месяца», «В пределах квартала», «В пределах года», «В пределах регистратора» . Если периодичность не задана, регистр хранит только актуальные значения. Режим записи — определяет способ внесения изменений. Значение «Независимый» означает, что данные вводятся вручную или программно, без привязки к документам. Значение «Подчинение регистратору» означает, что каждая запись связана с документом-регистратором . Представление записи и Представление списка — названия для отображения пользователю. Например: «Цена» и «Цены на номенклатуру» . Основные формы — формы списка и записи. Система может генерировать их автоматически, либо разработчик создаёт собственные . |
Периодичность: как это работает Периодический регистр сведений всегда содержит служебное поле Период типа Дата, добавляемое системой автоматически . Это поле указывает, к какому моменту времени относится запись. При записи данных платформа приводит значение периода к началу того интервала, в который он попадает. Например, если периодичность «В пределах месяца», а в записи указана дата 08.04.2024, регистр сохранит значение периода 01.04.2024 . Это позволяет устанавливать цены «задним числом» или «на будущее» — система сама определит, какая цена действовала на конкретную дату. |
Уникальность записей Система контролирует уникальность записей в регистре сведений. Ключ записи формируется из значений всех измерений и периода (для периодических регистров) . В регистре не может быть двух записей с одинаковым ключом. Это означает, например, что в периодическом регистре цен не может существовать двух записей о цене одной и той же номенклатуры на одну и ту же дату . |
Программная работа с регистром сведений Чтение одной записи (МенеджерЗаписи) Для независимых регистров (не подчинённых регистратору) можно читать отдельные записи через менеджер записи : // Чтение записи по ключу Запись = РегистрыСведений.Цены.СоздатьМенеджерЗаписи(); Запись.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Монитор"); Запись.Период = ТекущаяДата(); Запись.Прочитать(); Сообщить("Цена: " + Запись.Цена);
Получение последнего значения (метод ПолучитьПоследнее) Наиболее частый сценарий — получить актуальное значение ресурса на определённую дату : // Чтение записи по ключу // Получить последнюю цену на текущую дату Отбор = Новый Структура("Номенклатура", СсылкаНаНоменклатуру); ЗначенияРесурсов = РегистрыСведений.Цены.ПолучитьПоследнее(ТекущаяДата(), Отбор); Цена = ЗначенияРесурсов.Цена;
Получение первого значения (самого раннего) (метод ПолучитьПервое()) ЦенаНаНачало = РегистрыСведений.Цены.ПолучитьПервое(НачалоГода(ТекущаяДата()), Отбор).Цена; |
Работа с набором записей Набор записей позволяет обрабатывать множество записей в рамках одной транзакции : // Создание набора Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей(); // Установка отбора (если не установить — перезапишется весь регистр!) Набор.Отбор.Номенклатура.Установить(СсылкаНаНоменклатуру, Истина); Набор.Отбор.Период.Установить(ТекущаяДата(), Истина); // Добавление записи в набор НоваяЗапись = Набор.Добавить(); НоваяЗапись.Период = ТекущаяДата(); НоваяЗапись.Номенклатура = СсылкаНаНоменклатуру; НоваяЗапись.Цена = 15000; // Запись набора в базу Набор.Записать(Истина); // Истина — заменить существующие записи по отбору
Важно: если отбор в наборе не установлен, метод Записать() перезапишет весь регистр. Для периодических регистров обязательно устанавливать отбор по периоду .
Чтение набора записей Набор = РегистрыСведений.Цены.СоздатьНаборЗаписей(); Набор.Отбор.Номенклатура.Установить(СсылкаНаНоменклатуру, Истина); Набор.Прочитать(); Для Каждого Запись Из Набор Цикл Сообщить("Дата: " + Запись.Период + ", Цена: " + Запись.Цена); КонецЦикла; Выгрузка и загрузка набора Набор можно выгрузить в таблицу значений и загрузить обратно : // Выгрузка ТаблицаЗначений = Набор.Выгрузить(); // Загрузка Набор.Загрузить(ТаблицаЗначений); |
Работа с регистром сведений на форме Автоматическая форма списка Система может автоматически сгенерировать форму списка регистра сведений. Пользователь сможет просматривать записи, добавлять новые, удалять, сортировать и отбирать данные . Форма записи Для просмотра и редактирования отдельной записи используется форма записи. Система генерирует её автоматически или разработчик создаёт собственную . Вывод регистра на форму справочника Часто возникает задача показать данные регистра прямо в карточке элемента справочника (например, цены на форму номенклатуры). Реализуется через реквизит формы типа «Набор записей» : &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем набор записей из реквизита формы РСЦены = РеквизитФормыВЗначение("Цены");
// Устанавливаем отбор по текущему элементу РСЦены.Отбор.Номенклатура.Установить(Объект.Ссылка, Истина);
// Читаем данные РСЦены.Прочитать();
// Возвращаем в реквизит формы ЗначениеВРеквизитФормы(РСЦены, "Цены");
КонецПроцедуры Однако: такой подход делает форму справочника «тяжёлой» — при каждом открытии выполняется серверный вызов и чтение регистра . В типовых конфигурациях рекомендуется вместо этого выводить гиперссылку, открывающую отдельную форму списка регистра с отбором . |
Клиент vs Сервер: особенности работы Регистры сведений доступны как на сервере, так и на клиенте, но запись и чтение данных выполняются на сервере. На клиенте можно только вызывать серверные процедуры. Чтение на сервере: &НаСервере Функция ПолучитьЦену(Номенклатура, ДатаЦены) Отбор = Новый Структура("Номенклатура", Номенклатура); Возврат РегистрыСведений.Цены.ПолучитьПоследнее(ДатаЦены, Отбор).Цена; КонецФункции
Вызов с клиента: &НаКлиенте Процедура ЗаполнитьЦену() Цена = ПолучитьЦену(Номенклатура, ДатаДокумента); КонецПроцедуры Для регистров, подчинённых регистратору, чтение текущих значений также выполняется через менеджер регистра. Однако менеджер записи (СоздатьМенеджерЗаписи()) доступен только для независимых регистров . |
Итоговая сводка Регистр сведений — объект для хранения произвольных данных в разрезе измерений с возможностью отслеживания истории изменений во времени. Состав: измерения (разрезы), ресурсы (хранимые значения), реквизиты (дополнительная информация). Периодичность — определяет, хранит ли регистр историю. Если задана, автоматически добавляется поле «Период». Режим записи — «Независимый» (ручной ввод) или «Подчинение регистратору» (записи создаются документами). Ключ записи — совокупность измерений и периода. Регистр не может содержать две записи с одинаковым ключом.
Основные методы: ПолучитьПоследнее(Дата, Отбор) — получить актуальное значение ресурса. ПолучитьПервое(Дата, Отбор) — получить самое раннее значение. СоздатьМенеджерЗаписи() — работа с одной записью (для независимых регистров). СоздатьНаборЗаписей() — работа с множеством записей. Набор.Прочитать() / Набор.Записать() — чтение и запись набора. Важное правило: при записи набора обязательно устанавливать отбор, иначе перезапишется весь регистр. |
Определение Регистр накопления — это прикладной объект конфигурации, предназначенный для накопления числовой информации в разрезе нескольких измерений . Он составляет основу механизма учёта движения средств — финансов, товаров, материалов — и позволяет автоматизировать такие направления, как складской учёт, взаиморасчёты и планирование . Главное отличие регистра накопления от регистра сведений: регистр накопления накапливает числовые данные, тогда как регистр сведений хранит произвольные значения. Каждая запись регистра накопления выполняет изменение хранимых ресурсов — либо добавляет приращение, либо отнимает его. Если происходит увеличение ресурсов, такое движение называется приходом, если уменьшение — расходом . Регистр накопления не предназначен для интерактивного редактирования пользователем. Его модификация производится на основе алгоритмов работы других объектов базы данных — как правило, при проведении документов . Это ключевая особенность: пользователь не редактирует регистр напрямую, а проводит документы, которые формируют движения. Когда использовать регистр накопления: когда нужно быстро получать итоговые значения (остатки или обороты) в разрезе нескольких измерений. Например, остатки товаров на складах в разрезе номенклатуры и склада, или объёмы продаж в разрезе номенклатуры и подразделения . |
Состав регистра накопления Структура регистра накопления описывается несколькими видами полей . Измерения — это разрезы, в которых хранится информация. Набор измерений характеризует уникальность записей и определяет, в каком разрезе накапливаются данные. Например, в регистре остатков товаров измерениями могут быть «Номенклатура» и «Склад» . Ресурсы — это то, что накапливается. Ресурс для регистра накопления может быть только числового типа. Например, «Количество» и «Стоимость» . Реквизиты — это вспомогательная информация, которая не влияет на формирование остатков и оборотов, но может использоваться для анализа движений. Например, комментарий или ссылка на сотрудника, создавшего запись . Кроме того, у каждой записи регистра накопления есть стандартные реквизиты, которые присутствуют автоматически: Период (дата записи), Регистратор (документ, создавший движение), Номер строки (уникален в пределах регистратора), Активность (влияет на попадание записи в виртуальные таблицы) и Вид движения (Приход или Расход) . |
Свойства регистра накопления в конфигураторе При создании регистра накопления в дереве конфигурации заполняются следующие свойства: Имя — идентификатор для обращения из кода. Например: ОстаткиМатериалов, Продажи. Вид регистра — определяет, будет ли регистр хранить остатки или только обороты. Возможные значения: «Остатки» и «Обороты» . Расширенное представление списка — заголовок, отображаемый в окне списка записей регистра. Например: «Движения по регистру Остатки материалов» . Регистраторы — список документов, которые могут создавать движения в этом регистре. Задаётся на вкладке «Регистраторы» или через настройку движений документа . |
Виды регистров накопления Существует два вида регистров накопления . Регистр накопления остатков позволяет хранить как итоговые значения ресурсов — остатки, так и изменения этих ресурсов — обороты. Типичный пример: регистр «ОстаткиМатериалов», который хранит остатки материалов на складах . Регистр накопления оборотов хранит только изменения ресурсов — обороты. Значения остатков для него не имеют смысла. Типичный пример: регистр «Выручка», который накапливает информацию об объёмах продаж за период. Поскольку регистр оборотов не накапливает остатки, для него не имеет значения направление движения — приход или расход. Накапливается только величина изменения ресурса . Выбор вида регистра определяется задачей. Если нужно отвечать на вопрос «сколько осталось?» — используется регистр остатков. Если нужно отвечать на вопрос «сколько было за период?» — достаточно регистра оборотов . |
Связь с регистратором Изменение состояния регистра накопления происходит, как правило, при проведении документа. Поэтому каждая запись регистра связана с определённым документом — регистратором . В общем случае значение поля «Период» может не совпадать с датой документа. Например, документ «План продаж» может внести в регистр записи о предполагаемых продажах несколькими разными датами . Система обеспечивает контроль уникальности записей: в регистре накопления не может находиться двух записей, относящихся к одной и той же строке одного и того же документа . |
Программная работа с регистром накопления Виртуальные таблицы: Остатки и Обороты Основной способ получения данных из регистра накопления — обращение к виртуальным таблицам, которые система рассчитывает автоматически на основе движений . Получение остатков (для регистра вида «Остатки»): // Получить остатки материалов на складах на текущую дату Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.Материал, | Остатки.Склад, | Остатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиМатериалов.Остатки КАК Остатки"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить(Выборка.Материал + " на " + Выборка.Склад + ": " + Выборка.КоличествоОстаток); КонецЦикла;
Получение оборотов (для любого вида регистра): // Получить обороты продаж за январь 2024 Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Обороты.Номенклатура, | Обороты.Клиент, | Обороты.КоличествоОборот, | Обороты.ВыручкаОборот |ИЗ | РегистрНакопления.Продажи.Обороты( | НачалоМесяца(Дата(2024,1,1)), | КонецМесяца(Дата(2024,1,1))) КАК Обороты"; Результат = Запрос.Выполнить();
Виртуальные таблицы позволяют получить остатки или обороты на любой момент времени, с отборами по измерениям и в различных разрезах . |
Формирование движений документа вручную Если конструктор движений не используется, движения можно создать программно в процедуре ОбработкаПроведения : Процедура ОбработкаПроведения(Отказ, Режим)
// Разрешаем запись движений Движения.ОстаткиМатериалов.Записывать = Истина;
// Обходим табличную часть документа Для Каждого ТекСтрока Из Материалы Цикл
// Добавляем новую запись в набор движений Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Материал = ТекСтрока.Материал; Движение.Склад = Склад; Движение.Количество = ТекСтрока.Количество;
КонецЦикла;
КонецПроцедуры
Для расхода вид движения устанавливается как ВидДвиженияНакопления.Расход . |
Использование конструктора движений Платформа содержит конструктор движений, который помогает разработчику создавать алгоритмы проведения документа . В конфигураторе нужно открыть документ, перейти на вкладку «Движения», отметить нужный регистр и нажать кнопку «Конструктор движений». Конструктор автоматически сформирует код в модуле документа, связав поля регистра с реквизитами документа и его табличных частей . Пример кода, который генерирует конструктор : Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Материал = ТекСтрокаМатериалы.Материал; Движение.Склад = Склад; Движение.Количество = ТекСтрокаМатериалы.Количество;
КонецЦикла;
КонецПроцедуры |
Прямое создание набора записей Иногда движения нужно создать не из документа, а программно — например, при начальном заполнении или корректировке : // Создаём набор записей регистра Набор = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей(); // Добавляем запись Запись = Набор.Добавить(); Запись.Период = ТекущаяДата(); Запись.Материал = СсылкаНаНоменклатуру; Запись.Склад = СсылкаНаСклад; Запись.Количество = 100; // Записываем набор Набор.Записать(); |
Работа с регистром накопления на форме Форма списка регистра Система может автоматически сгенерировать форму списка регистра накопления. Она позволяет пользователю просматривать записи, выполнять сортировку и отбор . В форме списка нельзя редактировать записи регистра, но можно анализировать движения . Форма набора записей Форма набора записей позволяет редактировать записи регистра: добавлять, удалять и изменять их. Это может использоваться администратором для корректировки движений . Вывод остатков на форму Часто возникает задача показать остатки прямо на форме — например, остаток денег в кассе на форме журнала документов . Реализуется через реквизит формы и виртуальную таблицу: &НаСервере Функция ПолучитьОстаток()
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.КоличествоОстаток |ИЗ | РегистрНакопления.Касса.Остатки КАК Остатки";
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда Возврат 0; КонецЕсли;
Выборка = Результат.Выбрать(); Выборка.Следующий(); Возврат Выборка.КоличествоОстаток;
КонецФункции
Обращение к базе данных для получения остатков всегда выполняется на сервере, поэтому функция должна иметь директиву &НаСервере . |
Клиент vs Сервер: особенности работы Регистры накопления доступны как на сервере, так и на клиенте, но чтение данных и запись движений выполняются на сервере. На клиенте можно только вызывать серверные процедуры и функции. Чтение остатков на сервере: &НаСервере Функция ПолучитьОстатокМатериала(Материал, Склад)
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Остатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиМатериалов.Остатки( | , Материал = &Материал | И Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("Материал", Материал); Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда Возврат 0; КонецЕсли;
Выборка = Результат.Выбрать(); Выборка.Следующий(); Возврат Выборка.КоличествоОстаток;
КонецФункции
Вызов с клиента: &НаКлиенте Процедура ПоказатьОстаток()
Остаток = ПолучитьОстатокМатериала(ТекущийМатериал, ТекущийСклад); Сообщить("Остаток: " + Остаток);
КонецПроцедуры |
Рекомендации по выбору измерений При создании регистра остатков важно правильно выбрать измерения. Движения регистра могут осуществляться в две стороны: приход и расход. Поэтому в качестве измерений нужно выбирать те данные, по которым движения точно будут происходить в обе стороны . Например, если ведётся учёт материалов в разрезе номенклатуры и склада, и номенклатура, и склад могут быть измерениями, поскольку и приход, и расход материалов всегда осуществляются с указанием конкретной номенклатуры и конкретного склада. Если же нужно отразить учёт в разрезе поставщика, но при расходе материалов поставщик указываться не будет, поставщика следует добавить не как измерение, а как реквизит регистра . Нарушение этого принципа ведёт к непроизводительному использованию ресурсов системы и замедлению работы . |
Итоговая сводка Регистр накопления — объект для накопления числовой информации в разрезе измерений, основа механизма учёта движения средств. Состав: измерения (разрезы), ресурсы (накапливаемые числовые данные), реквизиты (вспомогательная информация). Стандартные реквизиты: Период, Регистратор, Номер строки, Активность, Вид движения. Виды регистров: «Остатки» (хранит остатки и обороты) и «Обороты» (хранит только обороты). Регистратор — документ, создающий движения. Каждая запись связана с регистратором.
Основные способы работы: Виртуальные таблицы Остатки и Обороты — для получения итоговых данных через запрос. Конструктор движений — для автоматической генерации кода проведения документа. Процедура ОбработкаПроведения — для ручного формирования движений. СоздатьНаборЗаписей() — для программной записи движений вне документа. Важное правило выбора измерений: для регистра остатков измерения должны быть такими, чтобы движения по ним происходили в обе стороны — и приход, и расход. |