При разработкe внешних обработок загрузки прайс-листов из Excel в конфигурации «1С:Управление торговлей 10.3» разработчики часто пытаются заполнитель документ «Установка цен номенклатуры» по аналогии с кодом формы документа. В результате возникает ошибка вида: «{ВнешняяОбработка.ЗагрузкаИнструменты.Форма.Форма.Форма(209)}: Поле объекта не обнаружено (ТаблицаЦен)».
В этой статье мы разберем причину возникновения данной ошибки, проанализируем внутреннее устройство документа и рассмотреим правильный алгоритм его программного заполнения и проведения.
Рассмотрим, почему обращение к УстЦенНом.ТаблицаЦен или УстЦенНом.ЭлементыФормы.ТаблицаЦен вызывает сбой при выполнении кода в обработке.
Главная причина заключается в разнице между объектом базы данных и его интерактивной формой:
ТаблицаЦен — это динамическая элемент-таблица значений, которая создается и формируется программно только внутри модуля формы при её открытии.УстановкаЦенНоменклатуры нет реквизита или табличной части с именем ТаблицаЦен. В объекте содержатся лишь две базовые табличные части: ТипыЦен и Товары.Попытка обратиться к реквизитам формы из объекта ДокументОбъект.УстановкаЦенНоменклатуры вне интерактивного контекста формы всегда приводит к ошибке «Поле объекта не обнаружено».
Чтобы правильно сформировать документ из внешней обработки, мы должны заполнять непосредственно табличные части ТипыЦен и Товары объекта документа.
Проанализируем структуру табличных частей:
ТипыЦен: Содержит перечень типов цен, устанавливаемых данным документом (например, «Оптовая», «Розничная»). Достаточно заполнить реквизит ТипЦен.Товары: Содержит информацию о ценах на конкретные товары. Каждая строка содержит одну позицию для одного типа цены.Для каждой строки табличной части Товары необходимо корректно проставить следующие реквизиты:
Номенклатура — ссылка на элемент справочника Номенклатура.ХарактеристикаНоменклатуры — ссылка на справочник ХарактеристикиНоменклатуры (если учет ведется по характеристикам).ТипЦен — ссылка на ТипыЦенНоменклатуры.Цена — числовое значение устанавливаемой цены.Валюта — валюта цены (обычно совпадает с ТипЦен.ВалютаЦены).ЕдиницаИзмерения — классификатор единиц (по умолчанию берут Номенклатура.ЕдиницаХраненияОстатков).СпособРасчетаЦены — значение перечисления СпособыРасчетаЦены.ПоУсмотрениюПродавца.ИндексСтрокиТаблицыЦен — критически важный служебный реквизит типа Число.Обратите особое внимание на реквизит ИндексСтрокиТаблицыЦен! Он связывает отдельные строки с одинаковыми позициями номенклатуры в единую строчку при разворачивании документа в визуальную таблицу на форме. Если его не заполнить, документ сохранится, но при попытке открыть его в интерфейсе пользователь получит ошибку формы.
Разберем готовый пример кода для внешней обработки, который создаст документ, заполнит табличные части и проведет его в системе:
// Создаем новый документ
УстЦенНом = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
УстЦенНом.Дата = ТекущаяДата();
// 1. Заполняем ТЧ "ТипыЦен"
НоваяСтрТипа = УстЦенНом.ТипыЦен.Добавить();
НоваяСтрТипа.ТипЦен = СсылкаНаТипЦенРозничная;
ИндексСтроки = 0;
// 2. Обходим данные, полученные из Excel
Для Каждого СтрокаТаблицыИзExcel Из ТаблицаДанных Цикл
СтрТовары = УстЦенНом.Товары.Добавить();
СтрТовары.Номенклатура = СтрокаТаблицыИзExcel.Номенклатура;
СтрТовары.ЕдиницаИзмерения = СтрокаТаблицыИзExcel.Номенклатура.ЕдиницаХраненияОстатков;
СтрТовары.ТипЦен = СсылкаНаТипЦенРозничная;
СтрТовары.Цена = СтрокаТаблицыИзExcel.Цена;
СтрТовары.Валюта = СсылкаНаТипЦенРозничная.ВалютаЦены;
СтрТовары.СпособРасчетаЦены = Перечисления.СпособыРасчетаЦены.ПоУсмотрениюПродавца;
// Заполняем индекс строки для корректной работы формы
СтрТовары.ИндексСтрокиТаблицыЦен = ИндексСтроки;
ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
// 3. Записываем и проводим документ
Попытка
УстЦенНом.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ " + УстЦенНом.Ссылка + " успешно проведен!");
Исключение
Сообщить(" Ошибка при проведении документа: " + ОписаниеОшибки());
КонецПопытки;
После создания документа у разработчиков часто возникает второй вопрос: почему при открытии справочника Номенклатура на закладке «Цены номенклатуры» новые цены или документ не отображаются?
Проанализируем этот механизм:
Записать() без параметра проведения лишь создает черновик документа. Чтобы цены вступили в силу, документ обязательно должен быть проведен: Записать(РежимЗаписиДокумента.Проведение).Номенклатура, а в периодическом регистре сведений ЦеныНоменклатуры. При проведении документ делает движения в этот регистр.