Как программно заполнить и отобразить дополнительную колонку «Артикул» в документах 1С:УНФ?

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

При разработке в конфигурации 1С:Управление нашей фирмой (УНФ) программисты часто сталкиваются с ситуацией, когда при программном создании документа (например, Заказ покупателя или Расходная накладная) табличная часть заполняется корректно, но колонка Артикул остается пустой. При этом в интерфейсе программы эта колонка включена, а у выбранной номенклатуры артикул заполнен. Разберем подробно, почему это происходит и как правильно решить эту задачу.

Анализируем причину проблемы: почему колонки нет в конфигураторе?

Прежде всего, нам необходимо понять архитектурное решение разработчиков 1С:УНФ. Если мы откроем документ в конфигураторе и заглянем в состав реквизитов табличной части Запасы, мы действительно можем не обнаружить там поля Артикул. Это связано с тем, что артикул — это свойство справочника Номенклатура, а не самого документа.

В УНФ реализован механизм дополнительных колонок. Отображение артикула или кода номенклатуры в списках и формах документов управляется специальной константой (функциональной опцией) «Вариант отображения кода и артикула». Сама колонка на форме является динамической. Она может быть реализована двумя способами:

  1. Как поле, путь к данным которого прописан «через точку»: Объект.Запасы.Номенклатура.Артикул.
  2. Как отдельный реквизит формы (не объекта!), который заполняется программно в момент открытия или изменения данных в строке.

Когда вы создаете документ программно через Документы.ЗаказПокупателя.СоздатьДокумент(), вы работаете с объектом базы данных. Поскольку в базе данных в табличной части документа поля «Артикул» не существует, записывать данные просто некуда. Проблема «пустоты» проявляется в тот момент, когда вы открываете форму программно созданного документа: механизмы формы по какой-то причине не подтягивают данные из связанного справочника.

Решение 1: Заполнение служебных реквизитов формы

Как показывает практика и обсуждения практикующих разработчиков, в некоторых версиях УНФ в табличных частях на форме присутствуют скрытые или вспомогательные реквизиты. Например, поле НоменклатураСсылка.

Проанализируем ситуацию: если мы заполняем только основное поле Номенклатура, кэш формы может не обновиться автоматически. Попробуем при программном заполнении дублировать ссылку в служебные поля, если они присутствуют в данной версии конфигурации:


НовыйДокумент = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
// ... заполнение шапки ...

НоваяСтрока = НовыйДокумент.Запасы.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;

// В некоторых версиях УНФ это критично для обновления формы:
Попытка
    НоваяСтрока.НоменклатураСсылка = СсылкаНаНоменклатуру;
Исключение
    // Если реквизита нет в объекте, значит механизм работает иначе
КонецПопытки;

НовыйДокумент.Записать();

Важный нюанс: Обратите внимание, что реквизит НоменклатураСсылка может быть реквизитом именно формы, а не объекта. В этом случае заполнить его при создании объекта в серверном коде (вне контекста формы) не получится. Это подводит нас ко второму, более надежному способу.

Решение 2: Использование типовых серверных методов заполнения

Чтобы все «невидимые» связи, артикулы, единицы измерения и цены подтянулись корректно, рекомендуется не просто присваивать значения полям, а использовать типовые процедуры из общих модулей УНФ. В этой конфигурации за логику заполнения строк часто отвечают процедуры в модулях ЗаполнениеДокументов, НоменклатураКлиентСервер или специализированные методы в модулях менеджеров документов.

Рассмотрим пример использования метода, который инициализирует данные строки по номенклатуре:


// Пример логики, которую следует искать в общем модуле
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Номенклатура", СсылкаНаНоменклатуру;
ПараметрыЗаполнения.Вставить("ДокументСсылка", НовыйДокумент.Ссылка);

// Вызов типовой процедуры (название может меняться в зависимости от релиза УНФ)
// Обычно это что-то вроде:
// ЗаполнениеДокументовУНФ.ЗаполнитьСтрокуЗапасов(НоваяСтрока, ПараметрыЗаполнения);

Работа через типовые методы гарантирует, что программа выполнит все необходимые действия: подставит артикул для отображения, заполнит базовую единицу измерения, счета учета и НДС.

Решение 3: Принудительное обновление формы при открытии

Если документ уже создан программно, и вы видите пустой артикул только при открытии формы, проблему можно решить в расширении формы документа. Нам нужно заставить форму «пересчитать» дополнительные колонки. Выясним причину: скорее всего, не срабатывает событие ПриЧтенииНаСервере или механизмы условного оформления.

В коде формы за отображение артикула часто отвечает процедура УстановитьВидимостьДополнительныхКолонок() или аналогичная. Мы можем вызвать процедуру обновления данных в строках в событии формы ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Вызываем стандартный механизм УНФ для обновления доп. колонок
    ДополнительныеКолонки = Программа.ПолучитьНастройкуДополнительныхКолонок(); 
    // В реальной УНФ это может быть обращение к функциональным опциям
    
    Для Каждого СтрокаЗапасов Из Объект.Запасы Цикл
        // Принудительно инициируем обновление связанных данных, 
        // если форма не подтянула их сама
    КонецЦикла;
КонецПроцедуры

Почему это не стоит делать через «ПутьКДанным»?

Некоторые разработчики пытаются решить вопрос, просто прописав в свойствах колонки на форме путь Объект.Запасы.Номенклатура.Артикул. Разберем, почему это плохая практика:

Итоги и рекомендации

Подведем итог нашему разбору. Если вам нужно программно создать документ в УНФ так, чтобы артикул отображался корректно:

  1. Проверьте, заполнены ли в номенклатуре сами артикулы (банально, но важно).
  2. При программном создании документа на сервере старайтесь использовать функции из общего модуля ЗаполнениеДокументовУНФ (или аналогичных в вашем релизе), которые называются ЗаполнитьДанныеПоНоменклатуре.
  3. Если вы создаете строку в контексте формы (на клиенте), обязательно вызывайте обработчик изменения номенклатуры: НоменклатураПриИзменении(). Именно в этом обработчике скрыта магия заполнения всех зависимых полей.
  4. Помните, что Артикул в УНФ — это не данные документа, а данные визуального представления. Если в базе Номенклатура заполнена правильно, то отсутствие артикула в форме — это вопрос к методам инициализации формы, а не к процедуре записи объекта.

Используя эти подходы, вы обеспечите корректную и быструю работу интерфейса, сохраняя типовую логику конфигурации 1С:УНФ.

← На главную