В практике программирования на платформе 1С:Предприятие часто возникают нестандартные задачи. Одна из таких ситуаций — требование бухгалтеров или заказчиков создать проводку (запись в регистре бухгалтерии), которая не была бы привязана к конкретному документу. Обычно это мотивируется желанием скрыть исправления или создать "висящие" остатки, у которых нет явного источника.
Давайте подробно разберем, возможно ли это технически, как устроена архитектура регистров в 1С и к каким последствиям могут привести попытки обмануть систему.
Прежде всего, нам необходимо понять, как платформа хранит данные. В 1С существует несколько типов регистров. Для регистров сведений (независимых) наличие регистратора необязательно. Мы можем программно создать запись, указав только измерения и ресурсы.
Однако для регистров накопления, регистров расчета и, что важно для нас, регистров бухгалтерии (например, Хозрасчетный), архитектура иная. Согласно документации и физической структуре таблиц базы данных (SQL), каждая запись в этих регистрах обязана иметь ссылку на документ, породивший это движение.
Рассмотрим причины этого ограничения:
_RecorderRRef). Это поле входит в состав кластерного индекса (первичного ключа). СУБД (будь то MS SQL, PostgreSQL или файловая база) технически не позволит записать строку, где это поле равно NULL или пустой ссылке. Это нарушит уникальность и целостность ключа.Таким образом, создать проводку, у которой поле "Регистратор" вообще не заполнено, средствами платформы невозможно. Платформа просто выдаст ошибку при попытке записи такого набора.
Несмотря на то, что поле "Регистратор" должно быть заполнено, оно может быть заполнено ссылкой на несуществующий объект. Это тот самый метод, о котором часто спрашивают разработчики, желающие обойти систему. Давайте проанализируем, как это реализуется технически, чтобы понять механику процесса.
Суть метода заключается в следующем:
ДокументСсылка.ОперацияБух).Посмотрим на пример кода, демонстрирующий эту логику (исключительно в образовательных целях):
// Генерируем новый GUID
НовыйУИД = Новый УникальныйИдентификатор();
// Создаем "битую" ссылку, объекта по этому УИД в базе нет
БитаяСсылка = Документы.ОперацияБух.ПолучитьСсылку(НовыйУИД);
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(БитаяСсылка);
// Создаем проводку
Движение = НаборЗаписей.Добавить();
Движение.Регистратор = БитаяСсылка;
Движение.Период = ТекущаяДата();
Движение.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.Касса;
Движение.Сумма = 1000;
// Критически важный параметр!
// Отключаем проверки, иначе платформа вызовет исключение "Объект не найден"
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
Второй вариант, который часто обсуждается — создать реальный документ, записать движения, а затем программно удалить сам документ непосредственно из базы данных (без пометки на удаление, методом Удалить()), оставив записи в регистрах "сиротами". Результат будет идентичен.
Давайте выясним, почему использование "битых" ссылок или удаление регистратора при наличии движений считается грубейшей ошибкой проектирования и администрирования.
1. "Объект не найден" в отчетах
Бухгалтеры, которые просят сделать проводку "без документа", надеются, что она будет невидимой. На самом деле, в Оборотно-сальдовой ведомости, Карточке счета и других отчетах такая проводка будет выглядеть как ошибка. В поле документа будет красоваться надпись <Объект не найден> (84a56...). Для любого аудитора или главного бухгалтера это "красная тряпка", сигнализирующая о сбое в базе данных.
2. Тестирование и исправление (ТиИ)
В конфигураторе есть штатная процедура "Тестирование и исправление". Одним из пунктов проверки является "Проверка ссылочной целостности".
Если запустить ТиИ с настройками по умолчанию (или с настройкой "Очищать ссылки" / "Удалять объект"), платформа обнаружит записи регистра, ссылающиеся на несуществующий документ. Реакция системы будет однозначной:
В любом случае, ваша "секретная" проводка либо исчезнет, исказив учет, либо станет явной.
3. Проблемы с пересчетом итогов
Таблица итогов регистра бухгалтерии рассчитывается на основе таблицы движений. Наличие некорректных ссылок может привести к ошибкам в алгоритмах получения виртуальных таблиц (Остатки, Обороты) или к аварийному завершению процесса пересчета итогов.
4. Ошибки пользовательского интерфейса
Если пользователь попытается в отчете дважды кликнуть по строке с такой проводкой (расшифровка), чтобы открыть документ, платформа попытается открыть форму несуществующего объекта. Это приведет к сообщению об ошибке или падению клиентского приложения.
Если перед вами стоит задача внести корректировки в учет, не стоит бороться с архитектурой платформы. Рассмотрим легитимные методы:
Подводя итог: создать проводку без регистратора невозможно. Создать проводку с "битым" регистратором технически возможно, но это создает мину замедленного действия, которая обязательно сработает при первой же проверке базы или пересчете итогов. Мы настоятельно рекомендуем использовать только штатные документы-регистраторы.