Как программно установить флажки БУ, НУ, УУ в 1С:УПП и почему они сбрасываются при открытии?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При автоматизации бизнес-процессов в конфигурации «1С:Управление производственным предприятием» (УПП, редакция 1.3) разработчики часто сталкиваются с задачей программного создания документов. Типичный сценарий: создать документ, заполнить его реквизиты, выставить флаги отражения в учетах (БУ, НУ, УУ) и открыть форму пользователю для дальнейшего заполнения. Однако на этапе открытия формы программно установленные флаги учета неожиданно сбрасываются в значение Ложь.

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

Выясняем причину: почему платформа сбрасывает флаги?

Рассмотрим стандартный программный код создания документа, который на первый взгляд выглядит абсолютно рабочим:


НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;
НовыйДокумент.Организация = Справочники.Организации.НайтиПоКоду("000000001");

// Устанавливаем флаги отражения в учете
НовыйДокумент.ОтражатьВБухгалтерскомУчете = ИСТИНА;
НовыйДокумент.ОтражатьВНалоговомУчете = ИСТИНА;
НовыйДокумент.ОтражатьВУправленческомУчете = ИСТИНА;

// Открываем форму документа пользователю
ОткрытьЗначение(НовыйДокумент);

При выполнении этого кода форма документа РеализацияТоваровУслуг откроется, но флаги БУ, НУ и УУ на форме окажутся пустыми. Проанализируем, какие именно механизмы конфигурации приводят к такому результату:

  1. Определение статуса документа при открытии формы. Функция ОткрытьЗначение(НовыйДокумент) инициализирует открытие основной формы переданного объекта. Так как документ еще не записан в базу данных, платформа определяет его как новый (свойство ЭтоНовый() возвращает значение Истина).
  2. Автозаполнение новой формы по умолчанию. Для всех новых документов при открытии формы срабатывают стандартные обработчики событий (ПередОткрытием или ПриОткрытии). В них вызывается процедура общего модуля ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(). Этот механизм считывает персональные настройки текущего пользователя из регистра сведений «Настройки пользователей». Если в настройках пользователя автоматическая установка этих флагов отключена, процедура просто перезаписывает ваши программно установленные значения системными дефолтами (то есть сбрасывает в Ложь).
  3. Зависимость от реквизитов организации. За отрисовку и доступность реквизитов учета отвечает модуль РаботаСДиалогами.УправлениеПризнакомОтраженияВРеглУчете(). Если на момент инициализации формы реквизит Организация не заполнен или в свойствах выбранной организации снят флаг «Отражать в регламентированном учете», то система принудительно сбросит и заблокирует флаги БУ и НУ.

Таким образом, интерактивное открытие формы незаписанного объекта полностью затирает любые предварительные программные манипуляции с реквизитами учета.

Решение 1: Запись документа перед открытием (Простой метод)

Самый быстрый способ решения проблемы — принудительно записать созданный документ в базу данных перед вызовом его формы. В таком случае код будет выглядеть следующим образом:


НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Справочники.Организации.НайтиПоКоду("000000001");

НовыйДокумент.ОтражатьВБухгалтерскомУчете = ИСТИНА;
НовыйДокумент.ОтражатьВНалоговомУчете = ИСТИНА;
НовыйДокумент.ОтражатьВУправленческомУчете = ИСТИНА;

// Записываем документ в базу данных
НовыйДокумент.Записать();

// Открываем форму уже записанного документа
ОткрытьЗначение(НовыйДокумент);

Почему это работает? После выполнения метода Записать() документ получает статус существующего в БД. При открытии формы свойство ЭтоНовый() возвращает Ложь. Система понимает, что документ открывается повторно, и алгоритмы первоначальной инициализации реквизитов по умолчанию игнорируются. Все флаги остаются ровно в том состоянии, в котором вы их записали.

Минусы данного подхода:

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

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

Суть метода заключается в том, что мы сначала получаем саму форму (при этом отрабатывают все стандартные процедуры автозаполнения по умолчанию), а уже затем заполняем реквизиты в объекте, привязанном к этой форме. Посмотрим на пример кода:


// 1. Создаем пустой объект документа в оперативной памяти
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

// 2. Получаем форму документа (в этот момент отрабатывают процедуры автозаполнения формы)
ФормаДокумента = НовыйДокумент.ПолучитьФорму("ФормаДокумента");

// 3. Обращаемся к объекту документа, который уже привязан к форме
ДокОбъектФормы = ФормаДокумента.ДокументОбъект;

// 4. Заполняем реквизиты непосредственно в объекте формы
ДокОбъектФормы.Дата = ТекущаяДата();
ДокОбъектФормы.Организация = Справочники.Организации.НайтиПоКоду("000000001");
ДокОбъектФормы.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваров.ПродажаКомиссия;

// 5. Устанавливаем флаги отражения в учете поверх системных настроек
ДокОбъектФормы.ОтражатьВБухгалтерскомУчете = ИСТИНА;
ДокОбъектФормы.ОтражатьВНалоговомУчете = ИСТИНА;
ДокОбъектФормы.ОтражатьВУправленческомУчете = ИСТИНА;

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

При таком подходе форма открывается незаписанной, пользователь видит полностью заполненные реквизиты, и при закрытии окна без сохранения база данных не засоряется неактуальными документами.

Решение 3: Передача параметров заполнения (для управляемых форм)

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

Проанализируем пример передачи параметров через структуру ЗначенияЗаполнения:


// На стороне клиента подготавливаем параметры для открытия формы нового документа
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыЗаполнения.Вставить("ОтражатьВБухгалтерскомУчете", Истина);
ПараметрыЗаполнения.Вставить("ОтражатьВНалоговомУчете", Истина);
ПараметрыЗаполнения.Вставить("ОтражатьВУправленческомУчете", Истина);

ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", ПараметрыЗаполнения);

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

Платформа перенаправит эту структуру в серверный обработчик ОбработкаЗаполнения(), который корректно применит переданные значения при первичной инициализации данных, гарантируя заполнение всех необходимых флагов.

Важные нюансы и дополнительные проверки в УПП

Если после реализации одного из предложенных методов флаги все равно сбрасываются, обязательно проверьте следующие настройки системы:

  1. Флаг регламентированного учета в карточке Организации. Откройте справочник Организации и найдите организацию, которую вы подставляете в документ. Убедитесь, что в ее карточке установлен флаг «Отражать в регламентированном учете». Если этот флаг снят, код конфигурации УПП будет принудительно сбрасывать признаки БУ и НУ в ложь при любых операциях.
  2. Последовательность присвоения реквизитов. Всегда заполняйте реквизит Организация в коде до того, как начнете устанавливать флаги учета. В обработчике изменения организации прописаны процедуры пересчета параметров и сброса флагов. Если сначала установить флаги учета, а затем изменить организацию, флаги будут автоматически сброшены.
  3. Настройки пользователей по умолчанию. Для того чтобы избежать необходимости прописывать установку флагов программно для каждого документа, можно настроить их глобально для конкретного пользователя. Перейдите в меню Сервис -> Настройки пользователя -> Основные значения для подстановки в документы и активируйте необходимые флаги учета.
← На главную