Как убрать ошибку «Поле объекта не обнаружено (ТаблицаЦен)» при программном создании документа «Установка цен номенклатуры» в УТ 10.3?

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

При разработкe внешних обработок загрузки прайс-листов из Excel в конфигурации «1С:Управление торговлей 10.3» разработчики часто пытаются заполнитель документ «Установка цен номенклатуры» по аналогии с кодом формы документа. В результате возникает ошибка вида: «{ВнешняяОбработка.ЗагрузкаИнструменты.Форма.Форма.Форма(209)}: Поле объекта не обнаружено (ТаблицаЦен)».

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

Выясним причину возникновения ошибки

Рассмотрим, почему обращение к УстЦенНом.ТаблицаЦен или УстЦенНом.ЭлементыФормы.ТаблицаЦен вызывает сбой при выполнении кода в обработке.

Главная причина заключается в разнице между объектом базы данных и его интерактивной формой:

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

Попытка обратиться к реквизитам формы из объекта ДокументОбъект.УстановкаЦенНоменклатуры вне интерактивного контекста формы всегда приводит к ошибке «Поле объекта не обнаружено».

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

Чтобы правильно сформировать документ из внешней обработки, мы должны заполнять непосредственно табличные части ТипыЦен и Товары объекта документа.

Проанализируем структуру табличных частей:

  1. Табличная часть ТипыЦен: Содержит перечень типов цен, устанавливаемых данным документом (например, «Оптовая», «Розничная»). Достаточно заполнить реквизит ТипЦен.
  2. Табличная часть Товары: Содержит информацию о ценах на конкретные товары. Каждая строка содержит одну позицию для одного типа цены.

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

  1. Номенклатура — ссылка на элемент справочника Номенклатура.
  2. ХарактеристикаНоменклатуры — ссылка на справочник ХарактеристикиНоменклатуры (если учет ведется по характеристикам).
  3. ТипЦен — ссылка на ТипыЦенНоменклатуры.
  4. Цена — числовое значение устанавливаемой цены.
  5. Валюта — валюта цены (обычно совпадает с ТипЦен.ВалютаЦены).
  6. ЕдиницаИзмерения — классификатор единиц (по умолчанию берут Номенклатура.ЕдиницаХраненияОстатков).
  7. СпособРасчетаЦены — значение перечисления СпособыРасчетаЦены.ПоУсмотрениюПродавца.
  8. ИндексСтрокиТаблицыЦен — критически важный служебный реквизит типа Число.

Обратите особое внимание на реквизит ИндексСтрокиТаблицыЦен! Он связывает отдельные строки с одинаковыми позициями номенклатуры в единую строчку при разворачивании документа в визуальную таблицу на форме. Если его не заполнить, документ сохранится, но при попытке открыть его в интерфейсе пользователь получит ошибку формы.

Пошаговый алгоритм программного создания и проведения документа

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


// Создаем новый документ
УстЦенНом = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
УстЦенНом.Дата = ТекущаяДата();

// 1. Заполняем ТЧ "ТипыЦен"
НоваяСтрТипа = УстЦенНом.ТипыЦен.Добавить();
НоваяСтрТипа.ТипЦен = СсылкаНаТипЦенРозничная;

ИндексСтроки = 0;

// 2. Обходим данные, полученные из Excel
Для Каждого СтрокаТаблицыИзExcel Из ТаблицаДанных Цикл

    СтрТовары = УстЦенНом.Товары.Добавить();
    СтрТовары.Номенклатура = СтрокаТаблицыИзExcel.Номенклатура;
    СтрТовары.ЕдиницаИзмерения = СтрокаТаблицыИзExcel.Номенклатура.ЕдиницаХраненияОстатков;
    СтрТовары.ТипЦен = СсылкаНаТипЦенРозничная;
    СтрТовары.Цена = СтрокаТаблицыИзExcel.Цена;
    СтрТовары.Валюта = СсылкаНаТипЦенРозничная.ВалютаЦены;
    СтрТовары.СпособРасчетаЦены = Перечисления.СпособыРасчетаЦены.ПоУсмотрениюПродавца;
    
    // Заполняем индекс строки для корректной работы формы
    СтрТовары.ИндексСтрокиТаблицыЦен = ИндексСтроки;
    
    ИндексСтроки = ИндексСтроки + 1;

КонецЦикла;

// 3. Записываем и проводим документ
Попытка
    УстЦенНом.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Документ " + УстЦенНом.Ссылка + " успешно проведен!");
Исключение
    Сообщить(" Ошибка при проведении документа: " + ОписаниеОшибки());
КонецПопытки;

Почему цены не видны в карточке номенклатуры до проведения?

После создания документа у разработчиков часто возникает второй вопрос: почему при открытии справочника Номенклатура на закладке «Цены номенклатуры» новые цены или документ не отображаются?

Проанализируем этот механизм:

  1. Запись без проведения не меняет цены: Простой вызов метода Записать() без параметра проведения лишь создает черновик документа. Чтобы цены вступили в силу, документ обязательно должен быть проведен: Записать(РежимЗаписиДокумента.Проведение).
  2. Данные хранятся в регистре: В 1С:УТ 10.3 цены хранятся не в самом элементе справочника Номенклатура, а в периодическом регистре сведений ЦеныНоменклатуры. При проведении документ делает движения в этот регистр.
  3. Отображение в форме элемента: Закладка «Цены номенклатуры» в карточке товара считывает действующие цены из регистра сведений посредством динамического запроса. Поле ввода документа на этой вкладке служит лишь интерактивным элементом для перехода к документу-регистратору при ручной работе. Чтобы обновить отображаемые данные в открытой карточке, используйте кнопку «Перечитать текущие цены».
← На главную