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