Почему при проведении РКО в 1С УТ 8.3 в регистры попадает неверный договор?

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

При работе с системой 1С пользователи часто сталкиваются с ситуациями, когда поведение программы кажется необъяснимым. Одна из таких проблем — некорректное попадание данных из документа в регистры при его проведении. Рассмотрим подробнее случай, когда в документе «Расходный кассовый ордер» (РКО) в 1С УТ 8.3 при проведении в регистры попадает договор от другого контрагента, несмотря на то, что в самом документе все реквизиты указаны верно.

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

Основные симптомы и наблюдения

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

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

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

Первоначальные шаги диагностики и их результаты

Прежде чем переходить к более сложным решениям, рассмотрим стандартные действия, которые необходимо выполнить при появлении любых необъяснимых проблем в 1С.

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

Основные причины проблемы: повреждение базы данных и индексов

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

  1. Повреждение файловой базы данных (для файлового режима работы)

    Если ваша база работает в файловом режиме (файл .1CD), то часто источником таких необъяснимых ошибок является повреждение самого файла базы данных. Это может произойти из-за некорректного завершения работы программы, сбоев в электропитании, проблем с жестким диском или сетевым соединением. В таких случаях, платформа может некорректно читать или записывать данные, что приводит к рассинхронизации.

    Для проверки и исправления такой базы мы используем утилиту chdbfl.exe. Она находится в папке с установленной платформой 1С (например, C:\Program Files\1cv8\X.X.X.X\bin\chdbfl.exe, где X.X.X.X – номер версии платформы). Мы запускаем ее, указываем путь к файлу .1CD и устанавливаем флажок «Исправлять обнаруженные ошибки». Критически важно: перед запуском этой утилиты мы обязательно делаем резервную копию базы данных. Утилита может исправить некоторые ошибки, но в редких случаях может усугубить ситуацию, если база повреждена очень сильно.

  2. Проблемы с индексами и их реорганизация

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

    Процедура «Тестирование и исправление» (ТИИ) в режиме конфигуратора 1С предназначена именно для таких случаев. Мы выполняем следующие шаги:

    1. Делаем резервную копию базы данных. Это обязательный шаг перед любыми манипуляциями с базой.
    2. Запускаем конфигуратор 1С.
    3. Переходим в меню «Администрирование» -> «Тестирование и исправление…».
    4. В открывшемся окне мы выбираем все флажки для проверки и исправления, особенно обращаем внимание на:
      • «Проверка логической целостности информационной базы»
      • «Пересчет итогов»
      • «Реиндексация таблиц информационной базы»
      • «Сжатие таблиц информационной базы»
      • «Проверка ссылочной целостности»
    5. Для начала, мы можем попробовать запустить ТИИ в режиме «Тестирование» (без исправления), чтобы оценить масштаб проблемы. Если ошибки будут обнаружены, мы запускаем его в режиме «Тестирование и исправление».
    6. Критически важно: Перед выполнением ТИИ мы убедимся, что все пользователи вышли из базы. Это позволит избежать блокировок и конфликтов.

    Процедура ТИИ, помимо прочего, перестраивает индексы, что часто решает проблемы с некорректной выборкой данных. Именно на это мы и ориентируемся в нашем случае.

  3. Выгрузка/загрузка информационной базы

    Иногда, если chdbfl.exe и ТИИ не помогают, можно попробовать выгрузить информационную базу в файл .dt, а затем загрузить ее обратно. Этот процесс, по сути, является более глубокой формой «реиндексации» и «сжатия». При выгрузке данных платформа создает новый файл, записывая в него только логически целостные данные, а при загрузке создает новую структуру базы с нуля. Это может помочь избавиться от некоторых видов физических повреждений или фрагментации, которые не были устранены стандартными средствами.

    Мы выполняем следующие действия:

    1. Делаем резервную копию базы данных.
    2. Запускаем конфигуратор 1С.
    3. Переходим в меню «Администрирование» -> «Выгрузить информационную базу…» и сохраняем файл .dt.
    4. Создаем новую пустую информационную базу.
    5. Запускаем конфигуратор новой пустой базы.
    6. Переходим в меню «Администрирование» -> «Загрузить информационную базу…» и выбираем ранее сохраненный файл .dt.

    Этот метод часто используется как последнее средство для борьбы с "загадочными" проблемами, связанными с целостностью данных.

Дополнительные аспекты и возможные действия

Мы также рассмотрим другие потенциальные, хоть и менее вероятные в данном конкретном случае, причины и действия.

  1. Рассинхронизация "Ссылки" и "Объекта"

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

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

    Мы всегда используем ЭтотОбъект или прямое обращение к реквизиту Объект.Реквизит внутри ОбработкаПроведения, чтобы гарантировать работу с актуальными данными.

  2. Журнал регистрации

    Мы обязательно проанализируем журнал регистрации 1С. В нем фиксируются все события, происходящие в системе, включая ошибки, предупреждения, действия пользователей и технологические события. Иногда, необъяснимые ошибки сопровождаются записями в журнале, которые могут указать на конкретный момент сбоя или даже на строку кода, вызвавшую проблему. Мы ищем записи, совпадающие по времени с проблемным проведением документа.

  3. Влияние обновлений

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

Заключение

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

  1. Сделать полную резервную копию базы данных.
  2. Запустить утилиту chdbfl.exe с параметром исправления ошибок для проверки целостности файла базы данных.
  3. Выполнить процедуру «Тестирование и исправление» в конфигураторе, уделив особое внимание реиндексации и проверке логической целостности.
  4. Если предыдущие шаги не помогли, попробовать выгрузить и загрузить информационную базу через файл .dt.

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

← На главную