При работе с конфигурацией 1С:Бухгалтерия 3.0 многие разработчики сталкиваются с необходимостью модификации типовых печатных форм или создания совершенно новых. Особенно часто это происходит с таким важным документом, как счет-фактура. В нашем случае, пользователь столкнулся с распространенной и крайне неприятной ошибкой «Поле объекта не обнаружено (НомерОтгрузочногоДокумента)» при попытке сформировать внешнюю счет-фактуру. Давайте вместе разберем причины возникновения этой ошибки и, что самое главное, предложим эффективные способы ее исправления и методы отладки внешних печатных форм.
Проблема, с которой мы столкнулись, заключается в том, что скопированные из общего модуля УчетНДС функции пытаются получить доступ к полю НомерОтгрузочногоДокумента из структуры ТаблицаДокумента, но это поле отсутствует или имеет другое наименование. Особенно критично это становится, если мы работаем со старой внешней формой, разработанной до значительных изменений в законодательстве, вступивших в силу 01.07.2021 года.
Ошибка «Поле объекта не обнаружено» является одной из наиболее частых в разработке на платформе 1С. Она означает, что программный код пытается обратиться к реквизиту (полю) объекта, который в текущей структуре объекта не существует. Представим, что у нас есть таблица, и мы пытаемся получить значение из колонки, которой в этой таблице просто нет. Именно это и происходит в нашем случае.
Выясним наиболее распространенные причины возникновения данной ошибки:
ТаблицаДокумента) мы часто используем запросы. Если в тексте запроса допущена ошибка в наименовании поля или это поле не выбрано вовсе, при попытке доступа к нему возникнет данная ошибка.В нашем случае, когда ошибка указывает на поле НомерОтгрузочногоДокумента и мы знаем, что форма разрабатывалась до 01.07.2021, наиболее вероятными причинами являются изменения в структуре данных, связанные с законодательными нововведениями, и возможно, некорректная структура таблицы ТаблицаДокумента, которая передается в функции общего модуля УчетНДС.
Упоминание даты 01.07.2021 года является критически важным. С этой даты в Российской Федерации вступили в силу существенные изменения в формы счетов-фактур, связанные с началом действия национальной системы обязательной прослеживаемости товаров. Эти изменения коснулись не только визуального представления документа, но и его внутренней структуры данных. Давайте рассмотрим основные нововведения:
НомерОтгрузочногоДокумента, скорее всего, и пытается ссылаться код, скопированный из актуального модуля УчетНДС. Если наша старая внешняя форма не формирует этот реквизит или формирует его под другим именем, возникнет ошибка.Конфигурация 1С:Бухгалтерия 8, начиная с версии 3.0.95, была адаптирована под эти изменения. Если наша внешняя печатная форма создавалась до этой даты (или до 01.07.2021) и не была обновлена, она, скорее всего, не учитывает новые реквизиты. При попытке сформировать счет-фактуру по новым правилам, типовой код из УчетНДС будет ожидать эти поля, а наша старая структура данных их не предоставит, что и приводит к ошибке «Поле объекта не обнаружено».
Для эффективного исправления ошибки нам необходимо иметь возможность пошагово отладить код нашей внешней печатной формы. Однако отладка внешних обработок имеет свои особенности, которые мы сейчас подробно рассмотрим.
Почему обычная отладка через подключение обработки не работает?
Когда мы подключаем внешнюю печатную форму через раздел «Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки», система 1С в режиме предприятия вызывает ее как отдельный, независимый экземпляр. То есть, экземпляр обработки, который открыт у нас в конфигураторе, и экземпляр, который запускается 1С в режиме предприятия для печати, являются разными объектами. По этой причине точки останова, установленные в конфигураторе, просто не сработают.
Шаги для успешной отладки внешней печатной формы:
Нам необходимо временно доработать нашу внешнюю печатную форму таким образом, чтобы мы могли запускать ее из режима предприятия напрямую через меню «Файл -> Открыть». Для этого мы должны добавить в нее обычную форму обработки. Эта форма будет служить своего рода «тестовым стендом».
Создадим новую форму обработки. На этой форме мы можем разместить следующие элементы:
Пример кода в модуле формы, который будет вызываться по нажатию кнопки:
&НаКлиенте
Процедура Напечатать(Команда)
Если Объект.ДокументОснование.Пустая() Тогда
Сообщить("Выберите документ-основание!");
Возврат;
КонецЕсли;
// Вызываем нашу процедуру печати, которая обычно находится в модуле объекта обработки
// или в общем модуле, если она была скопирована из УчетНДС.
// В данном примере предполагается, что процедура печати называется ПечатьСчетФактуры()
// и принимает ссылку на документ-основание.
// Для демонстрации мы можем временно перенести код печати в модуль формы,
// либо вызвать экспортную процедуру из модуля объекта обработки.
// Рассмотрим второй вариант, как более правильный для внешней обработки.
ТабДокумент = ПолучитьМакетПечатнойФормыСчетФактуры(Объект.ДокументОснование);
Если ТабДокумент <> Неопределено Тогда
ТабДокумент.Показать();
Иначе
Сообщить("Не удалось сформировать печатную форму!");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьМакетПечатнойФормыСчетФактуры(ДокументСсылка)
// Здесь мы можем вызывать нашу основную процедуру формирования печатной формы
// из модуля объекта обработки.
// Например: Возврат Обработки.НашаВнешняяСчетФактура.Печать(ДокументСсылка);
// Или, если код скопирован из УчетНДС, то временно вставляем его сюда для отладки
// или передаем необходимые параметры в скопированную процедуру.
// В нашем случае, ошибка возникает внутри скопированных функций.
// Давайте представим, что мы скопировали функцию
// 'СформироватьПечатнуюФормуСчетаФактуры' из УчетНДС
// и модифицировали ее для использования во внешней обработке.
// Важно: в реальной внешней обработке процедура печати (например, Печать)
// находится в модуле объекта обработки и является экспортной.
// Мы вызываем ее из серверной функции модуля формы.
// Пример вызова экспортной процедуры из модуля объекта:
РезультатПечати = НашаВнешняяСчетФактура.Печать(ДокументСсылка, "НазваниеНашейКомандыПечати");
// Предполагаем, что РезультатПечати - это ТабличныйДокумент
Возврат РезультатПечати;
// Если же вы хотите отлаживать именно внутри скопированного кода,
// то этот код должен быть либо частью модуля формы, либо вызываться из него.
// Самый простой вариант для отладки: перенести проблемный кусок кода
// прямо в серверную функцию или процедуру модуля формы,
// чтобы все переменные были доступны и точки останова срабатывали.
КонецФункции
Нам важно обеспечить, чтобы код, вызывающий ошибку, исполнялся именно в контексте этой формы или через ее серверные вызовы, где точки останова будут работать.
Сохраните измененную внешнюю обработку. Запустите 1С в режиме предприятия. Откройте нашу обработку через меню «Файл -> Открыть...». В открывшейся форме выберите нужный документ-основание и нажмите кнопку для формирования печатной формы. Теперь, если вы предварительно установили точки останова в конфигураторе в местах, где предполагается ошибка (или где она фактически возникает), они должны сработать.
Как только сработает точка останова, мы сможем пошагово выполнять код, просматривать значения всех переменных в текущем контексте, а также изучать стек вызова. Стек вызова покажет нам последовательность функций и процедур, которые привели к текущей строке кода. Это очень поможет определить, откуда приходят данные в ТаблицаДокумента и какая именно строка кода пытается обратиться к несуществующему полю.
Если точку останова сложно найти, мы можем настроить отладчик на остановку при возникновении ошибки. Это позволит нам мгновенно перейти к строке кода, которая вызвала исключение «Поле объекта не обнаружено».
ТаблицаДокумента:
После остановки в точке ошибки, внимательно изучите содержимое переменной ТаблицаДокумента. Просмотрите ее структуру, колонки, которые в ней присутствуют. Сравните этот список с тем, какие поля ожидает код, который вы скопировали из модуля УчетНДС. Вероятнее всего, вы обнаружите, что поле НомерОтгрузочногоДокумента отсутствует или имеет другое название.
После того как вы идентифицировали проблему (например, отсутствие поля НомерОтгрузочногоДокумента в ТаблицаДокумента), вам необходимо внести изменения. Это может быть:
ТаблицаДокумента.УчетНДС, для работы с текущей структурой ТаблицаДокумента (если отсутствие поля оправдано, и оно не требуется для вашей конкретной формы).ТаблицаДокумента с учетом новых требований законодательства по счет-фактурам с 01.07.2021.После внесения изменений повторите процесс отладки до полного устранения ошибки.
Когда все ошибки будут исправлены и печатная форма будет работать корректно, удалите временную форму обработки, которую мы создавали для отладки, или закомментируйте ее вызовы. Сохраните обработку и затем уже подключайте ее в базу данных через «Дополнительные отчеты и обработки».
Если после всех манипуляций поведение программы остается непредсказуемым или ошибки повторяются, рекомендуется очистить кеш 1С. Это можно сделать, удалив папки кеша из профиля пользователя или запустив 1С с ключом очистки кеша.
Модуль УчетНДС в конфигурации 1С:Бухгалтерия содержит стандартизированные функции для работы с налогом на добавленную стоимость, включая формирование различных печатных форм, связанных со счетами-фактурами. При копировании функций из этого модуля для создания собственной внешней формы мы должны быть предельно внимательны к тому, какую структуру данных эти функции ожидают на входе.
Давайте проанализируем ситуацию с ТаблицаДокумента и полем НомерОтгрузочногоДокумента:
Нам необходимо сравнить структуру ТаблицаДокумента, которая формируется в нашей внешней печатной форме, со структурой, которую ожидает скопированный код из модуля УчетНДС. Самый надежный способ – это найти в конфигурации типовую печатную форму счета-фактуры (например, в модуле менеджера документа «Реализация товаров и услуг» или в общих модулях, отвечающих за печать) и посмотреть, как там формируется аналогичная таблица данных для счета-фактуры.
В типовом коде мы, скорее всего, увидим, что поле НомерОтгрузочногоДокумента либо явно добавляется в запрос, формирующий таблицу, либо вычисляется на основе связанных документов (например, документов реализации или актов). Нам нужно воспроизвести эту логику в нашей внешней обработке.
ТаблицаДокумента:
Если поле НомерОтгрузочногоДокумента отсутствует в нашей ТаблицаДокумента, то первым шагом будет его добавление. Если ТаблицаДокумента заполняется запросом, то мы должны включить это поле в список выбираемых полей запроса. Например, если наш запрос выбирает данные из табличной части документа «Реализация товаров и услуг», и у нас есть ссылка на документ отгрузки, то мы можем получить его номер и дату:
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка.Номер КАК НомерРеализации,
РеализацияТоваровУслугТовары.Ссылка.Дата КАК ДатаРеализации,
// ... другие поля
// Если поле 'ДокументОтгрузки' существует в РеализацияТоваровУслуг
РеализацияТоваровУслугТовары.Ссылка.ДокументОтгрузки.Номер КАК НомерОтгрузочногоДокумента,
РеализацияТоваровУслугТовары.Ссылка.ДокументОтгрузки.Дата КАК ДатаОтгрузочногоДокумента
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка = &СсылкаНаДокумент
Важно убедиться, что поле ДокументОтгрузки действительно существует в документе-основании, или найти другой способ получения этих данных (например, из связанных документов через регистры).
УчетНДС:
После добавления поля НомерОтгрузочногоДокумента в ТаблицаДокумента, скопированные функции из УчетНДС должны начать работать корректно. Однако, нам может потребоваться дополнительно проверить, какие еще поля ожидаются этими функциями и как они используются. В частности, строка 5а счета-фактуры часто требует форматирования номера и даты отгрузочного документа, как это видно из первоначального сообщения об ошибке:
ДокументОтгрузки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ШаблонПодстрокиДокументаОбОтгрузке,
ДиапазонСтрок,
Строка(ТаблицаДокумента[ИндексСтроки-1].НомерОтгрузочногоДокумента) + ПостфиксНомераДокумента,
Формат(ТаблицаДокумента[ИндексСтроки-1].ДатаОтгрузочногоДокумента, "ДЛФ='Д'") + " г."
);
Убедимся, что ПостфиксНомераДокумента и ШаблонПодстрокиДокументаОбОтгрузке также корректно определены и переданы в нашу внешнюю обработку.
При каждом обновлении конфигурации или платформы нам нужно будет проверять актуальность нашей внешней обработки. Изменения в законодательстве и типовой конфигурации 1С происходят регулярно, и старые формы могут быстро стать неработоспособными без своевременной адаптации.
Мы выяснили, что ошибка «Поле объекта не обнаружено (НомерОтгрузочногоДокумента)» при создании внешней счет-фактуры в 1С:Бухгалтерии 3.0, особенно для форм, разработанных до 01.07.2021, с высокой долей вероятности связана с изменениями в структуре данных, вызванными новыми законодательными требованиями к счетам-фактурам (строка 5а, прослеживаемость товаров). Код, скопированный из актуального модуля УчетНДС, ожидает наличия этих новых полей, а наша устаревшая структура данных их не предоставляет.
Для успешного решения проблемы мы предлагаем комплексный подход:
ТаблицаДокумента и определим, какие поля в ней фактически присутствуют, а какие отсутствуют по сравнению с ожидаемыми.ТаблицаДокумента таким образом, чтобы она содержала все необходимые поля, соответствующие актуальным требованиям к счету-фактуре (включая НомерОтгрузочногоДокумента, ДатаОтгрузочногоДокумента и поля прослеживаемости). Мы можем ориентироваться на то, как эти данные формируются в типовых печатных формах 1С:Бухгалтерии 3.0.ТаблицаДокумента будет содержать необходимые поля, скопированный код из УчетНДС, скорее всего, заработает. Если потребуется, внесем мелкие корректировки в форматирование или логику обработки этих полей.Следуя этим рекомендациям, мы сможем не только успешно исправить текущую ошибку, но и повысить свою квалификацию в работе с внешними печатными формами и их отладке в системе 1С:Предприятие.