При автоматизации бизнес-процессов в 1С часто возникает необходимость программного создания документов. Одной из распространенных проблем в конфигурации 1С:Бухгалтерия предприятия 3.0 (БП 3.0) является ситуация, когда после программного формирования документа Счет на оплату покупателю поле Банковский счет (в метаданных — СтруктурнаяЕдиница) становится заблокированным для изменения на форме. При этом в документах, созданных вручную, такой проблемы не наблюдается.
В этой статье мы подробно разберем, почему возникает эта блокировка, как проанализировать отличия между объектами и как правильно написать код для создания счета, чтобы сохранить интерактивность формы.
Проанализируем ситуацию: в типовых конфигурациях на управляемых формах доступность полей часто зависит не только от прав доступа, но и от логики Условного оформления и серверных процедур, обновляющих состояние формы. В документе Счет на оплату покупателю поле Банковский счет тесно связано с реквизитом Получатель.
Выясним причину: если при программном создании документа вы заполняете только Организация, но оставляете поле Получатель пустым, механизмы формы 1С могут считать данные некорректными или неполными. Поскольку система не может однозначно определить, к какому именно субъекту (организации или её подразделению) относится банковский счет, она блокирует выбор этого поля, чтобы избежать ошибок учета.
Как только мы заполняем реквизит Получатель (который в большинстве случаев совпадает с основной организацией), программные триггеры на форме отрабатывают корректно, и поле выбора счета становится доступным.
Если вы столкнулись с подобной проблемой, лучшим способом диагностики будет сравнение "эталонного" документа (созданного вручную) и вашего "программного" документа. Рассмотрим, как это сделать правильно.
Шаг 1. Использование отладки и вычисление выражений
Рассмотрим пошагово процесс сравнения через конфигуратор:
ПриСозданииНаСервере или перед записью.Объект.Получатель, Склад, Статус, ПодразделениеОрганизации.Шаг 2. Использование универсальных обработок
Для более быстрого анализа можно воспользоваться консолью запросов или обработкой "Редактирование реквизитов объектов". Выбрав два документа (ручной и программный), вы сможете наглядно увидеть разницу в заполнении полей, которые не всегда выведены на форму, но влияют на её поведение.
Вместо того чтобы вручную инициализировать каждый реквизит, рекомендуется использовать стандартные механизмы платформы и БСП. Проанализируем пример кода, который решает проблему блокировки счета:
// Создаем новый объект документа
НовыйДокументСчет = Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
// Инициализируем заполнение стандартными значениями (важно!)
// Это вызовет процедуру ОбработкаЗаполнения в модуле объекта
НовыйДокументСчет.Заполнить(Неопределено);
// Заполняем основные реквизиты
НовыйДокументСчет.Дата = ТекущаяДата();
НовыйДокументСчет.Организация = ОрганизацияСсылка;
// ОБЯЗАТЕЛЬНО: Заполняем Получателя, чтобы поле Банковский счет было активно
НовыйДокументСчет.Получатель = ОрганизацияСсылка;
НовыйДокументСчет.Контрагент = КонтрагентСсылка;
НовыйДокументСчет.ДоговорКонтрагента = ДоговорСсылка;
// Установка банковского счета (СтруктурнаяЕдиница)
НовыйДокументСчет.СтруктурнаяЕдиница = ОрганизацияСсылка.ОсновнойБанковскийСчет;
// Дополнительные параметры
НовыйДокументСчет.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
НовыйДокументСчет.КратностьВзаиморасчетов = 1;
НовыйДокументСчет.КурсВзаиморасчетов = 1;
// Записываем и проводим
НовыйДокументСчет.Записать(РежимЗаписиДокумента.Проведение);
// Работа со сроками оплаты через типовой механизм
СрокОплаты = СрокиОплатыДокументов.СрокОплатыНовогоСчетаПокупателю(ТекущаяДата());
СрокиОплатыДокументов.ЗаписатьСрокОплатыДокумента(НовыйДокументСчет.Ссылка, СрокОплаты);
Рассмотрим подробнее механизм Объект.Заполнить(). В современных конфигурациях 1С (на базе БСП) в модуле объекта прописана процедура ОбработкаЗаполнения. Когда мы вызываем этот метод, система автоматически:
ДополнительныеСвойства, которые могут влиять на видимость и доступность элементов формы.Если создавать документ простым присваиванием реквизитов (как в сообщении 3 исходной темы), эти механизмы пропускаются, что ведет к "недозаполненности" объекта с точки зрения логики управляемой формы. При поиске готовых решений и типовых функций конфигурации можно использовать справочник методов Бухгалтерии предприятия 3.0.
При создании документов через HTTP-сервисы в расширениях, мы часто ограничены контекстом. Проанализируем несколько советов, которые помогут избежать ошибок в будущем:
БанковскиеСчета и Организации.ПользователиКлиентСервер.ТекущийПользователь(), который может не сработать в серверном контексте HTTP-запроса, используйте явное указание ответственного или метод Пользователи.АвторизованныйПользователь().Структуру, а затем используйте её для заполнения документа, предварительно проверив типы данных (например, через XMLЗначение или поиск по коду/ИНН).Резюме: Если в 1С:Бухгалтерия 3.0 поле Банковский счет заблокировано — в 90% случаев это означает, что не заполнен реквизит Получатель или нарушена логика связи между организацией и счетом. Всегда используйте отладку для сравнения программно созданного объекта с объектом, созданным вручную в интерфейсе программы.