Как программно создать и заполнить документ «Заказ клиента» в 1С:Управление торговлей 11?

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

В процессе автоматизации задач часто возникает необходимость создания документов по внешним данным (например, из DBF-файлов или электронных писем) без открытия пользовательского интерфейса — для решения этой задачи подойдёт автоматическое создание документов из электронной почты. Рассмотрим, почему попытки «взломать» управляемую форму для этих целей являются ошибочными и как правильно реализовать эту задачу через объектную модель 1С.

Почему не стоит использовать ПолучитьФорму для фонового создания документов

Многие разработчики, имеющие опыт работы в предыдущих версиях 1С или привыкшие к клиентской логике, пытаются использовать ПолучитьФорму для инициализации нового документа — хотя для импорта файлов удобнее использовать универсальную загрузку документов из Excel без программирования. Проанализируем, почему это неверный подход:

  1. Разделение данных и интерфейса: Управляемая форма — это лишь «представление» данных для пользователя. При программном создании документа нам не нужно рисовать поля, вызывать обработчики ПриОткрытии или ПриСозданииНаСервере.
  2. Производительность: Вызов формы требует значительных ресурсов сервера для отрисовки элементов интерфейса, что замедляет обработку данных.
  3. Конфликт событий: Программное присвоение значений через ДанныеФормы не всегда запускает логику автоматического заполнения зависимых полей (например, Соглашение), так как многие механизмы УТ 11 жестко привязаны к серверным объектам, а не к элементам формы.

Алгоритм правильного создания документа

Для создания документа в 1С:Управление торговлей 11 мы будем работать с объектом ДокументОбъект. Этот метод позволяет создать экземпляр в памяти, заполнить его данными и сохранить в базе данных без участия пользователя — для этой задачи есть массовое создание заказов в 1С:УТ 11.

Разберем процесс по шагам:

  1. Создаем новый документ: Док = Документы.ЗаказКлиента.СоздатьДокумент();
  2. Заполняем реквизиты шапки (Партнер, Контрагент, Организация).
  3. Заполняем табличную часть данными из источника (например, DBF) — ускорить этот процесс поможет автоматическая загрузка документов из внешних файлов.
  4. Вызываем методы расчета (например, РассчитатьСуммуТабличнойЧасти).
  5. Записываем документ.

Пример программного заполнения документа

Посмотрим на структуру кода, которая позволит корректно заполнить документ с учетом специфики УТ 11 (взаимосвязь Партнеров и Контрагентов):


// Создаем объект документа на сервере
Док = Документы.ЗаказКлиента.СоздатьДокумент();
Док.Дата = ТекущаяДата();

// В УТ 11 сначала важно найти Партнера, так как к нему привязаны соглашения
КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
Если ЗначениеЗаполнено(КонтрагентСсылка) Тогда
    Док.Контрагент = КонтрагентСсылка;
    Док.Партнер = КонтрагентСсылка.Партнер;
КонецЕсли;

// Автоматическое заполнение зависимых полей (Соглашение)
// Мы можем вызвать стандартную процедуру заполнения, если необходимо
Док.Заполнить(Неопределено); 

// Заполнение табличной части
НоваяСтрока = Док.Товары.Добавить();
НоваяСтрока.Номенклатура = НайтиНоменклатуруПоАртикулу(Артикул);
НоваяСтрока.Количество = 1;

// Запись документа
Док.Записать(РежимЗаписиДокумента.Запись);

Работа с зависимыми данными: Партнер и Соглашение

Особое внимание уделим автоматизации заполнения соглашений. В конфигурации 1С:Управление торговлей после того, как вы программно установили Партнер, система ожидает подстановку Соглашение. Поскольку вы работаете вне формы, обработчики ПриИзменении не сработают. Чтобы добиться нужного результата, необходимо:

Важные рекомендации для разработки

Чтобы ваша обработка работала стабильно, придерживайтесь следующих правил:

  1. Используйте серверные функции: Все операции по поиску справочников и созданию документов выносите в функции &НаСервере.
  2. Проверяйте заполненность: Всегда проверяйте результат поиска НайтиПоРеквизиту перед присвоением, чтобы избежать ошибок при записи документа.
  3. Режим записи: Используйте Док.Записать(РежимЗаписиДокумента.Запись) для простого сохранения или Док.Записать(РежимЗаписиДокумента.Проведение), если необходимо сразу списать товары со склада.
  4. Работа с табличными частями: При программном добавлении строк в табличную часть Товары, не забудьте вызвать методы пересчета сумм, если они не срабатывают автоматически при записи объекта.

Таким образом, перенос логики с формы на объектный уровень (использование СоздатьДокумент) не только избавит вас от проблем с «несохранением» реквизитов, но и сделает ваше расширение профессиональным, быстрым и надежным инструментом для автоматизации торговых процессов. Для автоматизации без написания кода есть универсальная загрузка из Excel в 1С.

← На главную