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