Разработка и Конфигурация · 11 мин
Как создать запись в регистре 1С
Как создать запись в регистре 1С: работа с регистрами сведений и накопления вручную, через документ и кодом на встроенном языке. Примеры, ошибки, проверка результата.
Регистры в 1С хранят учётные данные: остатки товаров, цены, курсы валют, сведения о сотрудниках. В отличие от справочников, запись в регистре почти всегда привязана к движению — проведению документа или ручному набору записей. Понимание того, как именно создаётся запись, нужно и разработчику, который пишет проведение, и внедренцу, которому требуется загрузить начальные данные или исправить ошибку учёта.
Способ создания записи зависит от типа регистра. Регистры сведений бывают независимыми (записи добавляются сами по себе) и подчинёнными регистратору (записи появляются только при проведении документа). Регистры накопления всегда подчинены регистратору. Это ключевое различие определяет и интерфейсные возможности, и программный код.
Ниже разобраны все рабочие сценарии: ручное добавление через форму списка, запись через документ-регистратор, программное создание набора записей на встроенном языке, установка цен и курсов через специализированные документы, а также проверка результата и типичные ошибки.
Как определить, каким способом создавать запись
Прежде чем писать код или искать кнопку «Добавить», откройте регистр в конфигураторе и посмотрите его свойства. Для регистра сведений важны два параметра: «Режим записи» (независимый или подчинён регистратору) и «Периодичность» (непериодический, в пределах секунды, дня, месяца и т.д.). Для регистра накопления важен вид: «Остатки» или «Обороты».
Независимый регистр сведений (например, «Курсы валют» или «Штрихкоды номенклатуры») заполняется напрямую. Подчинённый регистр (например, «Цены номенклатуры» в типовых конфигурациях) требует документа-регистратора — чаще всего это специализированный документ вроде «Установка цен номенклатуры». Регистры накопления («Товары на складах», «Взаиморасчёты») заполняются только движениями документов.
Как выбрать способ
Ручное создание записи в независимом регистре сведений
Самый простой сценарий. В режиме «1С:Предприятие» откройте регистр через главное меню: «Все функции» → «Регистры сведений» → нужный регистр. Если пункт «Все функции» не отображается, включите его: «Сервис» → «Параметры» → флажок «Отображать команду "Все функции"».
В открывшемся списке нажмите «Создать» (или клавишу Insert), заполните измерения и ресурсы, затем нажмите «Записать и закрыть». Для периодического регистра обязательно укажите поле «Период» — от него зависит, какое значение будет действовать на конкретную дату.
Учтите ограничение: если у регистра включён режим подчинения регистратору, кнопка «Создать» в форме списка будет недоступна или запись не сохранится без регистратора. Это не ошибка интерфейса, а ограничение платформы.
Создание записи через документ-регистратор
Для подчинённых регистров правильный путь — документ. В типовых конфигурациях для этого предусмотрены специальные документы: «Установка цен номенклатуры» пишет в регистр цен, «Ввод начальных остатков» — в регистры накопления, «Кадровый перевод» — в кадровые регистры сведений.
Порядок действий: создайте документ нужного вида, заполните табличную часть или реквизиты, проведите документ. При проведении платформа автоматически формирует набор записей регистра и присваивает каждой записи ссылку на регистратор. Проверить результат можно из формы документа: кнопка «Ещё» → «Движения документа» (в управляемых формах) покажет все созданные записи по регистрам.
Если документ проводится, но движений нет — смотрите раздел про ошибки ниже: чаще всего проблема в процедуре ОбработкаПроведения или в снятом флажке «Проведение» у документа.
Программное создание записи кодом
Для независимого регистра сведений используйте менеджер записи — он удобен, когда нужно добавить или изменить одну запись:
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДатаСеанса();
МенеджерЗаписи.Валюта = Справочники.Валюты.НайтиПоКоду("840");
МенеджерЗаписи.Курс = 90.5;
МенеджерЗаписи.Записать();
Для массовой загрузки или для регистра, подчинённого регистратору, используйте набор записей. Набор обязательно требует установки отбора по регистратору, иначе метод Записать() завершится ошибкой:
НаборЗаписей = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ДокументСсылка.Дата;
НоваяЗапись.Регистратор = ДокументСсылка;
НоваяЗапись.ВидДвижения = ВидДвиженияНакопления.Приход;
НоваяЗапись.Номенклатура = НоменклатураСсылка;
НоваяЗапись.Склад = СкладСсылка;
НоваяЗапись.Количество = 10;
НаборЗаписей.Записать();
Ключевые моменты кода: для регистра накопления обязательно указывайте ВидДвижения (Приход или Расход), Период и все измерения. Поле Регистратор платформа обычно подставляет автоматически из отбора, но явное присваивание не мешает. Метод Записать() по умолчанию полностью замещает существующий набор записей регистратора — если нужно добавить к существующим, используйте Записать(Ложь) или сначала прочитайте набор методом Прочитать().
- 1Определите тип регистра и режим записи в конфигураторе
- 2Для независимого регистра создайте менеджер записи или набор без регистратора
- 3Для подчинённого регистра установите отбор набора по документу-регистратору
- 4Заполните период, вид движения (для накопления), измерения и ресурсы
- 5Вызовите Записать() и проверьте результат через движения документа или запрос
Запись из обработчика проведения документа
В собственных конфигурациях записи обычно создаются в процедуре ОбработкаПроведения модуля объекта документа. Там набор записей доступен через коллекцию Движения:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ТоварыНаСкладах.Записывать = Истина;
Для Каждого СтрокаТовара Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТовара.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = СтрокаТовара.Количество;
КонецЦикла;
КонецПроцедуры
Строка Движения.ТоварыНаСкладах.Записывать = Истина обязательна: без неё платформа не запишет набор при проведении. Альтернатива — установить свойство «Записывать» у набора через Движения.ТоварыНаСкладах.Записать() в конце процедуры.
При отладке проведения удобно временно выводить содержимое набора в сообщение: для каждой записи набора формируйте строку с измерениями и ресурсами. Это быстрее, чем каждый раз открывать движения документа в интерфейсе.
Проверка результата и типичные ошибки
После создания записи убедитесь, что она действительно сохранилась и участвует в отчётах. Для регистра сведений откройте список регистра и найдите запись по измерениям. Для регистра накопления сформируйте стандартный отчёт (например, «Остатки товаров») или универсальный отчёт по регистру и проверьте, что суммы и количества изменились на ожидаемое значение.
Альтернативы: когда запись в регистр не нужна
Не каждую задачу стоит решать записью в регистр. Если нужно хранить одно значение на объект (например, комментарий к контрагенту), достаточно дополнительного реквизита справочника. Если данные справочные и редко меняются, подойдёт регистр сведений, но подумайте о периодичности заранее — изменить её после накопления данных сложно.
Для разовой загрузки данных из Excel или другой системы не пишите запись «в лоб»: используйте типовую обработку загрузки данных из табличного документа или универсальный обмен, которые корректно заполняют регистры через документы. Это сохраняет целостность учёта и аудиторский след — всегда видно, каким документом появилась запись.
Что важно запомнить
Способ создания записи определяется режимом регистра: независимый регистр сведений заполняется напрямую, подчинённый — только через регистратор. Программно используйте менеджер записи для одиночных записей и набор записей с отбором по регистратору для движений. Всегда проверяйте результат через движения документа или отчёт и работайте с кодом на копии базы.
Частые вопросы
Почему в форме списка регистра нет кнопки «Создать»?
Регистр подчинён регистратору — платформа запрещает добавлять записи без документа. Создайте документ-регистратор соответствующего вида и проведите его. Узнать регистраторов можно в конфигураторе на закладке «Регистраторы» в свойствах регистра.
Как изменить существующую запись регистра сведений программно?
Создайте менеджер записи, заполните все ключевые поля (период и измерения) значениями существующей записи, вызовите Прочитать(), затем измените ресурсы и вызовите Записать(). Если запись с таким ключом не найдена, Записать() создаст новую.
Чем отличается Записать() от Записать(Ложь) у набора записей?
По умолчанию Записать() замещает весь существующий набор записей регистратора новым содержимым. Записать(Ложь) добавляет записи без замещения — это нужно, когда один документ должен дополнить движения, сформированные другим механизмом. Использовать режим добавления следует осознанно: при перепроведении легко получить дубли.
Можно ли создать запись в регистре накопления без документа?
Штатно — нет: регистры накопления всегда подчинены регистратору. Для ввода остатков и разовых корректировок используйте специальные документы («Ввод начальных остатков», «Корректировка регистров», «Операция» — в зависимости от конфигурации). Это сохраняет прозрачность учёта.
Документ проводится, но записей в регистре нет. Что проверить?
Проверьте: есть ли строка Движения.<ИмяРегистра>.Записывать = Истина в ОбработкеПроведения; не прерывается ли процедура раньше добавления движений (например, по условию или из-за Отказ = Истина); заполнена ли табличная часть, по которой строится цикл; включён ли регистр в список движений документа в конфигураторе.
Как удалить ошибочную запись из регистра?
Для движений документа — распроведите или отмените проведение документа-регистратора, записи удалятся автоматически. Для независимого регистра сведений — удалите запись из формы списка или кодом через набор записей с отбором по измерениям и методом Записать() пустого набора. Не удаляйте записи напрямую из таблиц СУБД.