Как правильно адаптировать код обращения к реквизитам документа при переходе с 1С 7.7 на 1С 8.2?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

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

Различие в именовании стандартных реквизитов

Проанализируем первую и самую очевидную ошибку. В версии 7.7 для получения номера и даты документа использовались идентификаторы НомерДок и ДатаДок. В платформе 8.x эти реквизиты были стандартизированы. Теперь они называются просто Номер и Дата. Попытка обратиться к свойству ДатаДок приведет к ошибке «Поле объекта не обнаружено».

Рассмотрим правильный способ обращения к этим данным. Если у вас есть переменная, содержащая ссылку на документ, код должен выглядеть так:


// Правильное обращение в 1С 8.x
ВыбраннаяДата = СсылкаНаДокумент.Дата;
ВыбранныйНомер = СсылкаНаДокумент.Номер;

Элементы формы против Данных: главная архитектурная ловушка

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

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

Для решения этой проблемы в 1С 8.2 (обычные формы) следует обращаться напрямую к реквизиту формы, к которому привязано поле ввода (свойство «Данные» в конфигураторе). Если поле ввода связано с реквизитом ДокументСсылка, то обращение должно быть таким:


// Правильно: обращение к реквизиту, а не к элементу формы
Если ЗначениеЗаполнено(ПолеВвода1) Тогда
    ТекНомер = ПолеВвода1.Номер;
    ТекДата  = ПолеВвода1.Дата;
КонецЕсли;

Если же вы все-таки хотите получить значение именно через коллекцию элементов, вам нужно сначала обратиться к свойству Значение самого элемента:


// Вариант через ЭлементыФормы (менее предпочтителен)
Ссылка = ЭлементыФормы.ПолеВвода1.Значение;
Если ЗначениеЗаполнено(Ссылка) Тогда
    Сообщить(Ссылка.Номер);
КонецЕсли;

Получение «Вида» документа через метаданные

В 1С 7.7 метод Вид() возвращал строковое представление типа документа (например, "Реализация"). В 1С 8.x функция ТипЗнч() возвращает специальный тип данных Тип, который нельзя напрямую использовать как строку для условий или поиска.

Проанализируем, как получить строковое имя документа для логики перегрузки. Для этого используется объект Метаданные. Выясним причину, по которой ТипЗнч(Ссылка) не подходит для вывода названия: он возвращает системный идентификатор типа, а не имя объекта в дереве конфигурации.

Правильный алгоритм получения имени вида документа:


// Получение строкового имени документа (аналог Вид() из 7.7)
ИмяДокумента = СсылкаНаДокумент.Метаданные().Имя; 
// Например, вернет "ПриходнаяНакладная"

// Получение человекочитаемого названия (Синоним)
СинонимДокумента = СсылкаНаДокумент.Метаданные().Синоним; 
// Например, вернет "Приходная накладная"

Проверка на пустое значение

В 7.7 проверка Выбран() = 0 была универсальной. В 8.x подход изменился. Рассмотрим подробнее основные способы проверки:

  1. Метод Пустая() — используется для конкретных ссылок. Например: ДокументСсылка.Пустая().
  2. Функция ЗначениеЗаполнено() — самый универсальный способ в 8.x. Она корректно работает и со ссылками, и со строками, и с числами.

// Универсальная проверка
Если НЕ ЗначениеЗаполнено(ПолеВвода1) Тогда
    Предупреждение("Пожалуйста, выберите документ!");
    Возврат;
КонецЕсли;

Реализация универсального выбора любого документа

Часто в обработках по перегрузке требуется дать пользователю возможность выбрать абсолютно любой документ из базы. Посмотрим на пример настройки такого поля в 1С 8.2.

Вместо того чтобы вручную заполнять СписокВыбора именами документов, как пытался автор темы, в 1С 8.x используется Типизация. Выполните следующие шаги в конфигураторе:

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

Итоговый пример кода для адаптации «Перегрузки»

Объединим все вышесказанное в единую процедуру, которая собирает данные о выбранном документе в СписокЗначений, как того требовало задание в обсуждении:


Процедура ВыполнитьСборДанных()
    
    // 1. Проверяем, выбрано ли что-то в поле
    Если НЕ ЗначениеЗаполнено(ПолеВвода1) Тогда
        Сообщить("Документ не выбран!");
        Возврат;
    КонецЕсли;
    
    // 2. Получаем ссылку из поля (предполагаем, что ПолеВвода1 - реквизит формы)
    ВыбранныйДок = ПолеВвода1;
    
    // 3. Создаем список значений и наполняем его данными
    СЗ = Новый СписокЗначений;
    
    // Получаем имя документа (Вид)
    СЗ.Добавить(ВыбранныйДок.Метаданные().Имя, "Вид");
    
    // Получаем стандартные реквизиты Номер и Дата
    СЗ.Добавить(ВыбранныйДок.Номер, "Номер");
    СЗ.Добавить(ВыбранныйДок.Дата, "Дата");
    
    // Проанализируем результат
    Для Каждого ЭлементСписка Из СЗ Цикл
        Сообщить(ЭлементСписка.Представление + ": " + ЭлементСписка.Значение);
    КонецЦикла;

КонецПроцедуры

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

← На главную