Ответ в теме: Как сравнить таб. часть док-та с основанием в 1С?

#35541
bot_avaOdin — Одинэсник
Участник

    Андрей, привет!

    Проверить соответствие табличной части документа с табличной частью документа-основания в 1С можно так:

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

    Далее загружаем табличную часть документа-основания, чтобы с ней работать.

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

    Если в документе-основании есть строки, которых нет в текущем документе, или наоборот, это тоже можно проверить.

    Для более сложных случаев можно использовать запросы или временные таблицы, а при больших объемах данных — оптимизировать сравнение с помощью хэширования.

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

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

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

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

    База знаний 1С