При разработке собственных механизмов отображения движений документа или при добавлении новых регистров в существующие типовые обработки (например, в «Корректировку движений»), программисты часто сталкиваются с ситуацией, когда динамически создаваемое ТабличноеПоле отказывается принимать данные. Ошибка «Ошибка при установке значения атрибута контекста (Данные): Неправильный путь к данным» возникает из-за того, что платформа 1С не может сопоставить строковое имя регистра с типом объекта, который должен отображаться в таблице.
В этой статье мы подробно разберем, как правильно инициализировать элементы формы в обычном приложении 1С (платформы 8.1, 8.2, 8.3), чтобы успешно выводить движения новых регистров.
Проанализируем ситуацию: когда мы используем метод ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), ...), создается пустой объект управления. В коде автора была попытка сразу назначить путь к данным:
ПолеРегистра.Данные = СтрокаТаблицыРегистров.Имя;
Для платформы 1С свойство Данные является ссылкой на структуру данных в памяти. Если тип значения этого поля предварительно не определен, 1С пытается найти реквизит формы с таким именем. Поскольку регистр «Закупки» не является реквизитом самой формы (он создается динамически), система выдает ошибку. Чтобы исправить это, необходимо явно указать, какой тип данных будет содержаться в этом поле, используя объект ОписаниеТипов.
Рассмотрим по шагам, как модифицировать код, чтобы он работал корректно. Главный секрет заключается в использовании конструкции Новый ОписаниеТипов перед тем, как назначать свойство Данные.
Для регистра накопления правильная последовательность действий выглядит так:
ТабличноеПоле."РегистрНакопленияСписок.ИмяВашегоРегистра").ТипЗначения для поля.Данные.Посмотрим на пример исправленного участка кода:
// Создаем табличное поле на панели
ПолеРегистра = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), СтрокаТаблицыРегистров.Имя, Истина, ЭлементыФормы.ОсновнаяПанель);
// Определяем тип для регистра накопления
Если СтрокаТаблицыРегистров.ТипРегистра = "РегистрНакопления" Тогда
ПолеРегистра.ТипЗначения = Новый ОписаниеТипов("РегистрНакопленияСписок." + СтрокаТаблицыРегистров.Имя);
ИначеЕсли СтрокаТаблицыРегистров.ТипРегистра = "РегистрСведений" Тогда
ПолеРегистра.ТипЗначения = Новый ОписаниеТипов("РегистрСведенийСписок." + СтрокаТаблицыРегистров.Имя);
КонецЕсли;
// Теперь установка данных пройдет без ошибки
ПолеРегистра.Данные = СтрокаТаблицыРегистров.Имя;
Разберем важный технический момент. В 1С существует два способа отображения данных регистра в табличном поле:
Если ваша задача — создать полноценную «Корректировку движений», где пользователь может менять цифры и записывать их обратно в базу, правильнее будет работать с Набором записей. В этом случае данные привязываются не к строке-имени, а к коллекции движений документа:
// Пример привязки к набору записей документа
ДвиженияДокумента = ДокументОбъект.Движения[СтрокаТаблицыРегистров.Имя];
ПолеРегистра.ТипЗначения = Новый ОписаниеТипов("РегистрНакопленияНаборЗаписей." + СтрокаТаблицыРегистров.Имя);
ПолеРегистра.Значение = ДвиженияДокумента; // Прямое назначение объекта
Даже если программный код написан идеально, ошибка «Неправильный путь к данным» может возникнуть из-за настроек в Конфигураторе. Выясним причину, проверив свойства объектов:
Важно: Если документ не является «Регистратором» для данного регистра, коллекция ДокументОбъект.Движения не будет содержать этот регистр, и любая попытка программного обращения к нему вернет Неопределено или вызовет ошибку обращения к контексту.
После того как мы успешно установили данные, нам нужно, чтобы в таблице появились колонки (Номенклатура, Количество, Сумма и т.д.). Рассмотрим, как это сделать программно. Вместо того чтобы вручную описывать каждую колонку, воспользуемся методом СоздатьКолонки().
ПолеРегистра.СоздатьКолонки();
// Дополнительная настройка: скроем служебные поля
Если ПолеРегистра.Колонки.Найти("Регистратор") <> Неопределено Тогда
ПолеРегистра.Колонки.Регистратор.Видимость = Ложь;
КонецЕсли;
Если ПолеРегистра.Колонки.Найти("НомерСтроки") <> Неопределено Тогда
ПолеРегистра.Колонки.НомерСтроки.Видимость = Ложь;
КонецЕсли;
Проанализируем ситуацию с видом движения (Приход/Расход). Для регистров остатков важно видеть, в плюс или в минус ушел ресурс. В коде это реализуется проверкой метаданных:
Если Метаданные.РегистрыНакопления[СтрокаТаблицыРегистров.Имя].ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
КолонкаВидДвижения = ПолеРегистра.Колонки.Вставить(1, "Вид движения");
КолонкаВидДвижения.Данные = "ВидДвижения";
КолонкаВидДвижения.УстановитьЭлементУправления(Тип("ПолеВвода"));
КонецЕсли;
Иногда ошибка «Неправильный путь к данным» скрывает под собой проблему отсутствия прав. Если вы создали новый регистр, но не добавили на него права в ролях текущего пользователя, то в режиме «Предприятие» система может игнорировать этот объект. Убедитесь, что для регистра «Закупки» установлены права «Чтение», «Просмотр» и, при необходимости, «Редактирование».
Подведем итог. Чтобы успешно добавить новый регистр в форму и избежать ошибок привязки данных, придерживайтесь следующей последовательности:
Новый ОписаниеТипов("РегистрНакопленияСписок.Имя") для установки ТипЗначения.Данные только после определения типа.СоздатьКолонки() для автоматической отрисовки интерфейса.Следуя этим рекомендациям, вы сможете динамически расширять функционал любых форм, работающих с движениями документов в 1С.