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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как сравнить таб. часть док-та с основанием в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35540
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        как проверить соответствие табличной части документа с документом-основания

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

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

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

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

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

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

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

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

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

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

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

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

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С