В процессе разработки учетных систем часто возникает задача автоматизации рутинных операций. Одной из таких задач является создание документа Заказ поставщику на основе данных, полученных в результате работы внешней обработки (например, при анализе продаж за период). В этой статье мы подробно разберем, как программно передать данные из табличной части обработки в новый документ, проанализируем типичные ошибки начинающих разработчиков и выясним, почему данные могут «не долетать» до формы документа.
В современных конфигурациях 1С, построенных на базе Управления торговлей 11 (или УТ для Украины 3.1), механизмы создания документов стандартизированы. Самый правильный путь — использовать встроенную процедуру ОбработкаЗаполнения, которая находится в модуле объекта документа. Это позволяет системе автоматически выполнить все типовые проверки, подтянуть цены, счета учета и другие важные реквизиты.
Проанализируем ситуацию, когда у нас есть внешняя обработка с табличной частью ТЧ, которую нужно перенести в новый заказ. Для этого нам понадобится структура ДанныеЗаполнения, которую мы передадим методу Заполнить().
Рассмотрим по шагам программный код, который позволяет создать документ и открыть его форму с уже заполненными данными. Основная логика должна выполняться на стороне сервера. Для этого создадим процедуру, которая будет подготавливать данные.
Пример реализации серверной логики:
&НаСервере
Процедура СоздатьЗаказНаСервере(ДанныеФормыОбъекта)
// Создаем новый объект документа программно
НовыйДокумент = Документы.ЗаказПоставщику.СоздатьДокумент();
// Формируем таблицу товаров для заполнения
// Важно: имена колонок должны совпадать с именами в ТЧ документа
ТаблицаТоваров = Объект.ТЧ.Выгрузить();
// Подготавливаем структуру параметров для заполнения
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("Товары", ТаблицаТоваров);
ДанныеЗаполнения.Вставить("Склад", Объект.Склад);
// Вызываем стандартный механизм заполнения конфигурации
НовыйДокумент.Заполнить(ДанныеЗаполнения);
// Передаем созданный объект обратно в данные формы для отображения пользователю
ЗначениеВДанныеФормы(НовыйДокумент, ДанныеФормыОбъекта);
КонецПроцедуры
На стороне клиента нам остается только вызвать эту процедуру и открыть форму нового, еще не записанного документа:
&НаКлиенте
Процедура СоздатьЗаказПоставщику(Команда)
// Получаем пустую форму нового документа
ПараметрыФормы = Новый Структура;
Форма = ПолучитьФорму("Документ.ЗаказПоставщику.ФормаОбъекта", ПараметрыФормы);
// Копируем объект формы в переменную для модификации на сервере
ДанныеОбъекта = Форма.Объект;
СоздатьЗаказНаСервере(ДанныеОбъекта);
// Возвращаем измененные данные обратно в форму
КопироватьДанныеФормы(ДанныеОбъекта, Форма.Объект);
// Открываем готовую форму пользователю
Форма.Открыть();
КонецПроцедуры
Рассмотрим наиболее частую причину, по которой табличная часть остается пустой или заполняется частично. Это несоответствие типов данных. Если в вашей обработке в колонке Номенклатура хранится строка (название товара), а документ ожидает ссылку на справочник, то 1С просто проигнорирует такое значение.
Важные правила типизации:
Номенклатура должна иметь тип СправочникСсылка.Номенклатура. Если у вас в обработке строки, предварительно найдите ссылки через Справочники.Номенклатура.НайтиПоНаименованию() или НайтиПоАртикулу().Количество в УТ 11 часто является расчетной, а основным полем для ввода является КоличествоУпаковок.Упаковка также должен быть заполнен. Если вы не используете упаковки, туда необходимо подставить базовую единицу измерения номенклатуры.Выясним причину, почему количество может быть «невидимым» на форме. В документе Заказ поставщику на форме часто отображается поле КоличествоУпаковок, в то время как разработчик пытается заполнить только Количество. Если КоличествоУпаковок равно нулю, то в интерфейсе строка будет выглядеть пустой.
Рассмотрим пример правильного добавления строк вручную с использованием типовых механизмов пересчета:
&НаСервере
Процедура ЗаполнитьСтрокиДокумента(ДокОбъект)
Для Каждого СтрИзОбработки Из Объект.ТЧ Цикл
НоваяСтрока = ДокОбъект.Товары.Добавить();
// Переносим данные (имена колонок должны совпадать!)
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрИзОбработки);
// Если поле КоличествоУпаковок в ТЧ обработки не заполнено,
// заполняем его значением обычного количества
Если НоваяСтрока.КоличествоУпаковок = 0 Тогда
НоваяСтрока.КоличествоУпаковок = СтрИзОбработки.Количество;
КонецЕсли;
// Вызываем типовой пересчет, чтобы система заполнила веса, объемы и прочее
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок");
// Используем встроенную функцию конфигурации для обработки строки
ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, Неопределено);
КонецЦикла;
КонецПроцедуры
Посмотрим на ситуацию с Артикулом. Часто пользователи просят перенести артикул в документ. Важно понимать, что в типовых конфигурациях 1С Артикул — это реквизит справочника Номенклатура, а не отдельное поле в табличной части документа.
Если вам нужно просто видеть артикул в списке товаров заказа:
Номенклатура и разверните его (нажмите на плюс).Артикул.После этого артикул будет отображаться рядом с названием товара автоматически, и программно переносить его не требуется.
Для успешного создания документа из обработки мы проанализировали следующие этапы:
Заполнить() как наиболее безопасного и правильного.КоличествоУпаковок для корректного отображения данных.Соблюдение этих правил позволит вам создавать надежные механизмы автоматизации, которые будут корректно работать даже после обновлений конфигурации.