База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как сравнить таб. часть док-та с основанием в 1С? › Ответ в теме: Как сравнить таб. часть док-та с основанием в 1С?
Андрей, привет!
Проверить соответствие табличной части документа с табличной частью документа-основания в 1С можно так:
Сначала нужно получить ссылку на документ-основание. Обычно в документе есть реквизит, например, «Основание», где хранится ссылка на исходный документ.
Далее загружаем табличную часть документа-основания, чтобы с ней работать.
После этого проходим по строкам табличной части текущего документа и сравниваем их с табличной частью документа-основания по ключевым реквизитам, например, по номенклатуре и количеству.
Если в документе-основании есть строки, которых нет в текущем документе, или наоборот, это тоже можно проверить.
Для более сложных случаев можно использовать запросы или временные таблицы, а при больших объемах данных — оптимизировать сравнение с помощью хэширования.
В управляемом приложении такую проверку удобно делать при записи документа, чтобы не допустить несоответствий.
Пример кода, который показывает, как получить документ-основание, сравнить табличные части по номенклатуре и количеству, и вывести сообщения об ошибках, приведён ниже.
Основание = Объект.Основание; // ссылка на документ-основание
Если Не ЗначениеЗаполнено(Основание) Тогда
Сообщить("Документ-основание не указан");
Возврат;
КонецЕсли;
Для Каждого Строка Из Объект.Материалы Цикл
НайденаСтрока = Ложь;
Для Каждого СтрокаОснования Из ТЧОснования Цикл
Если Строка.Номенклатура = СтрокаОснования.Номенклатура Тогда
// Можно сравнить количество, цену, сумму и т.д.
Если Строка.Количество = СтрокаОснования.Количество Тогда
НайденаСтрока = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не НайденаСтрока Тогда
Сообщить("Строка с номенклатурой " + Строка.Номенклатура + " не найдена или не соответствует в документе-основании");
// Можно прервать проверку или собрать все ошибки
КонецЕсли;
КонецЦикла;
Процедура ПроверитьСоответствиеСОснованием() Экспорт
Если Не ЗначениеЗаполнено(Объект.Основание) Тогда
Сообщить("Документ-основание не указан");
Возврат;
КонецЕсли;
ТЧОснования = Объект.Основание.Материалы;
Для Каждого Строка Из Объект.Материалы Цикл
НайденаСтрока = Ложь;
Для Каждого СтрокаОснования Из ТЧОснования Цикл
Если Строка.Номенклатура = СтрокаОснования.Номенклатура Тогда
Если Строка.Количество = СтрокаОснования.Количество Тогда
НайденаСтрока = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не НайденаСтрока Тогда
Сообщить("Несоответствие по номенклатуре: " + Строка.Номенклатура + ", количество не совпадает или отсутствует в документе-основании");
// Можно прервать или собрать ошибки
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В общем, алгоритм такой: получить табличную часть документа-основания, пройтись по строкам текущего документа, сравнить ключевые реквизиты и вывести сообщения при несоответствии. Если нужна помощь с конкретным кодом — обращайся.