Как выполнить групповое изменение типовой операции документов в БГУ 2.0?

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

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

Попытка решить эту задачу стандартным и привычным способом — через обработку «Групповое изменение реквизитов» — заканчивается неудачей. Пользователи обнаруживают, что в списке доступных для изменения реквизитов документа просто нет поля «Типовая операция» или «Бухгалтерская операция». Выясним причину этой особенности, разберем архитектуру хранения данных в БГУ 2.0 и рассмотрим детальные сценарии решения проблемы как интерактивными (штатными), так и программными методами.

Архитектурные особенности БГУ 2.0: почему нет реквизита в документе?

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

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

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

Именно поэтому стандартная обработка группового изменения реквизитов «не видит» эти параметры напрямую. Изменяя сам документ, мы никак не влияем на записи в этих независимых регистрах сведений.

Решение 1: Использование штатной обработки «Замена типовых операций и реквизитов»

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

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

  1. Откроем главное меню программы и перейдем в раздел «Функции для технического специалиста» (в старых версиях — «Все функции»).
  2. Развернем ветку «Обработки» и найдем в списке обработку с наименованием «Замена типовых операций и реквизитов операций». Откроем её.
  3. Альтернативный вариант быстрого перехода: откроем справочник «Типовые операции» и нажмем кнопку «Замена типовых операций и доп. реквизитов», расположенную на верхней командной панели.

Теперь детально разберем процесс настройки и выполнения замены в интерфейсе обработки:

  1. В поле «Вид документа» укажем тип документов, в которых требуется произвести изменения (например, Поступление материальных запасов или Поступление услуг, работ).
  2. В панели отборов настроим необходимые ограничения. Мы можем ограничить выборку документов по конкретной организации, периоду создания, автору или иным доступным реквизитам «шапки» документа.
  3. В поле «Старая типовая операция» выберем то значение, которое подлежит замене (например, операцию общего характера или техническую операцию «Обмен данными»).
  4. Нажмем кнопку «Заполнить документы». В табличной части отобразится список всех документов, соответствующих заданным условиям отбора. Мы можем вручную снять флажки напротив тех документов, которые не нужно трогать.
  5. В поле «Новая типовая операция» укажем целевую операцию, которую необходимо установить во все выбранные документы.
  6. После выбора новой операции станет доступна функция сопоставления реквизитов. Нажмем кнопку «Сопоставить реквизиты». Программа проанализирует структуру параметров старой и новой операций. Если у них есть одинаковые по смыслу дополнительные реквизиты (например, КФО или КПС), система автоматически перенесет их значения. Если реквизиты отличаются, мы сможем вручную указать новые значения по умолчанию для заполнения.
  7. Нажмем кнопку «Выполнить замену». Система последовательно запишет новые параметры в соответствующие регистры сведений и автоматически перепроведет измененные документы для актуализации бухгалтерских проводок.

Решение 2: Программный метод изменения операций (для разработчиков)

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

При замене операции нам обязательно нужно выполнить три ключевых шага:

  1. Записать новую типовую операцию в регистр ОперацииДокументов.
  2. Заполнить значения обязательных дополнительных реквизитов в регистре ЗначенияДополнительныхРеквизитовОпераций.
  3. Провести документ для отражения изменений на счетах бухгалтерского учета.

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


Процедура ИзменитьТиповуюОперациюДокумента(СсылкаНаДокумент, НоваяТиповаяОперация)
    
    // Шаг 1: Запись основной операции в регистр сведений "ОперацииДокументов"
    НаборЗаписей = РегистрыСведений.ОперацииДокументов.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Документ.Установить(СсылкаНаДокумент);
    
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.Документ = СсылкаНаДокумент;
    НоваяЗапись.ТиповаяОперация = НоваяТиповаяОперация;
    
    Попытка
        НаборЗаписей.Записать(Истина);
    Исключение
        ЗаписьЖурналаРегистрации("ГрупповоеИзменениеОпераций",
            УровеньЖурналаРегистрации.Ошибка, , ,
            "Не удалось записать операцию для документа: " + СсылкаНаДокумент + ". Ошибка: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Шаг 2: Проведение документа для формирования новых проводок
    ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    Если ДокументОбъект.Проведен Тогда
        Попытка
            ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
            ЗаписьЖурналаРегистрации("ГрупповоеИзменениеОпераций",
                УровеньЖурналаРегистрации.Предупреждение, , ,
                "Не удалось перепровести документ: " + СсылкаНаДокумент + ". Требуется ручное исправление.");
        КонецПопытки;
    КонецЕсли;

КонецПроцедуры

Часто возникает вопрос: как программно получить КФО (Код финансового обеспечения) или другой дополнительный реквизит для уже записанного, но еще непроведенного документа? Поскольку документ не проведен, проводок на счетах еще нет, и получить КФО из движений по регистру бухгалтерии невозможно. Напрямую в документе реквизита КФО также нет.

В этой ситуации нам на помощь приходит запрос к регистру ЗначенияДополнительныхРеквизитовОпераций. Проанализируем пример запроса, позволяющего получить значение КФО для переданной ссылки на документ:


Функция ПолучитьКФОДокумента(СсылкаНаДокумент) Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ЗначенияДопРеквизитов.Значение КАК КФО
        |ИЗ
        |	РегистрСведений.ЗначенияДополнительныхРеквизитовОпераций КАК ЗначенияДопРеквизитов
        |ГДЕ
        |	ЗначенияДопРеквизитов.Документ = &Документ
        |	И ВЫРАЗИТЬ(ЗначенияДопРеквизитов.Реквизит КАК ПланВидовХарактеристик.ДополнительныеРеквизитыОпераций).Имя = ""КФО""";
    
    Запрос.УстановитьПараметр("Документ", СсылкаНаДокумент);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.КФО;
    КонецЕсли;
    
    Возврат Неопределено;

КонецФункции

Возможные трудности при групповой замене и методы их преодоления

Массовые операции с базой данных практически всегда несут в себе риски возникновения блокировок или ошибок проведения. Рассмотрим наиболее частые проблемы и пути их оперативного решения.

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

Решение: Перед заменой операций воспользуйтесь стандартной обработкой Групповое изменение реквизитов. Нажмите кнопку «Дополнительные параметры» и включите отображение служебных реквизитов. Найдите табличную часть документа и массово заполните недостающие аналитические реквизиты в строках, после чего запускайте обработку замены типовой операции.

Проблема 2: Документы с включенной «Ручной корректировкой».
Если бухгалтер ранее зашел в документ, установил флаг «Ручная корректировка» и вручную отредактировал проводки, то при групповой замене операций и перепроведении изменения могут либо стереться, либо заблокировать выполнение групповой обработки.

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

Проблема 3: Высокая нагрузка на систему и транзакции.
Если заменяются операции в нескольких тысячах документов за один раз, система может надолго зависнуть, а другие пользователи начнут получать ошибки из-за взаимных блокировок таблиц СУБД.

Решение: Выполняйте масштабные групповые изменения исключительно во внерабочее время и в монопольном режиме. Если замена производится программно, разбивайте транзакции на пакеты (например, фиксируйте изменения порциями по 50–100 документов).

← На главную