Как полностью удалить связь документа «Списание товаров» с «Инвентаризацией» и разорвать структуру подчиненности

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

В практике работы с конфигурациями на базе 1С:Бухгалтерия (включая специализированные решения, такие как «1С:Общепит») часто возникает ситуация, когда документ Списание товаров, созданный на основании Инвентаризации товаров, необходимо «отвязать» от родительского документа. Типичная проблема заключается в том, что после ручной очистки реквизитов Документ-основание или Инвентаризация в шапке, связь в дереве «Структура подчиненности» сохраняется, а при перепроведении инвентаризации документ списания автоматически помечается на удаление. Разберем детально, почему это происходит и как правильно решить задачу программно.

Анализ механизма связи в типовых решениях

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

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

Проанализируем фрагмент кода из типового модуля, который отвечает за поиск подчиненных объектов:


Функция ПолучитьСписокПодчиненныхДокументов(ДокументОснование, мКэшПраваДоступа)
    Запрос = Новый Запрос;
    // ... цикл по метаданным критерия отбора СвязанныеДокументы ...
    Для Каждого ЭлементСостава ИЗ Метаданные.КритерииОтбора.СвязанныеДокументы.Состав Цикл
        // Проверка вхождения типа документа-основания в состав
        Если Не ЭлементСостава.Тип.СодержитТип(ТипЗнч(ДокументОснование)) Тогда
            Продолжить;
        КонецЕсли;
        // Формирование динамического запроса к табличным частям
        // ...
    КонецЦикла;
КонецФункции

Как мы видим, система динамически обходит все таблицы. Следовательно, если мы хотим «разорвать» связь, нам нужно очистить данные во всех местах, которые анализирует критерий отбора.

Выясняем причину автоматической пометки на удаление

Многие пользователи сталкиваются с тем, что при изменении Инвентаризации документ Списание товаров внезапно оказывается помеченным на удаление. Это происходит из-за жесткой программной логики. Система пытается синхронизировать результаты инвентаризации с актами списания и оприходования. Рассмотрим алгоритм, заложенный в процедуре ПриЗаписи документа-родителя:

  1. Система получает список всех подчиненных документов через критерий отбора.
  2. Если найден документ типа СписаниеТоваров, программа проверяет, соответствуют ли его данные текущим недостачам в инвентаризации.
  3. Если пользователь вручную изменил товары в списании или если списание больше «не требуется» по результатам новой проверки инвентаризации, программа добавляет ссылку на списание в МассивУдаляемыхДокументов.
  4. Затем выполняется цикл по массиву, где для каждого объекта вызывается ПодчиненныйОбъект.УстановитьПометкуУдаления(Истина).

Важный вывод: пока инвентаризация «видит» документ списания через критерии отбора, она будет пытаться им управлять. Единственный способ прекратить это вмешательство — сделать так, чтобы критерий отбора возвращал пустой результат для данной пары документов.

Пошаговое решение проблемы

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

Шаг 1: Очистка реквизитов шапки. В документе Списание товаров за это обычно отвечают реквизиты ДокументОснование и (специфично для отраслевых решений) ИнвентаризацияТоваровНаСкладе. Установим их в значение Неопределено или пустую ссылку.

Шаг 2: Очистка табличной части. Это самый важный этап, который часто пропускают. В табличной части Товары существует реквизит (часто скрытый на форме), который называется ДокументИнвентаризации. Именно он удерживает связь в 90% случаев.

Рассмотрим пример кода для очистки связей:


// СсылкаНаСписание - это ссылка на документ, который нужно отвязать
ОбъектСписания = СсылкаНаСписание.ПолучитьОбъект();

// 1. Очищаем шапку
ОбъектСписания.ДокументОснование = Неопределено;
// Если есть специфический реквизит для Инвентаризации
Если Метаданные.Документы.СписаниеТоваров.Реквизиты.Найти("ИнвентаризацияТоваровНаСкладе") <> Неопределено Тогда
    ОбъектСписания.ИнвентаризацияТоваровНаСкладе = Документы.ИнвентаризацияТоваровНаСкладе.ПустаяСсылка();
КонецЕсли;

// 2. Проходим по строкам табличной части
Для Каждого СтрокаТовар Из ОбъектСписания.Товары Цикл
    // Проверяем наличие реквизита в строке
    Попытка
        СтрокаТовар.ДокументИнвентаризации = Документы.ИнвентаризацияТоваровНаСкладе.ПустаяСсылка();
    Исключение
        // Если реквизит называется иначе или отсутствует
    КонецПопытки;
КонецЦикла;

// 3. Записываем объект без вызова лишних проверок
ОбъектСписания.ОбменДанными.Загрузка = Истина;
ОбъектСписания.Записать(РежимЗаписиДокумента.Запись);

Нюансы версионирования объектов

Иногда при поиске ссылок на объект (через стандартный поиск ссылок в 1С) программист видит, что на Инвентаризацию всё еще ссылаются «Версии объектов». Это записи в регистре сведений ВерсииОбъектов, где хранится история изменений в формате XML.

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

Рекомендации по работе с «1С:Общепит»

В конфигурации «Общепит» механизм создания документов на основании еще более сложный, так как учитываются отрицательные остатки и специфика списания на расходы. Если вы создали Списание товаров вручную или сильно его модифицировали, старайтесь сразу разрывать связь с инвентаризацией вышеописанным методом. Это предотвратит затирание ваших ручных данных при случайном перепроведении инвентаризации бухгалтером.

Разберем, почему использование ОбменДанными.Загрузка = Истина критично в данном случае. В подписках на события многих конфигураций при записи списания могут срабатывать проверки, которые анализируют основание. Установка этого флага позволяет «тихо» сохранить документ с пустыми реквизитами, гарантируя, что никакая фоновая логика не восстановит связь автоматически.

Таким образом, для полного удаления основания необходимо обеспечить чистоту данных как в заголовке документа, так и в каждой строке его номенклатурного состава. После выполнения этих шагов документ Списание товаров станет полностью независимым объектом учета.

← На главную