Как программно заполнить табличную часть документа, если она принадлежит сторонней обработке в 1С

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

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

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

Выясним причину такого проектирования, разберем по шагам логику работы платформы и напишем готовый рабочий код для заполнения документа.

Архитектурный нюанс: почему табличная часть «принадлежит обработке»

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

Для реализации такого интерфейса в СУБД существует серьезное препятствие: хранить данные в базе данных в виде неопределенного или избыточного количества колонок по месяцам крайне неэффективно и ненормализованно. Физически в базе данных показатели должны храниться «вертикально» — каждая сумма привязывается к своей аналитике и конкретной дате (началу месяца) в виде отдельной строки.

Чтобы разрешить это противоречие, разработчики 1С применили специальный паттерн проектирования:

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

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

Пошаговый алгоритм программного заполнения

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

Разберем процесс по шагам:

Шаг 1. Инициализация и заполнение реквизитов шапки

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

Шаг 2. Вертикальное заполнение табличной части

Вместо попыток эмулировать ввод в колонки «Январь», «Февраль» и так далее, мы добавляем по одной строке на каждый месяц планирования. Ключевым реквизитом здесь является период планирования (обычно это реквизит ПериодПлана или Дата), в который необходимо передавать дату начала соответствующего месяца (например, 01.03.2026 00:00:00 для марта 2026 года).

Шаг 3. Проведение документа

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

Посмотрим на пример практической реализации данного алгоритма на встроенном языке 1С:


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

Процедура СоздатьПланФинансированияПрограммно(ДоговорСсылка, ТаблицаПлатежей)

    // 1. Создаем новый документ
    НовыйДокумент = Документы.ПланФинансированияОбязательства.СоздатьДокумент();
    
    // Заполняем базовые реквизиты шапки
    НовыйДокумент.Дата = ТекущаяДата();
    
    // Используем стандартную обработку заполнения на основании договора (если применимо)
    НовыйДокумент.Заполнить(ДоговорСсылка);
    
    // Заполняем обязательные реквизиты, если они не заполнились автоматически
    НовыйДокумент.Учреждение = ДоговорСсылка.Организация; // Для БГУ это обычно Учреждение
    НовыйДокумент.Договор    = ДоговорСсылка;
    
    // 2. Заполняем физическую табличную часть "Показатели" напрямую
    // ТаблицаПлатежей содержит колонки: КФО, КПС, КЭК, ДатаПлатежа, Сумма
    Для Каждого СтрокаИсточника Из ТаблицаПлатежей Цикл
        
        // Добавляем строку в реальную скрытую ТЧ документа
        НоваяСтрока = НовыйДокумент.Показатели.Добавить();
        
        НоваяСтрока.КФО = СтрокаИсточника.КФО;
        НоваяСтрока.КПС = СтрокаИсточника.КПС;
        НоваяСтрока.КЭК = СтрокаИсточника.КЭК;
        
        // Важно: Период плана должен указывать строго на начало месяца планирования
        НоваяСтрока.ПериодПлана = НачалоМесяца(СтрокаИсточника.ДатаПлатежа);
        
        НоваяСтрока.Сумма = СтрокаИсточника.Сумма;
        
    КонецЦикла;
    
    // 3. Записываем и проводим созданный документ
    Попытка
        // Рекомендуется выполнять запись в транзакции с проведением
        НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Документ успешно создан и проведен: " + НовыйДокумент.Ссылка);
    Исключение
        // В случае ошибок выводим подробное описание
        ВызватьИсключение "Не удалось записать или провести документ. Причина: " + ОписаниеОшибки();
    КонецПопытки;

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

Важные нюансы, которые необходимо учесть при разработке

Для обеспечения надежности работы кода и исключения расхождения данных в системе, обратим внимание на следующие особенности:

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

← На главную