Можно ли создать проводку в регистре бухгалтерии без документа-регистратора?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Давайте подробно разберем, возможно ли это технически, как устроена архитектура регистров в 1С и к каким последствиям могут привести попытки обмануть систему.

Архитектура регистров: почему регистратор обязателен?

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

Однако для регистров накопления, регистров расчета и, что важно для нас, регистров бухгалтерии (например, Хозрасчетный), архитектура иная. Согласно документации и физической структуре таблиц базы данных (SQL), каждая запись в этих регистрах обязана иметь ссылку на документ, породивший это движение.

Рассмотрим причины этого ограничения:

  1. Структура базы данных (SQL): В физической таблице регистра бухгалтерии существует поле ссылки на регистратор (часто именуемое _RecorderRRef). Это поле входит в состав кластерного индекса (первичного ключа). СУБД (будь то MS SQL, PostgreSQL или файловая база) технически не позволит записать строку, где это поле равно NULL или пустой ссылке. Это нарушит уникальность и целостность ключа.
  2. Хронология и Период: Записи в бухгалтерии жестко привязаны к оси времени. Позиция документа на оси времени (дата и время с точностью до секунды + ссылка на сам документ) определяет момент, когда изменяются итоги. Без документа платформа теряет контекст хронологии.

Таким образом, создать проводку, у которой поле "Регистратор" вообще не заполнено, средствами платформы невозможно. Платформа просто выдаст ошибку при попытке записи такого набора.

Технический обход: метод "Битая ссылка"

Несмотря на то, что поле "Регистратор" должно быть заполнено, оно может быть заполнено ссылкой на несуществующий объект. Это тот самый метод, о котором часто спрашивают разработчики, желающие обойти систему. Давайте проанализируем, как это реализуется технически, чтобы понять механику процесса.

Суть метода заключается в следующем:

  1. Мы генерируем новый уникальный идентификатор (GUID), которого нет в базе данных.
  2. Создаем на его основе ссылку ("битую" ссылку) нужного типа документа (например, ДокументСсылка.ОперацияБух).
  3. Присваиваем эту ссылку в качестве регистратора для набора записей.
  4. Важный момент: Чтобы платформа разрешила записать набор с ссылкой на несуществующий объект, необходимо отключить контроль ссылочной целостности при записи.

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


// Генерируем новый GUID
НовыйУИД = Новый УникальныйИдентификатор();
// Создаем "битую" ссылку, объекта по этому УИД в базе нет
БитаяСсылка = Документы.ОперацияБух.ПолучитьСсылку(НовыйУИД);

НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(БитаяСсылка);

// Создаем проводку
Движение = НаборЗаписей.Добавить();
Движение.Регистратор = БитаяСсылка;
Движение.Период = ТекущаяДата();
Движение.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.Касса;
Движение.Сумма = 1000;

// Критически важный параметр!
// Отключаем проверки, иначе платформа вызовет исключение "Объект не найден"
НаборЗаписей.ОбменДанными.Загрузка = Истина;

НаборЗаписей.Записать();

Второй вариант, который часто обсуждается — создать реальный документ, записать движения, а затем программно удалить сам документ непосредственно из базы данных (без пометки на удаление, методом Удалить()), оставив записи в регистрах "сиротами". Результат будет идентичен.

Почему так делать нельзя: последствия и риски

Давайте выясним, почему использование "битых" ссылок или удаление регистратора при наличии движений считается грубейшей ошибкой проектирования и администрирования.

1. "Объект не найден" в отчетах

Бухгалтеры, которые просят сделать проводку "без документа", надеются, что она будет невидимой. На самом деле, в Оборотно-сальдовой ведомости, Карточке счета и других отчетах такая проводка будет выглядеть как ошибка. В поле документа будет красоваться надпись <Объект не найден> (84a56...). Для любого аудитора или главного бухгалтера это "красная тряпка", сигнализирующая о сбое в базе данных.

2. Тестирование и исправление (ТиИ)

В конфигураторе есть штатная процедура "Тестирование и исправление". Одним из пунктов проверки является "Проверка ссылочной целостности".

Если запустить ТиИ с настройками по умолчанию (или с настройкой "Очищать ссылки" / "Удалять объект"), платформа обнаружит записи регистра, ссылающиеся на несуществующий документ. Реакция системы будет однозначной:

В любом случае, ваша "секретная" проводка либо исчезнет, исказив учет, либо станет явной.

3. Проблемы с пересчетом итогов

Таблица итогов регистра бухгалтерии рассчитывается на основе таблицы движений. Наличие некорректных ссылок может привести к ошибкам в алгоритмах получения виртуальных таблиц (Остатки, Обороты) или к аварийному завершению процесса пересчета итогов.

4. Ошибки пользовательского интерфейса

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

Правильные способы решения задачи

Если перед вами стоит задача внести корректировки в учет, не стоит бороться с архитектурой платформы. Рассмотрим легитимные методы:

  1. Документ "Операция" (Ручная операция): Это штатный механизм для ввода любых проводок. Если нужно скрыть факт ручного вмешательства от рядовых пользователей, используйте механизм прав доступа (RLS - Record Level Security) или переместите документ в закрытый период/папку, но не удаляйте его.
  2. Документ "Корректировка регистров": В некоторых конфигурациях (например, ERP или УТ) существует специальный документ для прямой записи в регистры. Он выступает законным регистратором.

Подводя итог: создать проводку без регистратора невозможно. Создать проводку с "битым" регистратором технически возможно, но это создает мину замедленного действия, которая обязательно сработает при первой же проверке базы или пересчете итогов. Мы настоятельно рекомендуем использовать только штатные документы-регистраторы.

← На главную