Как программно активировать проводки документа Операция в 1С?

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

При программной работе с документом ОперацияБух (в обиходе — «Операция вручную») разработчики часто сталкиваются с коварной проблемой. Код отрабатывает без ошибок, проводки в форме документа отображаются как активные (пиктограммы цветные, не серые), но при этом данные абсолютно не попадают в Оборотно-сальдовую ведомость (ОСВ) и другие бухгалтерские отчеты. Кажется, что система игнорирует внесенные изменения, а вернуть проводки «к жизни» получается только интерактивно — путем ручного отключения и повторного включения активности с последующей записью документа пользователем.

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С и конфигураций на базе БСП (например, «Бухгалтерия предприятия 3.0»), и предложим несколько гарантированных способов программной активации проводок.

Почему проводки документа «Операция» не попадают в ОСВ?

Прежде чем перейти к коду, давайте выясним причину такого поведения системы. Когда мы записываем набор записей регистра бухгалтерии напрямую, платформа действительно физически помещает строки в базу данных. Однако для того, чтобы эти записи стали полноценной частью бухгалтерских итогов и корректно отображались в отчетах, должен соблюдаться ряд условий, заложенных в логику типовых конфигураций и самой платформы 1С. Основными причинами «невидимости» проводок в ОСВ являются:

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

Рассмотрим подробнее каждый способ решения этой проблемы по шагам.

Способ 1. Правильный алгоритм записи набора движений через объект документа

Самая распространенная ошибка — это попытка работать с набором записей регистра отдельно от самого документа-регистратора. Для гарантированной активации проводок необходимо получить объект документа, обратиться к его коллекции движений, установить активность и записать именно объект документа, а не просто набор записей.

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


// Шаг 1. Получаем объект документа из ссылки
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// Шаг 2. Обращаемся к коллекции движений напрямую через объект
НаборХозрасчетный = ДокументОбъект.Движения.Хозрасчетный;

// Шаг 3. Читаем текущие движения из базы данных
НаборХозрасчетный.Прочитать();

// Шаг 4. Устанавливаем активность для всего набора записей
НаборХозрасчетный.УстановитьАктивность(Истина);

// Шаг 5. Обязательно взводим флаг необходимости записи набора
НаборХозрасчетный.Записывать = Истина;

// Шаг 6. Обходим каждую строку и принудительно устанавливаем активность для записей
Для Каждого Запись Из НаборХозрасчетный Цикл
    Запись.Активность = Истина;
    
    // Дополнительно проверяем заполнение ключевой аналитики
    Запись.Организация = ДокументОбъект.Организация;
    Запись.Период      = ДокументОбъект.Дата;
КонецЦикла;

// Шаг 7. Записываем сам документ. 
// Обратите внимание: у документа "Операция" проведение запрещено на уровне метаданных,
// поэтому используем режим простой записи.
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Важный нюанс: использование метода ДокументОбъект.Записать() инициирует выполнение всех платформенных и конфигурационных подписок на события. Это заставляет систему корректно обновить таблицы итогов регистра бухгалтерии, благодаря чему движения сразу же появляются в ОСВ.

Способ 2. Заполнение реквизита «СпособЗаполнения»

Если вы создаете документ ОперацияБух программно «с нуля», критически важно правильно заполнить его реквизиты. В типовых конфигурациях 1С (особенно в БСП) логика проведения и проверки движений жестко завязана на реквизит СпособЗаполнения.

Проанализируем пример правильного программного создания документа с активацией его проводок:


НовыйДокумент = Документы.ОперацияБух.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");

// КРИТИЧЕСКИ ВАЖНО: Указываем способ заполнения вручную
НовыйДокумент.СпособЗаполнения = "Вручную";

// Заполняем содержание
НовыйДокумент.Содержание = "Программное отражение операции";

// Создаем движения
Движение = НовыйДокумент.Движения.Хозрасчетный.Добавить();
Движение.Регистратор = НовыйДокумент.Ссылка;
Движение.Период      = НовыйДокумент.Дата;
Движение.Организация = НовыйДокумент.Организация;

// Заполнение счетов и субконто
Движение.СчетДт = ПланыСчетов.Хозрасчетный.ПрочиеРасходы;
Движение.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
Движение.Сумма  = 15000;
Движение.Активность = Истина;

// Подсчитываем общую сумму операции
НовыйДокумент.СуммаОперации = 15000;

// Указываем системе, что движения нужно записать вместе с документом
НовыйДокумент.Движения.Хозрасчетный.Записывать = Истина;

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

Если реквизит СпособЗаполнения останется пустым, то при последующих интерактивных действиях или при автоматических групповых перепроведениях система может посчитать эти движения некорректными (например, решит, что это незавершенная операция заполнения по какому-то шаблону) и просто сбросит их активность.

Способ 3. Использование типовых процедур синхронизации активности

В модуле объекта документа ОперацияБух (или в общем модуле работы с проводками этой конфигурации) зачастую определены специальные экспортные процедуры, которые синхронизируют состояние активности проводок с пометкой удаления или другими статусами документа. Одна из таких процедур — СинхронизироватьАктивностьДвиженийСПометкойУдаления().

Если стандартная перезапись не помогает, попробуем вызвать этот механизм принудительно:


ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// Читаем движения
ДокументОбъект.Движения.Хозрасчетный.Прочитать();

// Включаем активность для всех записей в цикле
Для Каждого СтрокаПроводки Из ДокументОбъект.Движения.Хозрасчетный Цикл
    СтрокаПроводки.Активность = Истина;
КонецЦикла;

// Взводим флаг записи
ДокументОбъект.Движения.Хозрасчетный.Записывать = Истина;

// Вызываем обработчик синхронизации активности, встроенный в модуль объекта
ДокументОбъект.СинхронизироватьАктивностьДвиженийСПометкойУдаления();

// Записываем документ
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

Этот метод гарантирует, что все внутренние подписки и скрытые реквизиты документа, отвечающие за связь «Документ-Проводки», придут в согласованное состояние.

Способ 4. Проблема с актуальностью итогов регистра бухгалтерии

Если вы выполнили все вышеописанные шаги, проверили код, зашли в базу под полными правами, открыли документ и убедились, что проводки горят зеленым цветом, но в ОСВ все равно пусто — дело может быть в платформенном механизме разделения итогов или в сбое расчета итогов регистра бухгалтерии.

Для исправления этой ситуации выполните следующие действия:

  1. Откройте базу в режиме Конфигуратора.
  2. Перейдите в меню Администрирование -> Тестирование и исправление....
  3. Выберите пункт «Пересчет итогов» и запустите процесс.

При массовой программной записи документов система может не успевать обновлять таблицы итогов в реальном времени, особенно если включен режим разделения итогов. Пересчет итогов принудительно актуализирует состояние регистра бухгалтерии, и все программно активированные проводки гарантированно отобразятся в Оборотно-сальдовой ведомости.

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


// Отключаем разделение итогов для ускорения записи и гарантированного обновления
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеРазделенияИтогов(Ложь);

// Выполняем массовую активацию документов...
// [Ваш код активации из Способа 1]

// Включаем разделение итогов обратно по завершении транзакции
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеРазделенияИтогов(Истина);

Используя предложенные методики и контролируя заполнение реквизитов СпособЗаполнения, СуммаОперации, а также записывая движения непосредственно через объект регистратора ДокументОбъект.Записать(), вы навсегда решите проблему «невидимых» проводок в ОСВ.

← На главную