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