При разработке на платформе 1С:Предприятие 8.3 часто возникает задача: необходимо создать новый документ, открыть его форму пользователю, но перед этим программно заполнить не только «шапку» (реквизиты), но и табличную часть. Для этих целей существуют и готовые инструменты, такие как автоматическое заполнение реквизитов и табличных частей, позволяющие настраивать правила без программирования. Ситуация усложняется, если мы работаем с Базовой версией конфигурации или конфигурацией, находящейся на полной поддержке, где внесение изменений в код модулей невозможно.
В этой статье мы подробно разберем, как решить эту задачу, обойдя ограничения на изменение конфигурации. Мы рассмотрим несколько способов, проанализируем, почему стандартная передача параметров не всегда срабатывает для таблиц, и найдем оптимальное решение.
Рассмотрим типичный сценарий. У нас есть задача открыть форму создания документа (например, «Требование-накладная» или «Реализация товаров») и сразу же подставить туда список товаров. В качестве готового примера можно рассмотреть заполнение по спецификации документов Требование-накладная, где реализован классический механизм внешних обработок. Стандартный подход, который часто используют разработчики, выглядит так:
ПолучитьФорму или ОткрытьФорму с передачей этих параметров.Однако, как заметил автор вопроса, если для простых реквизитов (ссылочного типа, даты, числа) платформа автоматически подхватывает значения (если у реквизита в свойствах стоит галка «Заполнять из данных заполнения»), то с табличной частью этот фокус не проходит. Табличная часть остается пустой.
Давайте разберем три основных способа решения этой задачи, от самого простого программного метода до использования механизмов БСП.
Самый действенный и универсальный метод, который работает даже в Базовых версиях и не требует создания внешних обработок или расширений — это манипуляция данными формы после её получения, но перед открытием. Если же вам требуется стандартная установка основных значений для подстановки в реквизиты, можно воспользоваться типовыми механизмами БСП.
Суть метода заключается в особенностях работы Управляемых форм. Когда мы вызываем метод ПолучитьФорму, платформа создает экземпляр формы в памяти. В этот момент мы имеем доступ к коллекции данных формы (реквизиту Объект), которая доступна для записи на клиенте.
Рассмотрим пошагово, как это реализовать:
Посмотрим на пример кода, который реализует эту логику:
// 1. Получаем форму нового документа.
// Параметры можно не передавать, если мы будем заполнять всё вручную.
ФормаДокумента = ПолучитьФорму("Документ.ТребованиеНакладная.ФормаОбъекта");
// 2. Заполняем реквизиты шапки (если нужно)
// Обратите внимание: мы обращаемся через ФормаДокумента.Объект
ФормаДокумента.Объект.Склад = СсылкаНаСклад;
ФормаДокумента.Объект.Дата = ТекущаяДата();
// 3. Заполняем Табличную Часть (например, "Материалы")
// Данные в управляемой форме представлены типом ДанныеФормыКоллекция
ТЧМатериалы = ФормаДокумента.Объект.Материалы;
// Добавляем строку
НоваяСтрока = ТЧМатериалы.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаТовар;
НоваяСтрока.Количество = 10;
НоваяСтрока.Счет = ПредопределенноеЗначение("ПланСчетов.Хозрасчетный.Материалы");
// Добавляем вторую строку
НоваяСтрока2 = ТЧМатериалы.Добавить();
НоваяСтрока2.Номенклатура = СсылкаНаТовар2;
НоваяСтрока2.Количество = 5;
// 4. Открываем уже заполненную форму пользователю
ФормаДокумента.Открыть();
Почему это работает? Реквизит Объект на управляемой форме является проекцией данных реального объекта. Изменяя его поля и коллекции на клиенте до открытия, мы фактически имитируем ввод данных пользователем. При нажатии кнопки «Записать» платформа корректно сохранит введенные нами данные.
Если ваша конфигурация основана на БСП (Библиотека Стандартных Подсистем) — например, 1С:Бухгалтерия, УТ 11, ЗУП 3 — и вам нужно дать пользователю кнопку «Заполнить» внутри уже открытого документа, то лучшим вариантом будет использование Внешней обработки заполнения. Для автоматизации ввода данных контрагентов часто применяют аналогичные решения, такие как заполнение реквизитов по ИНН, которое работает во всех современных конфигурациях (для этого есть обработка автозаполнения реквизитов контрагента по ИНН для 1С).
Это особенно актуально для Базовых версий, где нельзя включить возможность изменения конфигурации. Этот механизм позволяет «легально» подключать внешний код.
Разберем основные требования к такой обработке:
СведенияОВнешнейОбработке.ВыполнитьКоманду.Пример структуры регистрации в модуле объекта обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Назначение", Новый Массив);
// Указываем, к какому документу подключаем
ПараметрыРегистрации.Назначение.Добавить("Документ.ТребованиеНакладная");
// Добавляем команду
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Идентификатор");
Команды.Колонки.Добавить("Представление");
Команды.Колонки.Добавить("Использование");
НоваяКоманда = Команды.Добавить();
НоваяКоманда.Идентификатор = "ЗаполнитьСпецифично";
НоваяКоманда.Представление = "Заполнить по особому алгоритму";
// "ВызовСерверногоМетода" означает, что код выполнится на сервере
// и изменит переданный объект
НоваяКоманда.Использование = "ВызовСерверногоМетода";
ПараметрыРегистрации.Вставить("Команды", Команды);
Возврат ПараметрыРегистрации;
КонецФункции
А сама процедура заполнения выглядит так:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт
// ОбъектыНазначенияМассив содержит ссылки или сами объекты документов
Для Каждого ДокументОбъект Из ОбъектыНазначенияМассив Цикл
// Очищаем и заполняем ТЧ
ДокументОбъект.Материалы.Очистить();
НоваяСтрока = ДокументОбъект.Материалы.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
// ... прочие заполнения
КонецЦикла;
КонецПроцедуры
После подключения такой обработки через справочник «Дополнительные отчеты и обработки», в документе появится кнопка «Заполнить», которая выполнит ваш код.
Для полноты картины рассмотрим, почему автор вопроса упоминал ОбработкаЗаполнения и почему ему посоветовали этот метод. Если бы конфигурация была доступна для изменения (не Базовая, снята с поддержки), правильнее всего было бы использовать событие модуля объекта ОбработкаЗаполнения. Также для этих целей часто используют универсальный механизм добавления табличных частей через расширение, который позволяет обойтись без модификации основной конфигурации.
В этом событии можно перехватить структуру ДанныеЗаполнения, которую мы передаем при открытии формы.
Код при открытии формы (на клиенте):
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("МоиТовары", МассивТоваров);
ПараметрыФормы = Новый Структура("ЗначенияЗаполнения", СтруктураДанных);
ОткрытьФорму("Документ.Имя.ФормаОбъекта", ПараметрыФормы);
Код в модуле объекта документа (на сервере):
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура")
И ДанныеЗаполнения.Свойство("МоиТовары") Тогда
Для Каждого ТекТовар Из ДанныеЗаполнения.МоиТовары Цикл
НовСтр = ЭтотОбъект.Товары.Добавить();
НовСтр.Номенклатура = ТекТовар;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Этот метод считается архитектурно самым верным, но, как мы выяснили, он не подходит для конфигураций, находящихся на полной поддержке. Самым современным трендом в этой области является применение нейросетей, например, 1C AI Autofill — расширение для заполнения реквизитов с помощью ИИ.
Подведем итог. Если вы столкнулись с необходимостью заполнить табличную часть документа при открытии и не можете менять конфигурацию:
Форма.Объект перед открытием). Это быстро, надежно и не требует лицензии ПРОФ.