Как программно заполнить табличную часть документа при открытии формы в 1С:Бухгалтерия 3.0?

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

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

Анализ проблемы: почему стандартная структура не заполняет ТЧ

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

Решение через использование временного хранилища и специальных ключей

В современных типовых решениях (БП 3.0, УТ 11, ERP) для заполнения табличных частей при открытии формы часто используется механизм передачи адреса таблицы значений во временном хранилище. В случае с документом «Счет на оплату покупателю» в БП 3.0 предусмотрен специальный параметр АдресТаблицыНоменклатуры. Рассмотрим по шагам, как это реализовать.

Шаг 1. Подготовка данных на сервере

Проанализируем процесс подготовки данных. Нам необходимо создать ТаблицаЗначений, структура колонок которой должна в точности соответствовать именам реквизитов табличной части «Товары» целевого документа. После формирования таблицы мы помещаем ее во ВременноеХранилище и передаем полученный адрес на клиент.


&НаСервереБезКонтекста
Функция ПолучитьДанныеДляЗаполнения()
    // Создаем структуру для возврата параметров заполнения
    ДанныеЗаполнения = Новый Структура;
    
    // 1. Заполняем реквизиты шапки
    ДанныеЗаполнения.Вставить("Организация", Справочники.Организации.НайтиПоНаименованию("Наша Организация"));
    ДанныеЗаполнения.Вставить("Контрагент", Справочники.Контрагенты.НайтиПоКоду("00001"));
    
    // 2. Формируем таблицу значений для ТЧ "Товары"
    ТЗ_Товары = Новый ТаблицаЗначений;
    ТЗ_Товары.Колонки.Добавить("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
    ТЗ_Товары.Колонки.Добавить("Количество",   Новый ОписаниеТипов("Число"));
    ТЗ_Товары.Колонки.Добавить("Цена",         Новый ОписаниеТипов("Число"));
    ТЗ_Товары.Колонки.Добавить("Сумма",        Новый ОписаниеТипов("Число"));
    ТЗ_Товары.Колонки.Добавить("СтавкаНДС",    Новый ОписаниеТипов("ПеречислениеСсылка.СтавкиНДС"));
    
    // Добавляем тестовую строку
    НоваяСтрока = ТЗ_Товары.Добавить();
    НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Услуга по внедрению");
    НоваяСтрока.Количество   = 1;
    НоваяСтрока.Цена         = 5000;
    НоваяСтрока.Сумма        = 5000;
    
    // Помещаем таблицу во временное хранилище
    // Уникальный идентификатор формы (ЭтаФорма.УникальныйИдентификатор) 
    // передается обычно с клиента для привязки жизни хранилища к форме
    АдресХранилища = ПоместитьВоВременноеХранилище(ТЗ_Товары);
    
    // Добавляем адрес в структуру под специальным ключом, который "ждет" форма БП
    ДанныеЗаполнения.Вставить("АдресТаблицыНоменклатуры", АдресХранилища);
    
    Возврат ДанныеЗаполнения;
КонецФункции

Шаг 2. Вызов открытия формы на клиенте

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


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

Почему это работает?

Выясним причину, по которой используется именно АдресТаблицыНоменклатуры. В типовой «Бухгалтерии предприятия» форма документа «Счет на оплату покупателю» содержит специализированный код в обработчике ПриСозданииНаСервере или в подключаемых модулях заполнения. Этот код проверяет наличие параметра с таким именем. Если параметр найден, система извлекает таблицу из хранилища и программно переносит строки в объект документа. Это часть механизма «Подбор номенклатуры» и «Заполнение из внешних источников», который реализован в БСП.

Альтернативный метод: ПараметрОбъектКопирования

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


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ПараметрОбъектКопирования", СсылкаНаСуществующийСчет);
ОткрытьФорму("Документ.СчетНаОплатуПокупателю.ФормаОбъекта", ПараметрыФормы);

Важные рекомендации при работе с ТЧ

При заполнении табличных частей программным способом стоит учитывать следующие нюансы:

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

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

← На главную