Как получить ссылку на документ при выборке из табличных частей в инструменте «Подбор и обработка объектов» ИР?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с мощной подсистемой «Инструменты разработчика» (ИР) автора Сергея Старых (Tormozit) программисты часто используют инструмент «Подбор и обработка объектов» для массового изменения данных. Типичный сценарий: нам необходимо сделать выборку по строкам табличных частей определенных документов (например, найти все строки с определенной номенклатурой), а затем перепровести сами документы-владельцы.

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

---

Решение 1. Прямое обращение к свойству Ссылка в актуальных версиях ИР

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

В современных версиях подсистемы ИР эта проблема полностью устранена. Проанализируем, как устроен доступ к родителю табличной части сейчас:

Таким образом, в актуальной версии ИР мы можем напрямую обратиться к документу-владельцу в произвольном алгоритме следующим образом:


// Получаем ссылку на документ-владелец строки ТЧ
СсылкаНаДокумент = Объект.Ссылка;

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

---

Решение 2. Изменение режима обхода выборки («Строки» против «Объекты»)

Написание собственного кода для получения объекта и его проведения — это рабочий метод, но инструмент «Подбор и обработка объектов» предлагает гораздо более элегантное штатное решение. Перейдем на вкладку «Обработка» и обратим внимание на настройку «Режим обхода выборки данных».

По умолчанию для нессылочных данных (табличных частей и регистров) активен режим «Строки». В этом режиме алгоритм выполняется для каждой строки ТЧ отдельно. Однако мы можем переключить этот режим:

  1. Установим режим обхода выборки в значение «Объекты».
  2. Инструмент ИР автоматически сгруппирует все выбранные строки табличных частей по их уникальным документам-владельцам.
  3. Теперь в произвольный алгоритм вместо строки ТЧ будет передаваться полноценный объект документа (ДокументОбъект) в переменной Объект.

Разберем, как упрощается наш код в произвольном алгоритме при использовании режима «Объекты»:


// Переменная Объект уже является документом-владельцем!
Попытка
    Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    ВызватьИсключение "Ошибка проведения: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;

Важное преимущество: как только мы переключаем режим обхода на «Объекты», в списке стандартных обработок ИР мгновенно становится доступной встроенная обработка «Проведение документов» (а также «Отмена проведения» и «Пометка на удаление»). Нам вообще не нужно писать код — достаточно выбрать эту стандартную обработку, и система сама проведет все документы, к которым относились выбранные строки ТЧ.

---

Решение 3. Связка «Консоль запросов» и «Подбор и обработка объектов»

Рассмотрим еще один профессиональный паттерн работы в ИР, который отлично подходит для работы с большими объемами данных. Если нам нужно выбрать документы по сложному условию в табличных частях, загрузка всех этих строк в интерфейс обработки «Подбор и обработка объектов» может потребовать много оперативной памяти и замедлить работу системы.

Выполним задачу по шагам через Консоль запросов:

  1. Откроем Консоль запросов ИР и напишем запрос, выбирающий ссылки на документы через их табличные части. Используем оператор РАЗЛИЧНЫЕ, чтобы избежать дублирования ссылок:
    
    ВЫБРАТЬ РАЗЛИЧНЫЕ
        ТЧ.Ссылка КАК Ссылка
    ИЗ
        Документ.РеализацияТоваровУслуг.Товары КАК ТЧ
    ГДЕ
        ТЧ.Номенклатура.Услуга = ИСТИНА
    
  2. Выполним запрос в консоли.
  3. На панели результатов консоли запросов найдем специальную кнопку «Передать в подбор и обработку объектов БД».
  4. Выделенные ссылки мгновенно перенесутся в обработку «Подбор и обработка объектов» уже в качестве полноценных ссылок на документы.
  5. В открывшемся окне обработки запускаем стандартное действие проведения документов.

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

---

Рекомендация по обновлению инструментов разработчика

Если в процессе работы с табличными частями вы обнаружили, что свойство Объект.Ссылка вызывает ошибку или отсутствует, это явный признак использования устаревшего релиза подсистемы ИР. Некоторые разработчики умышленно не обновляют ИР, опасаясь проблем совместимости со старыми версиями платформы 1С (например, 8.2 или ранними релизами 8.3).

Опасаться обновлений не стоит. Автор подсистемы Сергей Старых ведет активную поддержку инструментов:

← На главную