При программной работе с регистром бухгалтерии разработчики часто сталкиваются с системной ошибкой: «Запись не верна! Поле "Подразделение" должно быть пустым!» (или аналогичным сообщением для других измерений, например, валюты). Эта ошибка блокирует проведение документов, нарушает обмен данными и вызывает массу вопросов на форумах.
В этой статье мы подробно проанализируем природу данной проблемы, выясним причину ее возникновения на уровне базы данных СУБД, сравним различные варианты очистки измерений (Null, Неопределено, пустая ссылка) и разберем по шагам, как правильно исправить эту ошибку в кодовой базе и в уже существующей информационной базе.
Давайте проанализируем ситуацию с точки зрения архитектуры платформы «1С:Предприятие 8». В планах счетов для каждого счета могут быть настроены индивидуальные признаки учета. Одним из таких признаков является Учет по подразделениям (свойство УчетПоПодразделениям у объекта метаданных Счет).
Если для конкретного счета (например, для большинства счетов в базовых или ПРОФ-версиях конфигураций) этот признак отключен, то платформа накладывает жесткое ограничение: в измерениях регистра бухгалтерии ПодразделениеДт и ПодразделениеКт для этой проводки не должно быть никаких данных. Если система обнаруживает там какое-либо значение, при попытке записи набора записей регистра срабатывает стандартная валидация платформы, и транзакция откатывается с ошибкой.
Обычно в пользовательском режиме такая ошибка не возникает, так как стандартные документы конфигураций корректно очищают движения. Проблема заявляет о себе в следующих случаях:
ОбменДанными.Загрузка = Истина стандартные проверки платформы отключаются. В базу записываются некорректные проводки. Ошибка «всплывает» позже — когда пользователь пытается перепровести, скопировать или отредактировать такой документ.Перед тем как писать код очистки измерений, давайте разберем по шагам, какое значение с технической точки зрения является правильным для платформы 1С и СУБД.
Рассмотрим три основных кандидата на роль «пустого» значения:
1. Пустая ссылка (Справочники.ПодразделенияОрганизаций.ПустаяСсылка())
Многие начинающие программисты считают, что раз измерение имеет тип справочника, то лучшим решением будет записать туда пустую ссылку. Это серьезная ошибка! Запись пустой ссылки приводит к следующим негативным последствиям:
2. Значение Неопределено
Принудительное присвоение Неопределено во встроенном языке 1С в некоторых контекстах может сработать без ошибок при записи. Однако на уровне СУБД тип Неопределено отсутствует. Платформа вынуждена транслировать его в специфические структуры таблиц. В ряде случаев ручная запись Неопределено вместо корректного пустого значения ломает логику расчета итогов в виртуальных таблицах остатков и оборотов регистра бухгалтерии, что может приводить к снижению производительности запросов.
3. Значение Null
Это единственный правильный вариант с точки зрения теории баз данных и логики платформы «1С:Предприятие». В СУБД отсутствие значения в поле таблицы всегда хранится как NULL. Когда мы отключаем признак учета по подразделениям на счете, платформа ожидает увидеть в соответствующем поле регистра именно Null.
Посмотрим на пример правильного программного заполнения движений регистра бухгалтерии. При записи проводок необходимо всегда анализировать свойства УчетПоПодразделениям для счетов дебета и кредита.
Рассмотрим подробнее следующий шаблон кода:
Для каждого Запись Из Источник Цикл
// Проверяем счет дебета
Если НЕ Запись.СчетДт.УчетПоПодразделениям Тогда
Запись.ПодразделениеДт = Null;
КонецЕсли;
// Проверяем счет кредита
Если НЕ Запись.СчетКт.УчетПоПодразделениям Тогда
Запись.ПодразделениеКт = Null;
КонецЕсли;
КонецЦикла;
Именно присвоение значения Null гарантирует, что платформа корректно запишет проводки в базу данных, не вызовет ошибку валидации и обеспечит правильное формирование отчетов без дублирования строк и разворота сальдо.
Если вы столкнулись с ситуацией, когда ошибка носит массовый характер в уже работающей базе данных (например, после некорректного переноса данных), решать проблему точечным изменением кода документов может быть слишком долго. Проанализируем три практических способа быстрого исправления ситуации.
Самый надежный и штатный способ исправить логическую целостность базы данных — запустить утилиту тестирования.
Во время проверки платформа автоматически найдет все записи регистра бухгалтерии, где в измерениях присутствуют пустые ссылки или некорректные типы данных на счетах без ведения учета по подразделениям, и принудительно заменит их на физический NULL.
Если ошибка возникает по конкретному счету и мешает работе пользователей прямо сейчас, можно прибегнуть к простому и быстрому приему в пользовательском режиме (при наличии полных прав):
При отключении признака учета платформа в фоновом режиме автоматически запускает транзакцию очистки движений по этому счету во всем регистре бухгалтерии, корректно перезаписывая некорректные значения в Null.
Если вам нужно исправить движения точечно для определенных документов, вы можете написать небольшую внешнюю обработку. Рассмотрим пример кода, который считывает движения документа, проверяет настройки счетов и перезаписывает их в правильном виде:
Процедура ИсправитьДвиженияДокумента(СсылкаНаДокумент)
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
Модифицирован = Ложь;
Для Каждого Запись Из НаборЗаписей Цикл
// Анализируем Дебет
Если ЗначениеЗаполнено(Запись.СчетДт) Тогда
Если НЕ Запись.СчетДт.УчетПоПодразделениям И Запись.ПодразделениеДт <> Null Тогда
Запись.ПодразделениеДт = Null;
Модифицирован = Истина;
КонецЕсли;
КонецЕсли;
// Анализируем Кредит
Если ЗначениеЗаполнено(Запись.СчетКт) Тогда
Если НЕ Запись.СчетКт.УчетПоПодразделениям И Запись.ПодразделениеКт <> Null Тогда
Запись.ПодразделениеКт = Null;
Модифицирован = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Модифицирован Тогда
НаборЗаписей.Записать();
Сообщить("Движения документа " + СсылкаНаДокумент + " успешно исправлены.");
КонецЕсли;
КонецПроцедуры
Использование этого кода позволяет аккуратно обойти проблему «битых» записей без необходимости полного перепроведения документов, что особенно важно в закрытых периодах бухгалтерского учета.
Рекомендуем всегда проверять свойства планов счетов при написании собственных алгоритмов проведения. Это убережет вашу базу данных от логических ошибок, а пользователей — от неожиданных сбоев при работе с системой.