Как документ становится регистратором и пишет движения в регистры 1С 8.3
Содержание
Регистратор в 1С — это документ, который записывает движения в регистр. Каждая запись регистра накопления, бухгалтерии или расчёта хранит ссылку на документ-регистратор в стандартном реквизите Регистратор. Отменили проведение документа — его движения удалились. Удалили документ — записи с его ссылкой тоже не останутся.
Типичная ситуация: бухгалтер видит в оборотно-сальдовой ведомости странный остаток на 41 счёте, проваливается в отчёт и находит строку, за которой стоит конкретная «Реализация товаров и услуг». Этот документ и есть регистратор строки. Ниже — как такая связь устроена в конфигураторе, как её настроить и где она чаще всего ломается.
Регистратор в 1С: суть и роль в учёте
В 1С 8.3 данные разделены на два слоя. Документы фиксируют факт хозяйственной жизни: поступление, продажу, начисление зарплаты. Регистры хранят итоговые данные для отчётов: остатки, обороты, проводки, начисления.
Документ при проведении переносит свои данные в регистры. Эти записи называют движениями, а документ — их регистратором. Платформа связывает записи с документом жёстко:
- 📌 у записи регистра есть обязательный реквизит
Регистраторсо ссылкой на документ; - 📌 записи одного регистратора в одном регистре образуют набор записей, его читают и пишут целиком;
- 📌 при повторном проведении старый набор заменяется новым, а не дополняется;
- 📌 при отмене проведения или пометке на удаление движения удаляются (поведение задаёт настройка документа, о ней ниже).
Регистратором в 8.3 может быть только документ. Справочник, обработка или бизнес-процесс движений в регистры с подчинением не пишут. Если нужно записать данные в регистр без документа, используют регистр сведений в независимом режиме.
Регистратор отвечает на вопрос «откуда взялась цифра». Через него из любого отчёта можно дойти до первичного документа, исправить его и перепровести.
Какие регистры подчиняются регистратору: сравнение
«Видами регистраторов» часто называют виды регистров. Точнее говорить так: регистратор всегда один по природе — документ, а регистры по-разному с ним связаны. От вида регистра зависит, обязательна ли эта связь и что именно документ туда пишет.
| Вид регистра | Подчинение регистратору | Что хранит | Пример в типовых |
|---|---|---|---|
| Регистр накопления | Всегда | Остатки и обороты по измерениям | Товары на складах, взаиморасчёты |
| Регистр бухгалтерии | Всегда | Проводки Дт/Кт по плану счетов | Хозрасчётный в БП 3.0 |
| Регистр расчёта | Всегда | Начисления и удержания с периодами действия | Начисления в ЗУП 3.1 |
| Регистр сведений | По выбору: «Независимый» или «Подчинение регистратору» | Значения на дату или без периода | Цены номенклатуры, курсы валют |
У регистра сведений режим задают в свойстве «Режим записи» на вкладке «Данные». В независимом режиме записи можно добавлять вручную или кодом, ссылки на документ нет. В режиме подчинения запись живёт столько, сколько живёт проведение документа.
Для периодического регистра сведений с подчинением доступна периодичность «По позиции регистратора». Тогда период записи берётся из даты документа и его места в последовательности, и два документа с одинаковым временем не конфликтуют.
Переключить регистр сведений из «Независимого» режима в «Подчинение регистратору» на заполненной базе нельзя без потери смысла: у старых записей не будет регистратора. Такие переделки делают через новый регистр и перенос данных обработкой.
Как назначить документ регистратором в конфигураторе
Сценарий: в собственной конфигурации есть регистр накопления «ОстаткиТоваров» (остатки) и документ «ПриходТовара». Нужно, чтобы приход увеличивал остаток.
Шаг 1. Отметить регистр в движениях документа
- Откройте окно редактирования документа «ПриходТовара».
- Перейдите на вкладку «Движения».
- В свойстве «Проведение» оставьте значение «Разрешить».
- В списке регистров отметьте флажком «ОстаткиТоваров».
После этого тип реквизита Регистратор у регистра автоматически дополнится типом ДокументСсылка.ПриходТовара. Руками этот тип не правят.
Шаг 2. Настроить поведение движений
На той же вкладке есть свойства, которые часто оставляют по умолчанию и потом удивляются:
| Свойство | Значения | Что меняет |
|---|---|---|
| Удаление движений | Удалять автоматически / Удалять автоматически при отмене проведения / Не удалять автоматически | Когда платформа сама очищает наборы записей |
| Запись движений при проведении | Записывать выбранные / Записывать модифицированные | Какие наборы пишутся после обработки проведения |
| Оперативное проведение | Разрешить / Запретить | Будет ли документ проводиться «сейчас» с контролем остатков |
Для нового документа обычно достаточно «Удалять автоматически» и «Записывать выбранные». Режим «Не удалять автоматически» встречается в старых типовых: там движения очищает сам код, и если его забыть, при отмене проведения записи останутся в регистре.
Шаг 3. Написать обработку проведения
Нажмите кнопку «Конструктор движений» на вкладке «Движения». Он сформирует процедуру ОбработкаПроведения в модуле объекта. Вручную минимальный код выглядит так:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого СтрокаТЧ Из Товары Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьПриход();
Движение.Период = Дата;
Движение.Номенклатура = СтрокаТЧ.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = СтрокаТЧ.Количество;
КонецЦикла;
КонецПроцедуры
Реквизит Регистратор заполнять не нужно: коллекция Движения уже связана с текущим документом. Платформа подставит ссылку сама и запишет набор после выхода из процедуры.
Шаг 4. Обновить конфигурацию и проверить
Сохраните конфигурацию (Конфигурация → Обновить конфигурацию базы данных или F7), запустите базу в режиме 1С:Предприятие, создайте и проведите документ. Затем откройте список регистра и посмотрите колонку «Регистратор».
Регистраторы на практике: четыре рабочих приёма
Найти все движения конкретного документа
В пользовательском режиме типовых конфигураций на форме документа есть кнопка с пиктограммой «Дт/Кт». Она открывает отчёт «Движения документа» со всеми регистрами, куда документ пишет. В своей конфигурации регистры видны в панели навигации формы документа, если у регистра включены стандартные команды.
В запросе отбор делают так:
ВЫБРАТЬ
Т.Номенклатура,
Т.Количество,
Т.ВидДвижения
ИЗ
РегистрНакопления.ОстаткиТоваров КАК Т
ГДЕ
Т.Регистратор = &Документ
Поле Регистратор проиндексировано платформой, такой отбор работает быстро.
Прочитать и переписать набор записей кодом
Иногда нужно поправить движения без перепроведения: например, при доработке обработки загрузки. Работают через набор записей с отбором по регистратору:
Набор = РегистрыНакопления.ОстаткиТоваров.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);
Набор.Прочитать();
// изменения строк набора
Набор.Записать();
Записать() без параметров заменяет весь набор этого регистратора. Если отбор не установить, запись завершится ошибкой: набор подчинённого регистра без регистратора не пишется.
Ручная правка движений рассинхронизирует документ и регистр. При следующем перепроведении ваши изменения пропадут. Правку делайте на копии базы и только когда понимаете, почему перепроведение не подходит.
Ручная корректировка в БП 3.0
В «Бухгалтерии предприятия» движения можно поправить мышкой. В отчёте «Движения документа» включают флажок «Ручная корректировка», правят проводки и записывают. Документ после этого не перезаписывает движения при перепроведении, пока флажок не снимут. Это удобно для разовых исправлений, но такие документы стоит помнить: групповое перепроведение их не тронет.
Получить реквизиты регистратора в отчёте
Тип реквизита Регистратор составной: в нём столько типов, сколько документов пишут в регистр. Если в запросе обратиться к Регистратор.Дата или Регистратор.Номер, платформа соединит регистр со всеми таблицами документов. На регистре с 30 регистраторами это 30 левых соединений.
Решение — сузить тип через ВЫРАЗИТЬ:
ВЫБРАТЬ
ВЫРАЗИТЬ(Т.Регистратор КАК Документ.ПриходТовара).Поставщик КАК Поставщик,
Т.Количество
ИЗ
РегистрНакопления.ОстаткиТоваров КАК Т
ГДЕ
Т.Регистратор ССЫЛКА Документ.ПриходТовара
А для даты используйте поле Период самого регистра, а не Регистратор.Дата.
Ошибки с регистраторами и как их не допустить
Ещё две ошибки проектирования, которые потом дорого исправлять:
- ❌ Один документ пишет в регистр накопления «чужие» данные, например движения за другой склад по другой дате. Отчёты по регистратору начинают врать, а отмена проведения сносит лишнее.
- ❌ Документ, который проводится раз в месяц и создаёт сотни тысяч строк. Любое перепроведение блокирует большой диапазон регистра. Такой документ лучше разбить, например по подразделениям.
Как ускорить проведение и запросы по регистратору
На небольшой базе всё работает и так. Проблемы появляются, когда в регистр пишут десятки пользователей одновременно.
- Управляемые блокировки. Для документов с контролем остатков в начале проведения ставьте блокировку
БлокировкаДанныхна нужные измерения, а не на весь регистр. - Контроль остатков после записи. Вместо чтения остатков до формирования движений установите
Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина, запишите движения и уже затем запросом проверьте, не ушли ли остатки в минус. При минусе выставитеОтказ = Истина, транзакция откатится. - Разделение итогов. В свойствах регистра накопления включают «Разрешить разделение итогов». Параллельные документы перестают ждать друг друга на одной строке итогов.
- Виртуальные таблицы с периодичностью «Регистратор». В
ОстаткиИОборотыможно задать периодичностьРегистратори получить обороты по каждому документу без ручной группировки. - Минимум полей в движениях. Не дублируйте в регистр реквизиты, которые и так есть в документе: при необходимости их получают через
ВЫРАЗИТЬ.
Отладка движений: чем и как искать ошибку
Отладчик конфигуратора
Поставьте точку останова в ОбработкаПроведения модуля объекта документа и запустите отладку (F5). Проведение идёт на сервере, поэтому в клиент-серверной базе на сервере должна быть включена отладка. В табло посмотрите Движения.ИмяРегистра после цикла: сколько строк сформировано и что в полях.
Консоль запросов
Внешняя обработка «Консоль запросов» помогает выбрать все записи регистра по документу (запрос из раздела про практику) и сравнить с тем, что документ должен был записать. Удобно сразу проверить ВидДвижения и Активность.
Замер производительности
Если документ проводится долго, включите в конфигураторе Отладка → Замер производительности, проведите документ и отключите замер. В результате видно, на какой строке модуля ушло время: обычно это запрос к остаткам или обращение к реквизитам через точку.
Тестирование и исправление информационной базы
Битые ссылки на удалённые регистраторы и записи без документа находит Администрирование → Тестирование и исправление в конфигураторе. Включите проверку логической и ссылочной целостности.
Тестирование с исправлением требует монопольного доступа: пользователей нужно выгнать из базы, их сеансы будут закрыты. Перед запуском сделайте выгрузку .dt.
Сверка после исправлений
После правки кода перепроведите документы за период и сравните остатки по регистру до и после. В БП 3.0 для этого есть групповое перепроведение в разделе «Операции», в своей конфигурации — простая обработка, которая перебирает документы и вызывает Записать(РежимЗаписиДокумента.Проведение).