Как реализовать автоматическую передачу товаров между организациями при проведении реализации в УТ 11

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

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

Анализируем архитектуру контроля остатков в УТ 11

Для начала проанализируем ситуацию: документ РеализацияТоваровУслуг при проведении выполняет многоуровневую проверку. Разберем по шагам, какие регистры задействованы и почему автор темы столкнулся с путаницей между ними:

  1. Регистр накопления "Товары на складах": Здесь ведется количественный учет в разрезе складов, но без учета организаций. Система проверяет, есть ли товар физически на указанном складе. Если здесь "минус", никакая передача между организациями не поможет — товара физически нет.
  2. Регистр накопления "Товары организаций": Этот регистр отвечает за юридическую принадлежность товара. Именно здесь проверяется остаток по конкретной организации. Если товар на складе есть, но он принадлежит организации "А", а мы продаем от организации "Б", то проверка по этому регистру выдаст ошибку нехватки.
  3. Регистр накопления "Свободные остатки": Данный регистр учитывает резервы по заказам. В нем нет измерения Организация, поэтому использовать его для поиска "донора" при передаче между юрлицами бессмысленно.

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

Типовой механизм Интеркампани — почему это важно

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

Проанализируем алгоритм его работы:

Важный нюанс: В актуальных версиях УТ передача не делается автоматически "секунда в секунду". Это сделано для обеспечения высокой производительности и исключения блокировок.

Техническая реализация поиска остатков для передачи

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


ВЫБРАТЬ
    ТоварыОрганизацийОстатки.Номенклатура КАК Номенклатура,
    ТоварыОрганизацийОстатки.Характеристика КАК Характеристика,
    ТоварыОрганизацийОстатки.Организация КАК ОрганизацияДонор,
    ТоварыОрганизацийОстатки.КоличествоОстаток КАК Остаток
ИЗ
    РегистрНакопления.ТоварыОрганизаций.Остатки(&МоментВремени, 
        Номенклатура В (&СписокНоменклатуры) 
        И Склад = &Склад
        И Организация <> &ОрганизацияПродавец
    ) КАК ТоварыОрганизацийОстатки
ГДЕ
    ТоварыОрганизацийОстатки.КоличествоОстаток > 0

Рассмотрим подробнее этот код: мы обращаемся к виртуальной таблице остатков регистра ТоварыОрганизаций, исключая нашу текущую организацию. Это позволяет найти "доноров".

Проблема взаимных блокировок (Deadlocks)

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

Выясним причину: когда проводится реализация, она блокирует записи в регистре ТоварыОрганизаций. В этот же момент создаваемая передача пытается записать данные в этот же регистр. В многопользовательской среде это приведет к тому, что система будет "зависать" или выдавать ошибку "Конфликт блокировок при выполнении транзакции".

Рекомендуемые пути решения:

  1. Использование механизма "ПослеЗаписи": Вместо модуля объекта используйте обработчики в модуле формы или подписки на события, которые срабатывают после завершения основной транзакции проведения.
  2. Фоновые задания: При проведении реализации записывайте потребность в передаче в некую "очередь" (например, в созданный вами регистр сведений), а фоновое задание раз в минуту будет формировать документы передачи.
  3. Анализ временных таблиц: В модуле менеджера РеализацияТоваровУслуг система подготавливает дерево товаров. Проанализируйте процедуру ЗаполнитьТаблицуТоварыОрганизаций. Это поможет понять, как система сама определяет нехватку перед выводом сообщения пользователю.

Алгоритм разработки автоматического заполнения

Если мы все же создаем документ программно, разберем по шагам, что нужно заполнить в Передаче товаров:

Посмотрим на пример заполнения программно:


НовыйДокумент = Документы.ПередачаТоваровМеждуОрганизациями.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = ОрганизацияДонор;
НовыйДокумент.ОрганизацияПолучатель = ОрганизацияПродавец;
НовыйДокумент.ДистанционнаяПередача = Ложь;

// Заполнение табличной части
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаРеализации.Номенклатура;
НоваяСтрока.Количество = НужноеКоличество;
// Важно: цену нужно получить из правил Интеркампани или прайса
НоваяСтрока.Цена = ЦенообразованиеВызовСервера.ПолучитьЦенуНоменклатуры(...);

НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

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

Проанализировав задачу, мы приходим к выводу, что наиболее правильным и безопасным способом является использование регистра "Товары организаций" для контроля и поиск данных в нем. Однако, внедрение автоматического создания документов в момент проведения реализации требует осторожности из-за транзакционной модели 1С.

Помните: если ваша задача — просто "чтобы проводилось", лучше включить типовой механизм Интеркампани с разрешением отрицательных остатков по организациям. Это избавит вас от необходимости писать сложный код контроля и гарантирует стабильную работу системы без блокировок.

← На главную