При разработке механизмов автоматического заполнения документов в 1С часто возникают задачи, где данные, полученные из запроса, необходимо сопоставить с уже существующими строками табличной части (ТЧ), даже если у них нет общих полей для объединения. Рассмотрим, как подойти к решению этой нетривиальной задачи, учитывая методологические риски и технические возможности платформы.
Прежде чем приступать к написанию кода, важно осознать, что автоматическое обновление данных без уникального ключа связи (например, Номенклатура или Артикул) является потенциально опасной операцией. Если бухгалтерия ставит задачу «обновить цены в ТЧ, чтобы они не превышали цены из запроса», необходимо уточнить:
Рекомендуется всегда сохранять исходные данные, например, добавив временные реквизиты в табличную часть, чтобы иметь возможность сравнить старые и новые значения перед окончательным проведением документа.
Поскольку явной связи между строками ТЧ и строками запроса нет, самым надежным способом будет «построчный» обход табличной части. Рассмотрим алгоритм действий:
Для начала выгрузим результат выполнения запроса в ТаблицаЗначений. Это позволит нам эффективно работать с данными в оперативной памяти.
// Выполняем запрос
РезультатЗапроса = Запрос.Выполнить();
ТЗРезультат = РезультатЗапроса.Выгрузить();
// Обходим табличную часть документа
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
// Ищем подходящую строку в ТЗ результата
// Предположим, мы ищем цену, которая не превышает цену из запроса
СтруктураПоиска = Новый Структура;
// Здесь логика может быть сложнее, используем метод НайтиСтроки
МассивНайденных = ТЗРезультат.НайтиСтроки(Новый Структура("Цена", СтрокаТЧ.Цена));
Если МассивНайденных.Количество() > 0 Тогда
СтрокаТЧ.Цена = МассивНайденных[0].Цена;
СтрокаТЧ.Склад = МассивНайденных[0].Склад;
КонецЕсли;
КонецЦикла;
Если задача требует «построчного» соответствия (первая строка ТЧ = первая строка запроса), помните, что АВТОНОМЕРЗАПИСИ в запросе не гарантирует стабильного порядка. Чтобы исключить случайности, всегда используйте явную сортировку в тексте запроса:
ВЫБРАТЬ
Т.Цена,
Т.Склад
ИЗ
ВременнаяТаблица КАК Т
УПОРЯДОЧИТЬ ПО
Т.Цена УБЫВ,
Т.Склад ВОЗР
После того как данные в ТаблицаЗначений отсортированы, вы можете обращаться к строкам по индексу, используя свойство НомерСтроки объекта табличной части.
При реализации подобных механизмов придерживайтесь следующих правил:
НайтиСтроки по специфическим критериям).В завершение, проанализируем ситуацию: если бизнес не может четко сформулировать, почему связь отсутствует, это сигнализирует о необходимости внедрения более строгих регламентов учета. Автоматизация процесса «неизвестно как» всегда будет приводить к ошибкам, поэтому использование временных таблиц для сопоставления и тщательное логирование изменений являются обязательными компонентами надежного решения.