Почему при поиске и замене дублей в самописном документе возникает ошибка Запись не верна?

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

При работе в 1С:Бухгалтерия 8.3 часто возникает ситуация, когда типовые механизмы поиска и замены дублирующихся элементов (например, счетов или контрагентов) отлично справляются со стандартными документами, но выдают критическую ошибку Запись не верна! на доработанных или созданных с нуля объектах. Особенно остро это проявляется, когда бухгалтер пытается объединить два счета в плане счетов, один из которых используется в вашем новом документе.

Ситуация осложняется тем, что при ручном перевыборе значения в документе всё проводится без ошибок, а автоматическая обработка «падает». В этой статье мы детально проанализируем причины такого поведения платформы, разберем влияние режима загрузки данных и выясним, как правильно настроить программный код вашего документа, чтобы избежать подобных конфликтов.

Причина 1: Игнорирование признака ОбменДанными.Загрузка

Рассмотрим механизм работы обработки «Поиск и замена дублирующих». В отличие от интерактивного изменения документа пользователем, эта обработка производит замену ссылок программно. При этом для объекта устанавливается специальный режим: ОбменДанными.Загрузка = Истина.

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

Проанализируем ситуацию: обработка заменила СчетА на СчетБ в реквизите документа. Затем вызывается метод Записать(). Платформа ожидает, что движения по регистру бухгалтерии также будут корректными. Если в коде документа прописано принудительное формирование проводок при каждой записи, документ пытается создать записи в регистре. Если при этом СчетБ имеет другие типы субконто, а код пытается подставить старые значения, платформа выдает ошибку Запись не верна!.

Для исправления этой ситуации в начале каждой процедуры-обработчика событий записи (ПередЗаписью, ПриЗаписи, ОбработкаПроведения) следует добавить проверку:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Далее следует ваша логика проверки данных
КонецПроцедуры

Причина 2: Несоответствие аналитики и субконто

Ошибка Запись не верна! в контексте Регистра Бухгалтерии практически всегда означает нарушение структуры данных набора записей. Выясним, почему это происходит именно при автоматической замене:

  1. Разные типы субконто: Вы заменяете СчетА на СчетБ. На новом счете настроены иные виды субконто. При ручной замене в форме документа срабатывают обработчики событий (например, ПриИзменении), которые очищают или пересчитывают аналитику. При программной замене ссылок этого не происходит.
  2. Обязательность заполнения: Если на новом счете субконто является обязательным, а в исходном документе оно было пустым, попытка записи документа с новым счетом приведет к ошибке на уровне платформы.
  3. Порядок следования: Если код вашего документа обращается к субконто по индексам (например, Субконто1, Субконто2), а у нового счета порядок видов субконто отличается, платформа заблокирует запись из-за несовпадения типов данных.

Чтобы найти проблемное место, рекомендуем подключиться к фоновому заданию (так как обработка замены дублей обычно выполняется в фоне) и в момент возникновения исключения проанализировать коллекцию ЭтотОбъект.Движения.Хозрасчетный. Проверьте типы значений в колонках СубконтоДт1, СубконтоКт1 и их соответствие настройкам в Плане Счетов.

Причина 3: Измерения Подразделение vs Субконто Подразделения

Особое внимание стоит уделить учету по подразделениям в «1С:Бухгалтерии 3.0». Как было отмечено в обсуждении, путаница между Измерением регистра и Видом субконто — частая причина ошибки записи.

Разберем подробнее:

Если ваш документ при программной записи через обработку дублей пытается записать значение в измерение Подразделение, которое не предусмотрено для выбранного счета (или наоборот), платформа выдаст ошибку. Посмотрите на пример разницы в именовании реквизитов, который часто сбивает с толку: ПодразделениЕ (измерение) и ПодразделениЯ (вид субконто). Убедитесь, что логика формирования движений в вашем документе четко разделяет эти понятия и проверяет доступность аналитики для конкретного счета.

Как отладить фоновое задание?

Поскольку обработка замены дублей работает в фоновом режиме, обычная точка останова в конфигураторе может не сработать. Выполним следующие шаги для диагностики:

  1. Откройте меню Отладка — Подключение.
  2. Нажмите кнопку Автоматическое подключение.
  3. Установите флажок Фоновые задания.
  4. Теперь, когда обработка запустит процесс замены, конфигуратор «поймает» выполнение кода в модуле вашего документа.
  5. В момент ошибки обратите внимание на стек вызовов. Если ошибка происходит в методе ЭтотОбъект.Записать(), значит проблема в данных самого документа или его движениях, которые не соответствуют метаданным (Плану счетов).

Итоги и рекомендации

Чтобы ваш самописный документ корректно работал с обработкой «Поиск и замена дублирующих», необходимо придерживаться следующих правил:

  1. Всегда проверяйте ОбменДанными.Загрузка. Это «золотое правило» разработки в 1С. Если вы не планируете писать специальный код для корректной трансформации движений при замене ссылок, просто прерывайте выполнение кода записи при включенном флаге загрузки.
  2. Проверяйте состав определяемых типов. В конфигурациях на базе БСП (Библиотека стандартных подсистем) ваш документ должен быть включен в соответствующие определяемые типы, чтобы подписки на события БСП (например, по проверке запрета редактирования или заполнению реквизитов) отрабатывали корректно.
  3. Следите за типами аналитики. При создании проводок программно всегда проверяйте, поддерживает ли счет данное субконто. Используйте метод ВидыСубконто счета, чтобы убедиться в допустимости записываемых значений.

Таким образом, выполнение простых правил по обработке флага загрузки и внимательный анализ структуры регистра бухгалтерии позволят вам избавиться от ошибки Запись не верна! и обеспечить стабильную работу бухгалтерских инструментов в вашей базе.

← На главную