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