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

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

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

Анализ структуры документа

Разберем ситуацию: при переносе данных из БГУ 1.0 документ Ввод начальных остатков содержит тысячи строк, но поле Дата принятия к учету оказывается незаполненным. Попытка просто перебрать строки основной табличной части ОС (или ОС_Основная) и присвоить значение реквизиту часто приводит к ошибке, так как нужного поля либо нет в этой таблице, либо оно требует синхронизации с другими данными.

В БГУ 2.0 документ «Ввод начальных остатков» является универсальным. Его состав и поведение меняются в зависимости от выбранного вида операции. Основные данные по объектам хранятся в связанных таблицах. Например:

  1. ОС_Основная — содержит перечень объектов основных средств.
  2. ОС_Амортизация — содержит сведения о датах, стоимости и накопленной амортизации.

Если реквизит ДатаПринятияКУчету отображается на форме, но отсутствует в ОС_Основная, значит, система берет его из связанной таблицы ОС_Амортизация.

Способ 1: Прямое заполнение через объект на сервере

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

Рассмотрим пример кода для обработки на сервере:


&НаСервере
Процедура ЗаполнитьРеквизитыНаСервере(СсылкаНаДокумент, НужнаяДата)
    
    ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    
    // Перебираем основную таблицу
    Для Каждого СтрокаОсновная Из ДокОбъект.ОС_Основная Цикл
        
        СтрокаОсновная.ДатаПринятияКУчету = НужнаяДата;
        
        // В БГУ 2.0 часто требуется создать соответствующую запись в таблице амортизации
        // Поиск существующей строки или добавление новой
        ПараметрыОтбора = Новый Структура("ОС", СтрокаОсновная.ОС);
        НайденныеСтроки = ДокОбъект.ОС_Амортизация.НайтиСтроки(ПараметрыОтбора);
        
        Если НайденныеСтроки.Количество() > 0 Тогда
            стрАмортизация = НайденныеСтроки[0];
        Иначе
            стрАмортизация = ДокОбъект.ОС_Амортизация.Добавить();
            стрАмортизация.ОС = СтрокаОсновная.ОС;
        КонецЕсли;
        
        стрАмортизация.ДатаПринятияКУчету = НужнаяДата;
        
    КонецЦикла;
    
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    
КонецПроцедуры

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

Способ 2: Работа через контекст управляемой формы

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

Посмотрим на пример заполнения через ДанныеФормы. Этот метод позволяет задействовать логику формы, которая может выполнять дополнительные проверки или пересчеты при изменении полей.


&НаСервере
Процедура ЗаполнитьЧерезФормуНаСервере(ДанныеФормы)
    // ДанныеФормы здесь — это структура Объект, полученная с формы
    Для Каждого СтрокаДанных Из ДанныеФормы.ОС_Основная Цикл
        СтрокаДанных.ДатаПринятияКУчету = ДанныеФормы.Дата;
        
        // Синхронизируем с таблицей амортизации внутри данных формы
        НоваяСтр = ДанныеФормы.ОС_Амортизация.Добавить();
        НоваяСтр.ОС = СтрокаДанных.ОС;
        НоваяСтр.ДатаПринятияКУчету = ДанныеФормы.Дата;
    КонецЦикла;
КонецПроцедуры

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

Рекомендации по заполнению документов БГУ 2.0

Для успешного программного взаимодействия с документами в БГУ 2.0 следует придерживаться нескольких правил:

  1. Проверяйте Вид операции: В зависимости от установленного значения ВидОперации документ может игнорировать одни табличные части и требовать заполнения других. Сначала программно установите вид операции, а затем заполняйте таблицы.
  2. Используйте Ключ связи: Если документ использует несколько табличных частей (например, ОС_Основная, ОС_Амортизация, ОС_Стоимость), связь между строками осуществляется по полю КлючСвязи. Убедитесь, что во всех связанных таблицах это значение совпадает для одного и того же объекта.
  3. Обработчики событий: Обратите внимание на процедуру ПриИзменении для колонок на форме. Если в ней заложен сложный алгоритм (например, расчет сумм или подстановка счетов), то при программном заполнении через Объект этот код не сработает. В таких случаях может потребоваться вызов экспортных процедур из модуля менеджера или серверных модулей учета ОС.
  4. Серверный контекст: Старайтесь выполнять все манипуляции с данными на сервере. Получение формы через ПолучитьФорму — ресурсозатратная операция, ее стоит использовать только тогда, когда данные физически не хранятся в объекте или нужно интерактивное участие пользователя.

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

← На главную