К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сделать запись в регистр 1С

Как сделать запись в регистр 1С: сведений, накопления и расчёта. Примеры кода на встроенном языке, проверка результата, типичные ошибки и ограничения.

Запись в регистр — одна из базовых операций при разработке и доработке конфигураций 1С. Регистры хранят данные учёта: остатки товаров, курсы валют, сведения о сотрудниках, начисления. В зависимости от типа регистра (сведений, накопления, расчёта, бухгалтерии) используются разные объекты встроенного языка и разные правила заполнения полей.

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

Ключевое отличие, которое нужно понять до начала работы: регистры, подчинённые регистратору, нельзя заполнить «напрямую» произвольной записью. Их строки всегда привязаны к документу-регистратору, и запись выполняется через набор записей этого документа. Независимые регистры сведений, напротив, позволяют добавлять и изменять записи в любой момент.

Какие бывают регистры и как это влияет на запись

В платформе 1С:Предприятие существует четыре вида регистров. Регистры сведений хранят информацию в разрезе измерений (например, цены номенклатуры по видам цен). Регистры накопления хранят остатки и обороты (складские остатки, взаиморасчёты). Регистры расчёта используются для начислений зарплаты. Регистры бухгалтерии хранят проводки по плану счетов.

Два свойства определяют способ записи. Первое — режим записи: «Независимый» или «Подчинение регистратору». Независимые регистры сведений заполняются свободно; подчинённые регистры (все регистры накопления, расчёта, бухгалтерии и часть регистров сведений) пишутся только документами. Второе — периодичность: периодические регистры сведений требуют указания поля «Период», и уникальность записи определяется комбинацией периода и измерений.

Запись в независимый регистр сведений

Это самый простой сценарий. Получите менеджер записи или набор записей через объект РегистрыСведений, заполните измерения и ресурсы, затем выполните запись. Если запись с такой комбинацией измерений (и периода) уже существует, она будет перезаписана.

bsl
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДатаСеанса();
МенеджерЗаписи.Валюта = ВалютаСсылка;
МенеджерЗаписи.Курс = 90.5;
МенеджерЗаписи.Кратность = 1;
МенеджерЗаписи.Записать();

Альтернатива — создание набора записей без отбора и добавление строки методом Добавить(). Такой вариант удобен, когда нужно записать несколько строк за один вызов Записать(): все строки набора попадут в базу в одной транзакции. Учтите: набор без отбора при записи с параметром Замещать = Истина удалит все существующие записи регистра, поэтому для массовых операций чаще используют СоздатьМенеджерЗаписи() или устанавливают отбор.

Запись в регистр, подчинённый регистратору

Движения документов формируются через набор записей с отбором по регистратору. В типовых конфигурациях это делается в процедуре ОбработкаПроведения модуля документа: обращение к коллекции Движения, добавление строк, затем запись. Платформа автоматически запишет движения при проведении, если у набора установлен признак Записывать = Истина.

bsl
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
  Движения.ОстаткиТоваров.Записывать = Истина;
  Для Каждого СтрокаТовара Из Товары Цикл
    Движение = Движения.ОстаткиТоваров.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    Движение.Период = Дата;
    Движение.Номенклатура = СтрокаТовара.Номенклатура;
    Движение.Склад = Склад;
    Движение.Количество = СтрокаТовара.Количество;
  КонецЦикла;
КонецПроцедуры

Для регистра сведений, подчинённого регистратору, логика аналогична: набор создаётся через РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей(), в отборе устанавливается регистратор, строки добавляются методом Добавить(). Попытка записать такой регистр без указания регистратора приведёт к ошибке — платформа не позволит создать «висячую» запись.

Ручная корректировка движений документа

Иногда нужно исправить движения без перепроведения: например, при переносе данных. Для этого набор записей читается методом Прочитать() после установки отбора по регистратору, строки корректируются, и набор записывается обратно. Помните, что такое вмешательство нарушает связь «документ — движения»: при следующем перепроведении документа ручные правки будут затёрты.

Запись в регистр накопления и регистр расчёта

В регистре накопления вида «Остатки» обязательно указывайте вид движения — Приход или Расход, иначе итоги будут сформированы неверно. Для регистра вида «Обороты» вид движения отсутствует. Период движения обычно равен дате документа-регистратора; платформа сама контролирует, чтобы движения не выходили за пределы периода расчёта итогов, если он установлен.

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

Интерактивная запись через режим «1С:Предприятие»

Если нужно внести данные вручную без программирования, откройте регистр через главное меню: «Все функции» → «Регистры сведений» (или соответствующий вид регистра). В независимом регистре сведений доступны кнопки «Создать» и редактирование существующих строк. Заполните поля формы записи и нажмите «Записать и закрыть».

Подчинённые регистры вручную редактируются только из формы документа-регистратора, если в конфигурации предусмотрена такая возможность (например, документ «Операция» или «Корректировка регистров» в типовых решениях). Прямое редактирование движений произвольного документа через «Все функции» возможно, но требует включённого режима технического специалиста и крайне не рекомендуется без понимания последствий.

Порядок действий
  1. 1
    Определите вид регистра и режим записи (независимый или подчинён регистратору) в конфигураторе
  2. 2
    Создайте набор записей или менеджер записи через соответствующий менеджер регистра
  3. 3
    Установите отбор по регистратору, если регистр подчинён документу
  4. 4
    Добавьте запись методом Добавить() и заполните измерения, ресурсы, период и вид движения
  5. 5
    Вызовите Записать() и проверьте результат через форму регистра или запрос

Проверка результата и типичные ошибки

После записи убедитесь, что данные попали в регистр: откройте форму списка регистра в режиме предприятия или выполните запрос в консоли запросов. Для регистров накопления дополнительно проверьте итоги — например, через отчёт «Остатки» или виртуальную таблицу ОстаткиИОбороты. Если запись не появилась, первым делом проверьте, не был ли вызов Записать() отменён исключением в транзакции.

Типичные ошибки
01
Запись набора без отбора — полное замещение или очистка регистра
02
Попытка записать подчинённый регистр без регистратора — ошибка платформы
03
Не указан ВидДвижения для регистра остатков — искажённые итоги
04
Заполнение только ресурсов без измерений — ошибка уникальности или потеря смысла записи
05
Забытый Записывать = Истина в ОбработкеПроведения — документ проводится без движений
06
Изменение записей регистра расчёта напрямую без механизма перерасчётов — устаревшие зависимые начисления
Контрольные точки

Как проверить результат

Наличие записи в регистре
Норма

Строка видна в форме списка регистра с корректными измерениями

Тревожный признак

Записи нет или измерения пустые

Итоги регистра накопления
Норма

Остаток по отчёту изменился на сумму/количество движения

Тревожный признак

Итоги не изменились или ушли в минус без контроля

Связь с регистратором
Норма

При перепроведении документа движения восстанавливаются штатно

Тревожный признак

Движения дублируются или исчезают после перепроведения

Ограничения и безопасная работа

Любые массовые записи в регистры выполняйте сначала на копии базы. В клиент-серверном режиме длительные транзакции записи блокируют работу пользователей с теми же данными, поэтому большие загрузки разбивайте на порции с фиксацией транзакции. При обмене данными учитывайте, что запись регистров может вызывать регистрацию изменений для планов обмена — при необходимости управляйте этим через ПараметрыОбмена объекта набора записей.

Отдельного внимания заслуживают права: пользователь без права «Добавление» и «Изменение» на регистр не сможет выполнить запись ни интерактивно, ни программно (кроме вызовов в привилегированном режиме). Если код «молча» не пишет данные, проверьте роль пользователя и наличие УстановитьПривилегированныйРежим(Истина) там, где это оправдано.

Итог

Что важно запомнить

Запись в регистр 1С выполняется через набор записей или менеджер записи. Независимые регистры сведений пишутся напрямую, подчинённые — только через регистратор. Всегда контролируйте отборы набора, указывайте вид движения для регистров остатков и проверяйте результат по форме регистра и итогам.

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

Чем отличается СоздатьНаборЗаписей() от СоздатьМенеджерЗаписи()?

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

Как удалить запись из регистра?

Для независимого регистра сведений — прочитайте менеджер записи с нужными значениями измерений и вызовите Удалить(). Для набора записей — установите отбор (например, по регистратору или периоду) и вызовите Записать() с пустым набором: записи, попадающие под отбор, будут удалены.

Почему документ проводится, но движений нет?

Наиболее частая причина — не установлен признак Записывать = Истина у набора движений в ОбработкеПроведения. Также проверьте, не очищается ли набор после добавления строк, не срабатывает ли исключение в транзакции проведения и не отключён ли регистр в составе движений документа в конфигураторе.

Можно ли записать данные в регистр прошлой датой?

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

Как записать в регистр из внешней обработки?

Код идентичен: используйте менеджеры регистров и Записать(). Убедитесь, что обработка выполняется в контексте с достаточными правами, а при работе в клиент-серверном режиме тяжёлые операции выносите в серверную процедуру с директивой &НаСервере. Перед массовой записью из обработки сделайте резервную копию базы.