При работе в 1С:Бухгалтерия 8.3 часто возникает ситуация, когда типовые механизмы поиска и замены дублирующихся элементов (например, счетов или контрагентов) отлично справляются со стандартными документами, но выдают критическую ошибку Запись не верна! на доработанных или созданных с нуля объектах. Особенно остро это проявляется, когда бухгалтер пытается объединить два счета в плане счетов, один из которых используется в вашем новом документе.
Ситуация осложняется тем, что при ручном перевыборе значения в документе всё проводится без ошибок, а автоматическая обработка «падает». В этой статье мы детально проанализируем причины такого поведения платформы, разберем влияние режима загрузки данных и выясним, как правильно настроить программный код вашего документа, чтобы избежать подобных конфликтов.
Рассмотрим механизм работы обработки «Поиск и замена дублирующих». В отличие от интерактивного изменения документа пользователем, эта обработка производит замену ссылок программно. При этом для объекта устанавливается специальный режим: ОбменДанными.Загрузка = Истина.
В чем заключается подвох: в этом режиме платформа отключает большинство стандартных проверок в модулях объекта (события ПередЗаписью, ПриЗаписи), чтобы обеспечить быструю запись данных без лишних блокировок. Однако, если ваш самописный документ имеет сложную логику формирования движений непосредственно в модуле объекта, и эта логика не учитывает флаг загрузки, возникает конфликт.
Проанализируем ситуацию: обработка заменила СчетА на СчетБ в реквизите документа. Затем вызывается метод Записать(). Платформа ожидает, что движения по регистру бухгалтерии также будут корректными. Если в коде документа прописано принудительное формирование проводок при каждой записи, документ пытается создать записи в регистре. Если при этом СчетБ имеет другие типы субконто, а код пытается подставить старые значения, платформа выдает ошибку Запись не верна!.
Для исправления этой ситуации в начале каждой процедуры-обработчика событий записи (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) следует добавить проверку:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Далее следует ваша логика проверки данных
КонецПроцедуры
Ошибка Запись не верна! в контексте Регистра Бухгалтерии практически всегда означает нарушение структуры данных набора записей. Выясним, почему это происходит именно при автоматической замене:
СчетА на СчетБ. На новом счете настроены иные виды субконто. При ручной замене в форме документа срабатывают обработчики событий (например, ПриИзменении), которые очищают или пересчитывают аналитику. При программной замене ссылок этого не происходит.Субконто1, Субконто2), а у нового счета порядок видов субконто отличается, платформа заблокирует запись из-за несовпадения типов данных.Чтобы найти проблемное место, рекомендуем подключиться к фоновому заданию (так как обработка замены дублей обычно выполняется в фоне) и в момент возникновения исключения проанализировать коллекцию ЭтотОбъект.Движения.Хозрасчетный. Проверьте типы значений в колонках СубконтоДт1, СубконтоКт1 и их соответствие настройкам в Плане Счетов.
Особое внимание стоит уделить учету по подразделениям в «1С:Бухгалтерии 3.0». Как было отмечено в обсуждении, путаница между Измерением регистра и Видом субконто — частая причина ошибки записи.
Разберем подробнее:
Хозрасчетный подразделение может выступать как общее измерение (если в настройках параметров учета включен учет по подразделениям).Если ваш документ при программной записи через обработку дублей пытается записать значение в измерение Подразделение, которое не предусмотрено для выбранного счета (или наоборот), платформа выдаст ошибку. Посмотрите на пример разницы в именовании реквизитов, который часто сбивает с толку: ПодразделениЕ (измерение) и ПодразделениЯ (вид субконто). Убедитесь, что логика формирования движений в вашем документе четко разделяет эти понятия и проверяет доступность аналитики для конкретного счета.
Поскольку обработка замены дублей работает в фоновом режиме, обычная точка останова в конфигураторе может не сработать. Выполним следующие шаги для диагностики:
ЭтотОбъект.Записать(), значит проблема в данных самого документа или его движениях, которые не соответствуют метаданным (Плану счетов).Чтобы ваш самописный документ корректно работал с обработкой «Поиск и замена дублирующих», необходимо придерживаться следующих правил:
ОбменДанными.Загрузка. Это «золотое правило» разработки в 1С. Если вы не планируете писать специальный код для корректной трансформации движений при замене ссылок, просто прерывайте выполнение кода записи при включенном флаге загрузки.ВидыСубконто счета, чтобы убедиться в допустимости записываемых значений.Таким образом, выполнение простых правил по обработке флага загрузки и внимательный анализ структуры регистра бухгалтерии позволят вам избавиться от ошибки Запись не верна! и обеспечить стабильную работу бухгалтерских инструментов в вашей базе.