При программном создании документов реализации («Реализация (акты, накладные)») разработчики нередко сталкиваются с ситуацией: документ успешно создается и записывается внешней обработкой, но при открытии формы пользователем поле Договор или гиперссылка Расчеты становятся недоступными для редактирования. При этом, если создать аналогичный документ вручную в пользовательском режиме, все элементы формы остаются активными и работают штатно. Разберем причины такого поведения и способы правильного программного заполнения документов в «1С:Бухгалтерия предприятия 3.0».
В типовых конфигурациях на платформе «1С:Предприятие 8.3» логика работы управляемых форм кардинально отделена от объектной модели. При открытии документа форма выполняет динамический анализ заполненных реквизитов объекта и на их основе настраивает видимость и доступность элементов интерфейса. Проанализируем ключевые факторы, из-за которых блокируются поля взаиморасчетов:
ВидОперации (перечисление ВидыОперацийРеализацияТоваров). Если этот реквизит пуст, форма не может определить сценарий учета и блокирует связанные поля.СоздатьДокумент() не выполняется стандартная инициализация объекта, если явно не вызван метод заполнения по умолчанию. В результате остаются пустыми реквизиты СпособЗачетаАвансов, ВалютаДокумента, КурсВзаиморасчетов, а также счета расчетов с контрагентом.СчетУчетаРасчетовСКонтрагентом (обычно 62.01) и СчетУчетаРасчетовПоАвансам (обычно 62.02) управляют доступностью гиперссылки «Расчеты». Если они не проинициализированы в объекте, форма считает параметры взаиморасчетов некорректными.СПокупателем или СКомиссионером), поле не позволит выбрать значение или станет недоступным.Если после очередного обновления конфигурации документ перестал корректно отображаться, выясним точный список незаполненных реквизитов путем прямого сопоставления объектов. Разберем этот диагностический алгоритм:
ВыгрузкаЗагрузкаДанныхXML83.epf и выгрузим оба документа в отдельные XML-файлы.Чтобы избежать ошибок при обновлениях метаданных, программное создание документа реализации необходимо выполнять с обязательным вызовом процедур инициализации по умолчанию. Рассмотрим правильный порядок действий:
Заполнить(Неопределено) сразу после создания объекта — это запускает обработчик ОбработкаЗаполнения в модуле объекта и инициализирует базовые реквизиты.СчетаУчетаВДокументах и ДоговорыКонтрагентов) для автоматического определения счетов учета и договоров по умолчанию.Посмотрим на пример правильного формирования документа реализации товаров:
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// 1. Инициализация стандартных реквизитов объекта
НовыйДокумент.Заполнить(Неопределено);
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.Товары;
НовыйДокумент.Организация = ВыбраннаяОрганизация;
НовыйДокумент.Контрагент = ВыбранныйКонтрагент;
// 2. Получение договора по умолчанию или явное присвоение
НовыйДокумент.ДоговорКонтрагента = ДоговорыКонтрагентов.ПолучитьДоговорПоУмолчанию(
НовыйДокумент.Контрагент,
НовыйДокумент.Организация,
Перечисления.ВидыДоговоровКонтрагентов.СПокупателем
);
// 3. Заполнение счетов учета расчетов
СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаРасчетов(НовыйДокумент);
// 4. Заполнение параметров расчетов и валют
НовыйДокумент.СпособЗачетаАвансов = Перечисления.СпособыЗачетаАвансов.Автоматически;
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
Такой подход гарантирует, что в объекте будут заполнены все скрытые и вспомогательные реквизиты, а элементы управляемой формы (включая поле Договор и параметры расчетов) останутся полностью доступными для дальнейшего ручного редактирования пользователями.