При работе с мощной подсистемой «Инструменты разработчика» (ИР) автора Сергея Старых (Tormozit) программисты часто используют инструмент «Подбор и обработка объектов» для массового изменения данных. Типичный сценарий: нам необходимо сделать выборку по строкам табличных частей определенных документов (например, найти все строки с определенной номенклатурой), а затем перепровести сами документы-владельцы.
Однако при работе с табличными частями (особенно в многотабличном режиме) разработчики часто сталкиваются с проблемой: переменная Объект в произвольном алгоритме представляет собой строку табличной части, и у нее на первый взгляд отсутствует привычное свойство Ссылка. В этой статье мы подробно разберем, как получить ссылку на документ-владелец, рассмотрим правильные настройки режимов обхода выборки и выясним, как автоматизировать этот процесс вообще без написания кода.
---
Если мы используем устаревшую версию инструментов разработчика, строки табличных частей при выборке могут выгружаться во временную таблицу значений на клиенте. Строка обычной таблицы значений действительно не имеет встроенного свойства Ссылка, из-за чего разработчикам приходилось вручную добавлять колонку ссылки в запрос компоновщика.
В современных версиях подсистемы ИР эта проблема полностью устранена. Проанализируем, как устроен доступ к родителю табличной части сейчас:
Объект в контексте произвольного алгоритма для ТЧ теперь представляет собой специальную обертку над объектом строки табличной части (ТабличнаяЧастьСтрока).Ссылка, которое всегда возвращает ссылку на документ-владелец.Таким образом, в актуальной версии ИР мы можем напрямую обратиться к документу-владельцу в произвольном алгоритме следующим образом:
// Получаем ссылку на документ-владелец строки ТЧ
СсылкаНаДокумент = Объект.Ссылка;
// Получаем объект документа для последующего проведения
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Если ДокументОбъект <> Неопределено Тогда
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Не удалось провести документ: " + СсылкаНаДокумент + " - " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
---
Написание собственного кода для получения объекта и его проведения — это рабочий метод, но инструмент «Подбор и обработка объектов» предлагает гораздо более элегантное штатное решение. Перейдем на вкладку «Обработка» и обратим внимание на настройку «Режим обхода выборки данных».
По умолчанию для нессылочных данных (табличных частей и регистров) активен режим «Строки». В этом режиме алгоритм выполняется для каждой строки ТЧ отдельно. Однако мы можем переключить этот режим:
ДокументОбъект) в переменной Объект.Разберем, как упрощается наш код в произвольном алгоритме при использовании режима «Объекты»:
// Переменная Объект уже является документом-владельцем!
Попытка
Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ВызватьИсключение "Ошибка проведения: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Важное преимущество: как только мы переключаем режим обхода на «Объекты», в списке стандартных обработок ИР мгновенно становится доступной встроенная обработка «Проведение документов» (а также «Отмена проведения» и «Пометка на удаление»). Нам вообще не нужно писать код — достаточно выбрать эту стандартную обработку, и система сама проведет все документы, к которым относились выбранные строки ТЧ.
---
Рассмотрим еще один профессиональный паттерн работы в ИР, который отлично подходит для работы с большими объемами данных. Если нам нужно выбрать документы по сложному условию в табличных частях, загрузка всех этих строк в интерфейс обработки «Подбор и обработка объектов» может потребовать много оперативной памяти и замедлить работу системы.
Выполним задачу по шагам через Консоль запросов:
РАЗЛИЧНЫЕ, чтобы избежать дублирования ссылок:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ТЧ.Ссылка КАК Ссылка
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК ТЧ
ГДЕ
ТЧ.Номенклатура.Услуга = ИСТИНА
Этот способ является наиболее производительным, так как мы полностью исключаем промежуточную обработку строк табличных частей в памяти клиента и сразу оперируем ссылками на объекты.
---
Если в процессе работы с табличными частями вы обнаружили, что свойство Объект.Ссылка вызывает ошибку или отсутствует, это явный признак использования устаревшего релиза подсистемы ИР. Некоторые разработчики умышленно не обновляют ИР, опасаясь проблем совместимости со старыми версиями платформы 1С (например, 8.2 или ранними релизами 8.3).
Опасаться обновлений не стоит. Автор подсистемы Сергей Старых ведет активную поддержку инструментов:
ирПортативный.epf), который сохраняет обратную совместимость.