Как автоматически создать документ «Заказ поставщику» из табличной части обработки?

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

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

Разберем архитектурный подход: Метод Заполнить()

В современных конфигурациях 1С, построенных на базе Управления торговлей 11 (или УТ для Украины 3.1), механизмы создания документов стандартизированы. Самый правильный путь — использовать встроенную процедуру ОбработкаЗаполнения, которая находится в модуле объекта документа. Это позволяет системе автоматически выполнить все типовые проверки, подтянуть цены, счета учета и другие важные реквизиты.

Проанализируем ситуацию, когда у нас есть внешняя обработка с табличной частью ТЧ, которую нужно перенести в новый заказ. Для этого нам понадобится структура ДанныеЗаполнения, которую мы передадим методу Заполнить().

Реализация создания документа на сервере

Рассмотрим по шагам программный код, который позволяет создать документ и открыть его форму с уже заполненными данными. Основная логика должна выполняться на стороне сервера. Для этого создадим процедуру, которая будет подготавливать данные.

Пример реализации серверной логики:


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

На стороне клиента нам остается только вызвать эту процедуру и открыть форму нового, еще не записанного документа:


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

Проблема №1: Почему номенклатура и количество не попадают в документ?

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

Важные правила типизации:

  1. Колонка Номенклатура должна иметь тип СправочникСсылка.Номенклатура. Если у вас в обработке строки, предварительно найдите ссылки через Справочники.Номенклатура.НайтиПоНаименованию() или НайтиПоАртикулу().
  2. Колонка Количество в УТ 11 часто является расчетной, а основным полем для ввода является КоличествоУпаковок.
  3. Реквизит Упаковка также должен быть заполнен. Если вы не используете упаковки, туда необходимо подставить базовую единицу измерения номенклатуры.

Проблема №2: Работа с упаковками и автоматический пересчет

Выясним причину, почему количество может быть «невидимым» на форме. В документе Заказ поставщику на форме часто отображается поле КоличествоУпаковок, в то время как разработчик пытается заполнить только Количество. Если КоличествоУпаковок равно нулю, то в интерфейсе строка будет выглядеть пустой.

Рассмотрим пример правильного добавления строк вручную с использованием типовых механизмов пересчета:


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

Как быть с Артикулом?

Посмотрим на ситуацию с Артикулом. Часто пользователи просят перенести артикул в документ. Важно понимать, что в типовых конфигурациях 1С Артикул — это реквизит справочника Номенклатура, а не отдельное поле в табличной части документа.

Если вам нужно просто видеть артикул в списке товаров заказа:

  1. Откройте форму документа в режиме 1С:Предприятие.
  2. Нажмите кнопку Ещё — Изменить форму.
  3. Найдите в дереве элементов поле Номенклатура и разверните его (нажмите на плюс).
  4. Установите галочку напротив поля Артикул.

После этого артикул будет отображаться рядом с названием товара автоматически, и программно переносить его не требуется.

Подведем итоги

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

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

← На главную