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