Почему функция ТекущийДокумент() не возвращает номер документа в 1С 7.7 и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 7.7 разработчики нередко сталкиваются с ситуацией, когда попытка получить номер документа через функцию ТекущийДокумент() приводит к непредсказуемым результатам: на одном компьютере выводится текстовое представление, а на другом — пустое поле или пробел. Разберем детально, как устроена работа этой функции, почему нельзя использовать ее для получения номера и как устранить возможные повреждения информационной базы.

Назначение и особенности работы функции ТекущийДокумент()

Проанализируем синтаксис и назначение функции ТекущийДокумент(). Согласно синтакс-помощнику платформы 1С 7.7, данная функция возвращает значение позиционированного текущего документа (ссылочный тип данных), а не его строковый реквизит.

Рассмотрим, как ведет себя платформа в различных контекстах выполнения кода:

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

Когда мы пытаемся выполнить неявное преобразование ссылки в строку (например, используя операторы "" + ТекущийДокумент() или функцию СокрЛП(ТекущийДокумент())), платформа 1С 7.7 формирует системное представление документа. Это представление зависит от вида документа, настроек нумератора, периодичности номеров в метаданных и синонимов. Оно не гарантирует вывод чистого номера документа.

Правильные способы получения номера документа

Для гарантированного получения номера документа необходимо обращаться непосредственно к системному реквизиту НомерДок. Рассмотрим несколько типовых сценариев.

Сценарий 1. Получение номера внутри модуля самого документа или его формы

В контексте самого документа все его реквизиты шапки и системные свойства доступны напрямую как локальные переменные. Вызывать функцию ТекущийДокумент() для чтения собственного номера избыточно.


// В модуле формы или модуле документа:
ТекНомер = НомерДок;
Сообщить("Номер текущего документа: " + ТекНомер);

Сценарий 2. Получение номера через ссылку на документ

Если у нас есть ссылка на документ (полученная из другого объекта, журнала или реквизита), обращение к номеру выполняется через точку:


// Получение номера через ссылку:
ТекСсылка = ТекущийДокумент();
Если ПустоеЗначение(ТекСсылка) = 0 Тогда
    ТекНомер = ТекСсылка.НомерДок;
    Сообщить("Номер документа: " + ТекНомер);
КонецЕсли;

Сценарий 3. Работа через объект метаданных в отчетах и обработках

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


Док = СоздатьОбъект("Документ.Оплата");
Если Док.НайтиПоНомеру("1084169", ТекущаяДата()) = 1 Тогда
    ТекНомер = Док.НомерДок;
    ТекСсылка = Док.ТекущийДокумент();
    Сообщить("Найден документ № " + ТекНомер);
КонецЕсли;

Причины сбоев: почему на разных компьютерах возвращаются разные данные

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

  1. Повреждение индексных файлов таблицы журнала документов (1SJOURN.CDX): В файловом режиме базы DBF 1С 7.7 связь ссылок и их представлений строится через индексы. При аварийном завершении сеанса или сбоях сети индексы могут повреждаться. В результате функция ТекущийДокумент() не может корректно спозиционироваться на записи в таблице журнала и возвращает пустое значение.
  2. Проблемы сетевой синхронизации и кэширования (OpLocks / SMB2): При совместной работе машин с разными версиями операционных систем (например, Windows XP и более новые версии) включенные механизмы сетевого кэширования могут приводить к тому, что изменения в индексных файлах не считываются клиентом своевременно.
  3. Обращение к незаписанному документу: Если документ только создается и еще не записан в базу данных, у него отсутствует внутренний идентификатор. В этом случае ссылка пуста, хотя номер на форме уже может быть сгенерирован.

Диагностика и восстановление базы данных

Если код написан корректно, но платформа продолжает возвращать пустые значения для существующих документов, выполним регламентные процедуры по восстановлению целостности данных:

  1. Переиндексация базы данных: Завершим работу всех пользователей в базе. Удалим все файлы с расширением *.cdx в каталоге базы данных и запустим 1С:Предприятие в монопольном режиме — программа автоматически перестроит все индексы.
  2. Тестирование и исправление: Запустим 1С в режиме «Конфигуратор», перейдем в меню «Администрирование» -> «Тестирование и исправление ИБ» и выполним проверку физической целостности и реиндексацию.
  3. Проверка валидности ссылки в коде: Всегда проверяем объект перед получением реквизитов с помощью функции ПустоеЗначение() или метода Выбран().
← На главную