Как программно заполнить реквизит формы в 1С:Бухгалтерия 3.0 на примере номера счета-фактуры

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

При переходе с конфигураций на базе обычных форм (например, БП 2.0) на управляемые формы (БП 3.0) разработчики часто сталкиваются с тем, что привычные реквизиты документов исчезают из состава объекта и становятся "виртуальными" реквизитами формы. Типичный пример — поле НомерСчетаФактурыПолученного в документе "Поступление товаров и услуг". Разберем подробно, как программно заполнить такие поля, если они не привязаны напрямую к объекту ДокументОбъект.

Выясним причину: почему прямое заполнение через Объект не работает

В современных типовых решениях (БП 3.0, ERP, КА) разработчики фирмы "1С" стремятся минимизировать количество реквизитов в основных таблицах базы данных. Поле номера счета-фактуры в документе поступления теперь является лишь визуальным отображением данных из связанного документа СчетФактураПолученный. Когда вы открываете форму поступления, программный код конфигурации ищет связанный счет-фактуру и выводит его номер в реквизит формы. Именно поэтому попытка написать Объект.НомерСчетаФактурыПолученного приведет к ошибке: у объекта документа просто нет такого реквизита.

Решение 1: Передача данных через параметры формы (Рекомендуемый способ)

Рассмотрим ситуацию, когда мы открываем форму документа из внешней обработки и хотим передать туда готовое значение. Самый правильный и "чистый" метод — использование структуры Параметры. Проанализируем, как это реализовать по шагам.

Шаг 1. Код в вызывающей обработке:

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


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("НомерСчетаФактурыСтрокой", "СФ-12345");
ПараметрыФормы.Вставить("ДатаСчетаФактуры", ТекущаяДата());

// Открываем форму документа ПТУ
ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаОбщая", ПараметрыФормы);

Шаг 2. Перехват параметров в форме документа:

Теперь нам нужно, чтобы форма "увидела" наши данные. Для этого необходимо использовать расширение формы или доработку модуля формы в событии ПриСозданииНаСервере. Посмотрим на пример кода:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем наличие нашего уникального параметра
    Если Параметры.Свойство("НомерСчетаФактурыСтрокой") Тогда
        ЭтаФорма.НомерСчетаФактурыПолученного = Параметры.НомерСчетаФактурыСтрокой;
    КонецЕсли;
    
    Если Параметры.Свойство("ДатаСчетаФактуры") Тогда
        ЭтаФорма.ДатаСчетаФактурыПолученного = Параметры.ДатаСчетаФактуры;
    КонецЕсли;
КонецПроцедуры

Этот метод хорош тем, что он не нарушает логику работы типовой конфигурации и позволяет гибко управлять инициализацией формы.

Решение 2: Использование метода ПолучитьФорму и прямое обращение

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


// Получаем объект формы, но не открываем его сразу
ПараметрыЗаполнения = Новый Структура("Ключ", СсылкаНаДокумент); 
ФормаДокумента = ПолучитьФорму("Документ.ПоступлениеТоваровУслуг.ФормаОбъекта", ПараметрыЗаполнения);

// Теперь мы можем обращаться к реквизитам формы напрямую через точку
ФормаДокумента.НомерСчетаФактурыПолученного = "СФ-001";
ФормаДокумента.ДатаСчетаФактурыПолученного = ТекущаяДата();

// Только теперь открываем форму пользователю
ФормаДокумента.Открыть();

Важный нюанс: Помните, что в типовой БП 3.0 при открытии формы может сработать стандартный механизм обновления данных, который перезаполнит или очистит ваши значения из базы данных. Поэтому способ с ПолучитьФорму требует осторожности.

Решение 3: Механизм Оповещений (если форма уже открыта)

Бывают случаи, когда форма документа уже открыта на экране, и нам нужно из другой (например, подбора или вспомогательной обработки) обновить в ней номер счета-фактуры. В этом случае мы не можем использовать ОткрытьФорму. Проанализируем работу через Оповестить.

1. В вашей обработке вызываем метод оповещения:

Оповестить("ЗаполнитьНомерСФ", "СФ-999");

2. В форме документа "Поступление товаров и услуг" создаем обработчик события ОбработкаОповещения:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ЗаполнитьНомерСФ" Тогда
        ЭтаФорма.НомерСчетаФактурыПолученного = Параметр;
        // Можно также вызвать типовую процедуру изменения, чтобы обновились связанные флаги
        НомерСчетаФактурыПолученногоПриИзменении(Элементы.НомерСчетаФактурыПолученного);
    КонецЕсли;
КонецПроцедуры

Особенности работы со счетами-фактурами в БП 3.0

При заполнении номера счета-фактуры программно, важно учитывать специфику учета НДС. Просто заполнить строковое поле НомерСчетаФактурыПолученного часто бывает недостаточно. Рассмотрим важные моменты:

  1. Флаг предъявления: На форме ПТУ есть реквизит (обычно связанный с объектом), такой как ПредъявленСчетФактура. Если он установлен в Ложь, поле номера может быть заблокировано для редактирования или скрыто. Обязательно устанавливайте его в Истина одновременно с заполнением номера.
  2. Связанный документ: Помните, что данные на форме — это "интерфейсный сахар". Чтобы счет-фактура реально попал в книгу покупок, должен существовать проведенный документ Документ.СчетФактураПолученный, где в табличной части или в реквизите ДокументОснование указана ссылка на ваше поступление.
  3. Типовые модули: В конфигурации есть общие модули, такие как УчетНДСКлиентСервер. Изучите их функции. Часто вместо ручного присвоения значения реквизиту формы, правильнее вызвать процедуру, которая обновит состояние всей группы элементов, связанных с НДС.

Резюме для разработчика

Для успешного заполнения реквизита формы в 1С 8.3 используйте следующий алгоритм:

  1. Проверьте, является ли реквизит частью Объекта или принадлежит только Форме.
  2. Для передачи данных при открытии используйте структуру Параметры и обработчик ПриСозданииНаСервере.
  3. Для динамического обновления открытых форм используйте Оповестить() и ОбработкаОповещения.
  4. Всегда проверяйте наличие связанных логических флагов (например, признак того, что счет-фактура вообще предъявлен), иначе визуально заполненные данные могут не сохраниться или быть стерты системой при обновлении формы.

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

← На главную