Как программно добавить позиции в Заказ клиента и Реализацию в УТ 11.3 и избежать ошибок проведения

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

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

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

В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) связь между заказом-распоряжением и документом отгрузки строится не только по ссылке на документ, но и на уровне конкретных строк табличной части. Если вы просто добавите новую строку в таблицу Товары обоих документов, система воспримет их как независимые позиции. Проанализируем типичные ошибки:

  1. «Оформлено больше чем указано в распоряжении» — возникает при проведении Реализации. Система считает, что новая строка в реализации не имеет «основания» в заказе.
  2. «Заказ отгружен не полностью. Закрытие заказа возможно только с полностью отгруженными строками» — возникает при попытке провести Заказ клиента в статусе Закрыт или с установленными флагами отмены/отгрузки. Система «видит» новую строку в заказе, но не «видит» ее фактической отгрузки в регистрах.

Для решения этих проблем нам необходимо разобраться с двумя ключевыми механизмами: техническим полем КлючСвязи и статусом ВариантОбеспечения.

Решение 1: Механизм «Ключ связи»

Рассмотрим основной технический параметр сопоставления строк. Поле КлючСвязи — это числовой идентификатор, который связывает строку в заказе со строкой в реализации. В одном заказе может быть несколько строк с одной и той же номенклатурой (например, разные характеристики или склады), и именно КлючСвязи позволяет системе понять, какая строка реализации закрывает конкретную строку заказа.

Разберем по шагам алгоритм программного добавления:

  1. Найдем максимальный существующий КлючСвязи в табличной части Товары документа Заказ клиента.
  2. Создадим новую строку в заказе и присвоим ей КлючСвязи = МаксКлюч + 1.
  3. При создании строки в Реализации товаров и услуг обязательно укажем тот же самый КлючСвязи, который мы присвоили строке в заказе.

Пример программной реализации логики поиска и установки ключа:


// Получаем объект заказа
ЗаказОбъект = СсылкаНаЗаказ.ПолучитьОбъект();

// Определяем новый КлючСвязи
МаксКлюч = 0;
Для Каждого СтрокаТЧ Из ЗаказОбъект.Товары Цикл
    МаксКлюч = Макс(МаксКлюч, СтрокаТЧ.КлючСвязи);
КонецЦикла;
НовыйКлюч = МаксКлюч + 1;

// Добавляем строку в Заказ
НоваяСтрокаЗаказа = ЗаказОбъект.Товары.Добавить();
НоваяСтрокаЗаказа.Номенклатура = ВыбранныйТовар;
НоваяСтрокаЗаказа.Количество = 10;
НоваяСтрокаЗаказа.КлючСвязи = НовыйКлюч;
// Обязательно устанавливаем вариант обеспечения!
НоваяСтрокаЗаказа.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Отгрузить;

ЗаказОбъект.Записать(РежимЗаписиДокумента.Проведение);

// Теперь добавляем в Реализацию
РеализацияОбъект = СсылкаНаРеализацию.ПолучитьОбъект();
НоваяСтрокаРТУ = РеализацияОбъект.Товары.Добавить();
НоваяСтрокаРТУ.Номенклатура = ВыбранныйТовар;
НоваяСтрокаРТУ.Количество = 10;
НоваяСтрокаРТУ.КлючСвязи = НовыйКлюч; // Ключ должен совпадать!
НоваяСтрокаРТУ.ЗаказКлиента = СсылкаНаЗаказ;

РеализацияОбъект.Записать(РежимЗаписиДокумента.Проведение);

Решение 2: Настройка вариантов обеспечения

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

Проанализируем ситуацию: если программно добавить строку и оставить её в статусе «К обеспечению» или «Резервировать», то проведение Реализации по этой строке будет заблокировано контролем остатков распоряжений. Система считает, что товар еще не готов к отгрузке.

Для корректной работы необходимо всегда устанавливать значение Перечисления.ВариантыОбеспечения.Отгрузить для добавляемых строк, которые мы планируем сразу включить в реализацию.

Решение 3: Работа со статусами документа и закрытыми строками

Если заказ уже имеет статус Закрыт, прямое добавление строк и проведение приведет к ошибке, так как система проверяет полноту отгрузки по всем строкам документа. Рассмотрим правильную последовательность действий в этом случае:

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

Важные технические нюансы и типовые процедуры

Посмотрим на ситуацию с точки зрения использования встроенных механизмов типовой конфигурации. В УТ 11 простого заполнения ТЧ иногда недостаточно из-за наличия скрытых реквизитов (например, ИдентификаторСтроки).

Проанализируем необходимость вызова серверных процедур из модулей менеджера. Мы рекомендуем после программного изменения состава табличной части вызывать стандартные обработчики пересчета, чтобы заполнить зависимые реквизиты (цены, суммы, налоги):


// Пример вызова пересчета в УТ 11
СтруктураПересчета = ПродажиСервер.ПараметрыПересчетаТЧ();
ПродажиСервер.ПересчитатьСтрокуТЧ(НоваяСтрокаЗаказа, СтруктураПересчета);

Также обратите внимание на регистр накопления РаспределенияЗапасов. При программном изменении заказов в последних версиях УТ 11/ERP может потребоваться обновление этого регистра. Обычно это происходит автоматически при проведении, но если вы сталкиваетесь со странным поведением резервов, проверьте заполнение реквизита Склад в строках табличной части — он должен совпадать в обоих документах.

Резюмируем: Для успешного программного добавления позиций в связку «Заказ — Реализация» критически важно соблюдать идентичность КлючСвязи, устанавливать ВариантОбеспечения в значение «Отгрузить» и соблюдать строгую последовательность проведения документов (сначала распоряжение, затем реализация).

← На главную